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