-2

beloコードスニペットについて考えてみましょう。

class Base
{
    public:
    Base()
    {
            cout<<"Constructor"<<endl;
    }
    Base(const Base& rhs)
    {
            cout<<"Copy constructor"<<endl;
    }
    Base* Clone()
    {
            return new Base(*this); <--------------- 2
    }
    void* operator new(size_t size)
    {
            void* p=malloc(size);
            cout<<"Inside new"<<endl;
            return p;
    }
};

int main()
{
    Base b1; <------------ 1
    Base* ptr=b1.Clone();
    return 0;
}

私は次のように出力を取得しています:

Constructor
Inside new
Copy constructor  

最初の演算子newがvoid型のチャ​​ンクを割り当て、次にnew演算子がコンストラクターを呼び出して、そのチャンクをLHSのチャンクとまったく同じ型に変換することを聞き続けました。
では、なぜコンストラクターがステートメント2に対して呼び出されないのでしょうか。

また、ステートメント2に対してC++コンパイラーによって実行される一連の正確なアクションについても知りたいと思います。

4

2 に答える 2

7

では、なぜコンストラクターがステートメント2に対して呼び出されないのでしょうか。

です。どこから来たと思います"Copy constructor"か?

Base b1;

出力:Constructor

Base* ptr=b1.Clone();

呼び出し

new Base(*this);

operator new次に、コピーコンストラクターを呼び出します。

于 2012-08-10T22:48:58.190 に答える
0

の実装は、次のT * p = new T(a, b, c); delete p;シーケンスと道徳的に同等です。

void * const addr = operator new(sizeof T);   // either global or in T

T * p = new (addr) T(a, b, c);                // ditto

p->~T();

operator delete(addr);                        // ditto

つまり、C++ では、メモリ割り当てとオブジェクト構築は 2 つの異なる概念です。

于 2012-08-11T00:20:25.140 に答える