4

C++ の学習に使用している本のコードで実際に何が起こっているのか理解できません。コードは次のとおりです。

class Base
{
    public:
        Base() {};
        virtual ~Base() {};

        virtual Base* Clone() {return new Base(*this);}
};

class Derived
{
    public:
        Derived() {};
        virtual ~Derived() {};

        virtual Base* Clone() {return new Derived(*this);}
};

したがって、このClone()関数では、関数が Base クラス オブジェクトへのポインターを返すことがわかります。私が理解していないのは、その関数内で何が起こっているかです。以前にnewas を使用したとき、基本的に整数用のフリー ストアに十分なメモリを割り当ててから、そのアドレスを返し、そのアドレスを pointer に適用するというint *pInt = new int印象を受けました。同じロジックで、コードの一部を理解しようとしています。したがって、Derived クラス オブジェクトのフリー ストアに十分なメモリを割り当て、アドレスを返していると思います。アドレスは関数によって返されます。newpIntnew Derived(*this)Clone()

しかし、それがコンストラクターである場合、なぜ*thisコンストラクターを通過するのでしょうか? *this複製されているオブジェクトのアドレスを渡すことを意味することは理解していますが、関数のコンテキストでの構文はわかりませclass_name(address_of_an_object)new

誰かがその部分で何が起こっているのか説明してもらえますか?

前もって感謝します。

4

1 に答える 1

10

誤解はここにあります:

*this複製されているオブジェクトのアドレスを渡すことを意味します

実際にthisは、 は複製されるオブジェクトのアドレスですが、*this(アスタリスクに注意してください) はそのアドレスを逆参照した結果です。*thisタイプもそうです。これはDerived &、複製されるオブジェクトへの参照であり、そのアドレスではありません。

したがって、呼び出しnew Derived(*this)は、スペースを動的に割り当てた後 (これがnew行うことです)、新しいスペースがコピー コンストラクターによって初期化されることを意味しDerived(const Derived &)ます。コピーコンストラクタが使用されます。


のセマンティクスを明確にするにはnew:Cがクラスの場合、

new C;

型のオブジェクトに十分なスペースを割り当てC、コンストラクターを呼び出してCそのスペースを初期化します。これは のセマンティクスの一部ですnew。常にコンストラクターを呼び出して、新しく割り当てられたスペースを初期化します。

電話すると

new C(a,b,c);

いくつかの引数a,bおよびを指定するとc、これら 3 つの引数を取るnewのコンストラクターが呼び出されます。Cそのようなコンストラクターが定義されていない場合は、コンパイラ エラーが発生します。

今、あなたが呼び出す特別なケースで

new C(a);

aそれ自体が typeC&である引数を指定するnewと、いつものように、適切なコンストラクターが呼び出されます。適切なコンストラクターは、C(C &)(定義されている場合) またはC(const C&)(コンパイラーによって自動定義されたコピー コンストラクター) のいずれかです。

于 2013-02-06T01:36:45.157 に答える