六種構造函數的實現代碼如下:
#includeusing namespace std; //c++中六種默認的構造函數 class Test { public: Test(int d = 0):m_data(d)//1構造函數(帶默認值0),以參數列表的形式初始化 { cout<<"Creat Test Obj :"<
情況一:
//1 Test fun(Test t) { int value = t.GetData(); Test tmp(value); return tmp; } int main() { Test t(10); Test t1; t1 = fun(t); return 0; }
情況二:
//2 Test fun(Test t) { int value = t.GetData(); return Test(value); } int main() { Test t(10); Test t1; t1 = fun(t); return 0; }
情況三:
//3 Test fun(Test &t) { int value = t.GetData(); Test tmp(value); return tmp; } int main() { Test t(10); Test t1; t1 = fun(t); return 0; }
情況四:
//4 Test fun(Test &t) { int value = t.GetData(); return Test(value); } void main() { Test t(10); Test t1; t1 = fun(t); }
情況五:
//5 Test& fun(Test &t) { int value = t.GetData(); Test tmp(value); return tmp; } void main() { Test t(10); Test t1; t1 = fun(t); }
情況六:
//6 Test& fun(Test &t) { int value = t.GetData(); return Test(value); } void main() { Test t(10); Test t1; t1 = fun(t); }
情況七:
//7 Test fun(Test &t) { int value = t.GetData(); return Test(value); } void main() { Test t(10); Test t1 = fun(t); }
情況八:
//8 Test fun(Test &t) { int value = t.GetData(); Test tmp(value); return tmp; } void main() { Test t(10); Test t1 = fun(t); }
情況九:
Test& fun(Test &t) { int value = t.GetData(); Test tmp(value); return tmp; } void main() { Test t(10); Test t1; t1 = fun(t); }
綜上所述:
一:調用拷貝構造函數的情況:
1)直接用對象初始化對象
2)形參數對象時,用實參對象初始化
3)函數的返回值類型是類時(非引用)是,拷貝構造無名的臨時空間作為函數返回值
二:注意:
當函數的返回值是該函數中的一個臨時對象時,函數類型不可以定義為Test &即引用,否則會發生,用一個已經析構的臨時對象初始化另外一個對象,會發生錯誤;
三:提高效率的方式:
1)形參用引用,不再調用拷貝構造函數
2)返回一個無名的臨時對象a,系統不再創建另外的一個臨時對象而直接將a作為返回值,(函數返回類型不是引用)
3)返回無名的臨時對象,且用它初始化另外一個對象,如情況七,直接將無名的對象作為另外的一個對象
4)上述三種情況結合;