-2

考虑下面的代码片段:

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  

我一直听说,第一个 operator new 分配了一块 void 类型,然后 new 运算符调用构造函数将该块转换为与 LHS 上的确切类型相同的类型。
那么,为什么没有为语句 2 调用构造函数呢?

我还想知道 C++ 编译器对语句 2 执行的确切操作系列。

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++ 中两个不同的概念。

于 2012-08-11T00:20:25.140 回答