2012-08-10 49 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++中。

相關問題