調用復制構造函數的三種情況:
1.當用類一個對象去初始化另一個對象時。
2.如果函數形參是類對象。
3.如果函數返回值是類對象,函數執行完成返回調用時。
#include <iostream>
using namespace std;
class Test{
public:
Test(){ }
//復制構造函數
Test(const Test &t) {cout<< 1;}
};
//傳參是對象的引用,不調用復制構造函數。
//傳參是對象,調用復制構造函數。
Test fun1(Test &u)
{
Test t=u; //初始化時用=號,就是Test t(u); 調用復制構造函數。而在賦值語句中的=號,不調用。像 Test x,y; x=y;
return t; //返回值是對象,調用復制構造函數
}
Test& fun2(Test &u)
{
Test t=u;
return t; //返回值是對象的引用,不調用復制構造函數
}
Test fun3(Test u)
{
Test t=u;
return t; //返回值是對象,調用復制構造函數
}
int main()
{
Test x,y;
x=fun1(y);
cout<< "\n---------------\n";
x=fun2(y);
cout<< "\n---------------\n";
x=fun3(y);
cout<<endl;
return 0;
}
vc6.0下的結果:

VS2013下的結果:

CodeBlock下的結果:(據說是gcc編譯器把函數返回對象給優化了)就像 return Complex(2, 4); 優化了

------------------------------------------------------------------------------------------------------------------
可以參考:https://blog.csdn.net/sxhelijian/article/details/50977946
