考慮下面的代碼的返回值初始化的對象時不叫:複製構造與功能
#include <iostream>
using namespace std;
class A
{
public:
int a;
A(): a(5)
{
cout << "Constructor\n";
}
A(const A &b)
{
a = b.a;
cout << "Copy Constructor\n";
}
A fun(A a)
{
return a;
}
};
int main()
{
A a, c;
A b = a.fun(c);
return 0;
}
上面的代碼的與g++ file.cpp
的輸出是:
Constructor
Constructor
Copy Constructor
Copy Constructor
的輸出以上代碼與g++ -fno-elide-constructors file.cpp
是:
Constructor
Constructor
Copy Constructor
Copy Constructor
Copy Constructor
我知道返回值優化通貨膨脹。我的問題是哪個調用複製構造函數是被忽略的(返回期間的臨時對象還是返回的對象被複制到b)?
如果消失的拷貝構造函數是用於創建b的拷貝構造函數,那麼b是如何創建的(因爲在這種情況下也沒有構造函數調用)?
如果我將A b = a.fun(c);
行替換爲a.fun(c)
並使用第一種方法甚至第二種方法進行編譯,那麼複製構造函數也會被調用2次。所以,如果在上一段中解釋過的情況下,臨時對象的拷貝構造函數被省略了,那麼爲什麼在這種情況下它不被忽略?
我怎麼在我瞭解到這一切時檢查了這些東西,所有東西都是'std :: cout <<「複製構造函數:」<<(void *)b <<「to」<<(void *)this << std :: endl;' ,和'std :: cout <<「構造」<<(void *)this << std :: endl'。如果你在C++中添加移動,獎勵點數11。 – IdeaHat 2014-11-14 19:20:39