我在理解C++複製構造函數時遇到了一些問題,希望有人能幫助我。複製構造函數 - 理解問題
據我所知,當一個函數返回一個類的實例時,複製構造函數被調用(除其他外)。
#include <iostream>
using namespace std;
class Test
{
int a;
public:
Test(int a) : a(42)
{}
// Copy constructor
Test(const Test& other)
{
cout << "copy constructor" << endl;
}
};
Test test_function()
{
Test a(3);
return a;
}
int main()
{
test_function();
return 0;
}
因此,如果我執行此代碼,複製構造函數永遠不會被調用?爲什麼?哪個對象比返回?
而且,如果我更換線
test_function();
到
Test b = test_function();
拷貝構造函數既不是所謂的 - 爲什麼不呢?
在此先感謝
編輯: 當改變功能:
Test test_function()
{
Test a(3);
Test b(34);
if (4 < 2)
return a;
else
return b;
}
可以看到拷貝構造函數的調用,因爲編譯器不能使用靜脈阻塞。
這是一個名爲「命名返回值優化」(簡稱NRVO)的優化。 –
在這個例子中有一個單獨的Test對象,爲了看到copyconstructors的行爲,你至少需要2個對象。像測試b = test_function() –
編譯器正確地觀察到您不使用返回的值(在任何情況下)都會優化副本。複製elision是唯一可以改變程序可觀察行爲的優化。 – jrok