2012-08-10 27 views
-2

考虑贝罗代码片段:new操作符不调用构造函数

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; 
} 

我收到output为:

Constructor 
Inside new 
Copy constructor 

我一直听到的是第一家运营商新的分配void类型&的一大块,然后新运算符调用构造函数将该块转换为LHS中的精确类型。
那么,为什么构造函数没有被调用语句2?

我也想知道由C++编译器的说明2.

+2

你希望调用哪个构造函数?默认的? 'Clone'调用复制构造函数,因为你通过'* this'作为参数..我错过了什么吗? – 2012-08-10 22:48:51

回答

7

那么,为什么构造函数是没有得到所谓的声明2所进行的确切一系列行动?

它是。你认为"Copy constructor"从哪里来?

Base b1; 

输出:Constructor

Base* ptr=b1.Clone(); 

电话

new Base(*this); 

,后者又调用您的operator new,然后你的拷贝构造函数。

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++中。

相关问题