2013-01-07 185 views
0

我有疑問,在下面的代碼段。函數fun1fun2都是相同的。在一個我聲明瞭一個局部變量,而在另一個變量是由參數傳遞。那麼爲什麼在fun1的情況下複製構造函數不會被調用。局部變量和變量傳遞作爲參數

#include<stdio.h> 
#include<iostream> 
using namespace std; 
class A 
{ 
    public: 
A() 
{ 
    printf("constructor\n"); 
} 
A(const A&) 
{ 
    printf("copy cons\n"); 
} 
~A() 
{ 
    printf("destructor\n"); 
} 
}; 
A fun1() 
{ 
A obj; 
return obj; 
} 
A fun2(A obj) 
{ 
return obj; 
} 

int main() 
{ 
    A a=fun1(); 
    printf("after fun1\n"); 
    A b; 
    A c = fun2(b); 
} 

輸出

constructor 
after fun1 
constructor 
copy cons 
copy cons 
destructor 
destructor 
destructor 
destructor 
+0

其方式C++的設計!的 –

+0

可能重複[什麼是複製省略和返回值優化?(http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) –

回答

1

因爲Named Return Value Optimization的,這是一個optimziation編譯器執行您的代碼。它承認一個事實,即功能FUN1()的返回類型是FUN1中的臨時對象相同的()(A型),所以它不創建一個副本(不調用拷貝構造函數)返回聲明。

您可以嘗試編譯代碼without optimization,看看拷貝構造函數被調用即可。如果您使用的是gcc編譯器,則關閉優化的編譯器標誌爲「-O0」。

1

那麼爲什麼在FUN1的情況下拷貝構造函數不叫?

如果A有可訪問的副本或移動構造函數,編譯器可以選擇刪除副本。這就是所謂的(命名的)返回值優化((N)RVO)