拷貝構(gòu)造函數(shù):
1.定義:只有單個(gè)形參,而且該形參必須是本類對(duì)象的const引用(請(qǐng)思考為什么?),它是特殊的構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí)使用已經(jīng)存在的同類對(duì)象來(lái)進(jìn)行初始化,由編譯器自動(dòng)調(diào)用。2.特征:1)它是構(gòu)造函數(shù)的重載2)如果沒(méi)有顯式定義,系統(tǒng)會(huì)自動(dòng)合成一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù),默認(rèn)的構(gòu)造函數(shù)會(huì)將其參數(shù)的成員逐個(gè)拷貝到正在創(chuàng)建的對(duì)象中。3)用途:a.對(duì)象實(shí)例化對(duì)象例如:data d1(2016,2,14);data d2(d1);b.將一個(gè)對(duì)象作為實(shí)參傳遞非引用類型的形參例如:void fun(const data d2){}c.從一個(gè)返回類型為非引用類型的函數(shù)返回一個(gè)對(duì)象data fun1(){ data d3; return d3;}解答:為什么拷貝構(gòu)造函數(shù)形參必須是本類對(duì)象的const引用?若定義為:Data(const Data d)因?yàn)閰?shù)的傳遞本身就是復(fù)制,而復(fù)制一個(gè)臨時(shí)的Data對(duì)象的時(shí)候要調(diào)用拷貝構(gòu)造函數(shù)。(也就是自己,調(diào)用自己的時(shí)候又是一次參數(shù)傳遞,所以又要調(diào)用一次自己(即:調(diào)構(gòu)造函數(shù))),這樣會(huì)一直惡性循環(huán)下去,造成無(wú)休止遞歸調(diào)用。4.阻止拷貝:在新標(biāo)準(zhǔn)下,我們可以將拷貝構(gòu)造函數(shù)和拷貝賦值運(yùn)算符定義為刪除的函數(shù)(delete)來(lái)阻止拷貝,雖然我們聲明了刪除的函數(shù),但是不能以任何方式使用它們,格式為:在參數(shù)列表后面加上“=delete”來(lái)指出我們希望將它定義為刪除的。例如:Data(const Data&d) = delete;//阻止拷貝data &Operator=(const data&)=delete//阻止賦值注意:=delete必須出現(xiàn)在第一次聲明的地方,我們可以對(duì)任何函數(shù)指定=delete,雖然刪除函數(shù)主要作用是禁止拷貝控制成員,但當(dāng)我們希望引導(dǎo)函數(shù)匹配過(guò)程時(shí),刪除函數(shù)有時(shí)也是有用的。析構(gòu)函數(shù):1.定義:是類的一個(gè)成員函數(shù),與構(gòu)造函數(shù)功能相反,在對(duì)象被銷毀時(shí),編譯器自動(dòng)調(diào)用,釋放對(duì)象使用的資源(不是刪除對(duì)象),并銷毀對(duì)象的非static數(shù)據(jù)成員(static局部對(duì)象在函數(shù)調(diào)用結(jié)束時(shí)對(duì)象并不釋放,因此也不用調(diào)用析構(gòu)函數(shù),只有在main函數(shù)結(jié)束或調(diào)用exit函數(shù)結(jié)束程序時(shí)候,才調(diào)用static局部對(duì)象的析構(gòu)函數(shù))。2.先構(gòu)造的后析構(gòu),后構(gòu)造的先析構(gòu)(他相當(dāng)于一個(gè)棧,先進(jìn)后出)。3.析構(gòu)函數(shù)沒(méi)有返回值,沒(méi)有函數(shù)類型,也沒(méi)有函數(shù)參數(shù)。因此,它不能被重載,一個(gè)類可以有多個(gè)構(gòu)造函數(shù),但只有一個(gè)析構(gòu)函數(shù)。*/新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注