同一個類的對象在內(nèi)存中有完全相同的結(jié)構(gòu),如果作為一個整體進行復(fù)制或稱拷貝是完全可行的。這個拷貝過程只需要拷貝數(shù)據(jù)成員,而函數(shù)成員是共用的(只有一份拷貝)。在建立對象時可用同一類的另一個對象來初始化該對象,這時所用的構(gòu)造函數(shù)稱為拷貝構(gòu)造函數(shù)(Copy Constructor)。
int main(){ Test t1(10); Test t(t1); //調(diào)用拷貝構(gòu)造函數(shù) Test t2 = t1; //調(diào)動拷貝構(gòu)造函數(shù)}1.調(diào)動拷貝構(gòu)造函數(shù)的情況 (1)對象初始化對象調(diào)動拷貝構(gòu)造函數(shù)
區(qū)別初始化與賦值
Test t(10);Test t1;t1 = t; //賦值Test t2(t);//初始化Test t3 = t;//初始化另外兩種情況 (2)當(dāng)函數(shù)的形參是類的對象,調(diào)用函數(shù)時,進行形參與實參結(jié)合時使用。這時要在內(nèi)存新建立一個局部對象,并把實參拷貝到新的對象中。
void fun(Test t){}(3)當(dāng)函數(shù)的返回值是類對象,函數(shù)執(zhí)行完成返回調(diào)用者時使用。理由也是要建立一個臨時對象中,再返回調(diào)用者。
Test fun(){ Test t; return t;}因為局部對象在離開建立它的函數(shù)時就消亡了,不可能在返回調(diào)用函數(shù)后繼續(xù)生存,所以在處理這種情況時,編譯系統(tǒng)會在調(diào)用函數(shù)的表達式中創(chuàng)建一個無名臨時對象,該臨時對象的生存周期只在函數(shù)調(diào)用處的表達式中。所謂return 對象,實際上是調(diào)用拷貝構(gòu)造函數(shù)把該對象的值拷入臨時對象(對象初始化對象),最終返回的是臨時對象。如果返回的是變量,處理過程類似,只是不調(diào)用構(gòu)造函數(shù)。
這三種情況無疑都是對象初始化對象而已.
2.拷貝構(gòu)造函數(shù)的參數(shù)–采用常引用
//拷貝構(gòu)造函數(shù)的一般形式Test(const Test &t){ data = t.data;}(1)為什么采用引用傳遞參數(shù) 如果把一個真實的類對象作為參數(shù)傳遞到拷貝構(gòu)造函數(shù),此時,參數(shù)表里又是用對象初始化對象,調(diào)動拷貝構(gòu)造函數(shù)。如此往復(fù),造成無限遞歸。 如下圖:
(2)為什么是常引用 常引用就使得被拷貝的類對象不能被隨意修改,保證信息不被丟失。當(dāng)然,你可以不用引用。
3.默認拷貝構(gòu)造函數(shù)的功能 將對應(yīng)的成員值進行拷貝
t1 tdata<---data新聞熱點
疑難解答