#include <iostream> using namespace std; class MyClass { public: MyClass(); MyClass(int i); MyClass(const MyClass &c); ~MyClass(); //後面main中測試發現func1 和func2以後沒有調用拷貝構造,應該是被優化了 MyClass func1(int i){ cout<<"func1"<<endl; return MyClass(0); } MyClass func2(int i){ MyClass a; cout<<"func2"<<endl; return a; } private: int m_i; }; MyClass::MyClass() { m_i = 0; cout << "MyClass()" << endl; } MyClass::MyClass(int i) { m_i = i; cout << "MyClass(int i)" << endl; } MyClass::MyClass(const MyClass &c) { m_i = c.m_i; cout << "MyClass(const MyClass &c)" << endl; } //這裏調用了兩次拷貝構造函數&c MyClass test(const MyClass c) { cout << "test" << endl; return c; } MyClass::~MyClass() { cout<<"~"<<endl; } int main() { MyClass c2; cout << "-------------------------------" << endl; MyClass c1=c2.func2(2); cout << "-------------------------------" << endl; MyClass c3=test(c2); cout << "-------------------------------" << endl; return 0; } //結果以下 MyClass() ------------------------------- func1 MyClass(int i) ------------------------------- MyClass() func2 ------------------------------- MyClass(const MyClass &c) test MyClass(const MyClass &c) ~ -------------------------------
擴展html
將拷貝構造函數聲明爲explicit,則會阻止隱式拷貝構造函數的調用.隱式拷貝構造函數的調用主要發生在三個點:ios
1.一個對象做爲函數參數,以值傳遞的方式傳入函數體.函數
2.一個對象做爲函數返回值,以值傳遞的方式從函數返回.測試
3.以AAA = xxx的方式建立對象AAA,xxx爲與AAA爲同類型的對象.優化
於是,將拷貝構造函數聲明成explicit並非良好的設計,通常只將有單個參數的constructor聲明爲explicit,而copy constructor不要聲明爲explicit.spa
參考http://www.cnblogs.com/dwdxdy/archive/2012/07/17/2595479.html設計