1.默認(rèn)構(gòu)造函數(shù) 如果沒有顯示的為類聲明構(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ì)象被銷毀后完成清理工作并釋放(在構(gòu)造函數(shù)或?qū)ο蟮纳芷谥校┓峙涞馁Y源或內(nèi)存。析構(gòu)函數(shù)總是與類同名,,但在前面加上一個(gè)~,。析構(gòu)函數(shù)沒有參數(shù)也沒有返回值,所以一個(gè)類只能有一個(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ù):指向其所屬類的對(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ù)成員變量來說是可行的,但對(duì)于指向自由存儲(chǔ)區(qū)中的對(duì)象的指針成員變量不可行,。 成員淺拷貝只是將對(duì)象成員變量的值復(fù)制到另一個(gè)對(duì)象中,,兩個(gè)對(duì)象中的指針最后將指向同一個(gè)內(nèi)存塊。深拷貝將在堆中分配的值復(fù)制到新分配的內(nèi)存中,。 如果cat類中包含一個(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)之中。 解決這種問題的方法是,,創(chuàng)建自己的拷貝構(gòu)造函數(shù)并根據(jù)需要分配內(nèi)存,。分配內(nèi)存后,便可以將原來的值復(fù)制到新內(nèi)存中,,這被稱為深拷貝,。 |
|