1.默認(rèn)構(gòu)造函數(shù)
如果沒(méi)有顯示的為類(lèi)聲明構(gòu)造函數(shù),編譯器將生成一個(gè)不接受任何參數(shù)。也不執(zhí)行任何操作的默認(rèn)構(gòu)造函數(shù)。然而你可以創(chuàng)建自己的默認(rèn)構(gòu)造函數(shù),它不接受任何參數(shù),但根據(jù)需要對(duì)對(duì)象進(jìn)行設(shè)置。
編譯器提供的構(gòu)造函數(shù)被稱為默認(rèn)構(gòu)造函數(shù),但按照慣例,任何不接受參數(shù)的構(gòu)造函數(shù)都是默認(rèn)構(gòu)造函數(shù)。如果你創(chuàng)建了任何構(gòu)造函數(shù),編譯器不會(huì)提供構(gòu)造函數(shù)。因此,如果需要一個(gè)不接受任何參數(shù)的構(gòu)造函數(shù),切已經(jīng)創(chuàng)建了其他構(gòu)造函數(shù),則必須自己添加默認(rèn)構(gòu)造函數(shù)。
默認(rèn)構(gòu)造函數(shù)不會(huì)為數(shù)據(jù)成員提供初始值,也就是不會(huì)把數(shù)據(jù)成員初始化為0或者NULL。
2. 析構(gòu)函數(shù)
析構(gòu)函數(shù)在對(duì)象被銷(xiāo)毀后完成清理工作并釋放(在構(gòu)造函數(shù)或?qū)ο蟮纳芷谥校┓峙涞馁Y源或內(nèi)存。析構(gòu)函數(shù)總是與類(lèi)同名,但在前面加上一個(gè)~。析構(gòu)函數(shù)沒(méi)有參數(shù)也沒(méi)有返回值,所以一個(gè)類(lèi)只能有一個(gè)析構(gòu)函數(shù)。
3. 默認(rèn)拷貝構(gòu)造函數(shù)
除提供默認(rèn)構(gòu)造函數(shù)和析構(gòu)函數(shù)外,編譯器還提供一個(gè)默認(rèn)拷貝構(gòu)造函數(shù)。每當(dāng)創(chuàng)建對(duì)象的拷貝時(shí),都將調(diào)用拷貝構(gòu)造函數(shù)。
所有拷貝構(gòu)造函數(shù)都接受一個(gè)參數(shù):指向其所屬類(lèi)的對(duì)象的引用。將該引用聲明為const是個(gè)好主意,因?yàn)榭截悩?gòu)造函數(shù)不會(huì)修改傳入的對(duì)象。例如:
cat(const cat & cat);
cat構(gòu)造函數(shù)接受一個(gè)指向cat對(duì)象的const引用。該賦值構(gòu)造函數(shù)旨在創(chuàng)建一個(gè)thecat拷貝。
默認(rèn)拷貝構(gòu)造函數(shù)將作為參數(shù)傳入的對(duì)象的每個(gè)成員變量復(fù)制到新對(duì)象的成員變量中。這被稱為成員拷貝(淺拷貝),這雖然對(duì)大多數(shù)成員變量來(lái)說(shuō)是可行的,但對(duì)于指向自由存儲(chǔ)區(qū)中的對(duì)象的指針成員變量不可行。
成員淺拷貝只是將對(duì)象成員變量的值復(fù)制到另一個(gè)對(duì)象中,兩個(gè)對(duì)象中的指針最后將指向同一個(gè)內(nèi)存塊。深拷貝將在堆中分配的值復(fù)制到新分配的內(nèi)存中。
如果cat類(lèi)中包含一個(gè)成員變量*itsage,它是一個(gè)指向自由存儲(chǔ)區(qū)中的int變量指針,默認(rèn)拷貝構(gòu)造函數(shù)將傳入的cat對(duì)象的itsage成員變量的值,拷貝到新的cat對(duì)象的itsage成員變量中。這兩個(gè)成員變量指向同一個(gè)內(nèi)存塊。當(dāng)其中任何一個(gè)cat對(duì)象不再在作用域中時(shí),浙江導(dǎo)致災(zāi)難性后果。如果原始的cat對(duì)象的析構(gòu)函數(shù)釋放了這塊內(nèi)存,而新的cat對(duì)象仍指向該內(nèi)存塊,將生成一個(gè)迷途指針,程序?qū)⑻幱谥旅奈kU(xiǎn)之中。
解決這種問(wèn)題的方法是,創(chuàng)建自己的拷貝構(gòu)造函數(shù)并根據(jù)需要分配內(nèi)存。分配內(nèi)存后,便可以將原來(lái)的值復(fù)制到新內(nèi)存中,這被稱為深拷貝。
聯(lián)系客服