1.預設建構函式
如果沒有顯示的為類聲明建構函式,編譯器將產生一個不接受任何參數。也不執行任何操作的預設建構函式。然而你可以建立自己的預設建構函式,它不接受任何參數,但根據需要對對象進行設定。
編譯器提供的建構函式被稱為預設建構函式,但按照慣例,任何不接受參數的建構函式都是預設建構函式。如果你建立了任何建構函式,編譯器不會提供建構函式。因此,如果需要一個不接受任何參數的建構函式,切已經建立了其他建構函式,則必須自己添加預設建構函式。
預設建構函式不會為資料成員提供初始值,也就是不會把資料成員初始化為0或者NULL。
2. 解構函式
解構函式在對象被銷毀後完成清理工作並釋放(在建構函式或對象的生命週期中)分配的資源或記憶體。解構函式總是與類同名,但在前面加上一個~。解構函式沒有參數也沒有傳回值,所以一個類只能有一個解構函式。
3. 預設拷貝建構函式
除提供預設建構函式和解構函式外,編譯器還提供一個預設拷貝建構函式。每當建立對象的拷貝時,都將調用拷貝建構函式。
所有拷貝建構函式都接受一個參數:指向其所屬類的對象的引用。將該引用聲明為const是個好主意,因為拷貝建構函式不會修改傳入的對象。例如:
cat(const cat & cat);
cat建構函式接受一個指向cat對象的const引用。該賦值建構函式旨在建立一個thecat拷貝。
預設拷貝建構函式將作為參數傳入的對象的每個成員變數複製到新對象的成員變數中。這被稱為成員拷貝(淺拷貝),這雖然對大多數成員變數來說是可行的,但對於指向自由儲存區中的對象的指標成員變數不可行。
成員淺拷貝只是將對象成員變數的值複製到另一個對象中,兩個對象中的指標最後將指向同一個記憶體塊。深拷貝將在堆中分配的值複製到新分配的記憶體中。
如果cat類中包含一個成員變數*itsage,它是一個指向自由儲存區中的int變數指標,預設拷貝建構函式將傳入的cat對象的itsage成員變數的值,拷貝到新的cat對象的itsage成員變數中。這兩個成員變數指向同一個記憶體塊。當其中任何一個cat對象不再在範圍中時,浙江導致災難性後果。如果原始的cat對象的解構函式釋放了這塊記憶體,而新的cat對象仍指向該記憶體塊,將產生一個迷途指標,程式將處於致命的危險之中。
解決這種問題的方法是,建立自己的拷貝建構函式並根據需要分配記憶體。分配記憶體後,便可以將原來的值複製到新記憶體中,這被稱為深拷貝。