2012-08-14 85 views

回答

8

的首先調用複製構造,與臨時對象作爲參數 - MyClass()創建臨時。

第二個調用默認構造函數。

實際上,在大多數情況下,它們都是針對相同的代碼進行優化的,但這是語義上的差異。


作爲Negal提到的,情況是POD類型有些不同;當「MyClass」是POD時,第二個片段不會初始化mc,而第一個將會。

+0

+ 1說臨時事情。 – 2012-08-14 11:38:46

+4

儘管兩種情況都被優化爲相同的東西,但結果不同時至少有一種情況。如果'MyClass'是一個POD(普通舊數據)類型,'mC'是局部變量時'MyClass mc'不會導致'mc'被值初始化。第二種方法將創建一個初始化臨時值並用它初始化'mc'。 – 2012-08-14 11:46:37

+0

好點,而且它們是否被優化爲相同的事情取決於默認構造函數和複製構造函數中的內容。 – 2012-08-14 11:49:03

1

自定義拷貝構造函數和默認構造函數。

+1

'operator ='不在這裏調用。 – 2012-08-14 11:38:38

+0

好的。謝謝 。對不起, – 2012-08-14 11:39:22

0

首先通過c-tor without arguments創建temp-object,然後調用copy-ctor作爲對象(不考慮任何優化)。第二個電話c-tor without arguments,沒有複製。通過編譯器優化,兩種情況都是相同的。

差異是在基本類型,所以

// initialized to something 
int c; 
// initialized to int() that is 0 by standard. 
int c = int(); 
2

第一個是複製初始化,第二個是默認初始化。

例如,下面的代碼不會編譯:

class MyC 
{ 
public: 
MyC(){} 
private: 
MyC(const MyC&) {} 
}; 

int main() 
{ 
    MyC myc = MyC(); 
    return 0; 
} 
+0

這確實顯示了區別。如果拷貝構造函數是私有的,那麼一個是合法的,另一個不是。 – 2012-08-14 11:40:09

-3

沒有差別。默認ctor呼叫。語法糖) no copy ctor !!!!

class PPP{ 
public: 
    PPP(PPP&){ 
     std::cout<<"PPP1"<<std::endl; 
    } 
    PPP(const PPP&){ 
     std::cout<<"PPP2"<<std::endl; 
    } 
    PPP(){ 
     std::cout<<"PPP3"<<std::endl; 
    } 
}; 
PPP ppp = PPP(); 

並且您在控制檯中只能找到PPP。

+0

打印相同,你如何理解哪個構造函數被調用?此外,這可能會被編譯器優化,關閉任何優化選項(-O0),然後再次嘗試:) – 2012-08-14 11:44:51

+0

僅打印PPP一次))不在def和copy ctors中)。沒有優化)/ od – kain64b 2012-08-14 11:46:42

+0

和你可以測試的源代碼:PPP ppp = PPP(); PPP ppp1 = ppp;只在2級的時候複製) – kain64b 2012-08-14 11:53:07

相關問題