調用復制構造函數的三種情況:
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