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