C Primer複製控制 13 3 析構函式

2021-07-12 06:52:54 字數 953 閱讀 6455

如果類需要析構函式,則它也需要賦值操作符和複製建構函式,這是乙個有用的經驗法則。這個規則常稱為

三法則,指的是如果需要析構函式,則需要所有這三個複製控制成員。

複製建構函式或賦值操作符不同,編譯器總是會為我們合成乙個析構函式。合成析構函式按物件建立時的逆序撤銷每個非static 成員,因此,它按成員在類中宣告次序的逆序撤銷成員。對於類型別的每個成員,合成析構函式呼叫該成員的析構函式來撤銷物件。

當使用者沒有顯式定義析構函式時, 編譯器同樣會為物件生成乙個預設的析構函式, 但預設生成的析構函式只能釋放類的普通資料成員所占用的空間, 無法釋放通過 new 或malloc 進行申請的空間, 因此有時我們需要自己顯式的定義析構函式對這些申請的空間進行釋放, 避免造成記憶體洩露。

可以看出,析構函式在 main 函式執行結束前被執行,並且呼叫順序和建構函式正好相反,為了方便記憶,我們可以將之理解為乙個棧,先入後出。

析構函式在物件被銷毀前執行;要知道析構函式什麼時候被呼叫,就要先知道物件什麼時候被銷毀。

物件可以認為是通過類這種資料型別定義的變數,它的很多特性和普通變數是一樣的,例如作用域、生命週期等。由此可以推斷,物件這種變數的銷毀時機和普通變數是一樣的。

總結起來,有下面幾種情況:

1) 如果在乙個函式中定義了乙個物件(auto 區域性變數),當這個函式執行結束時,物件就會被銷毀,在物件被銷毀前自動執行析構函式。

2) static 區域性物件在函式呼叫結束時並不銷毀,因此也不呼叫析構函式,只有在程式結束時(如 main 函式結束或呼叫 exit 函式)才呼叫 static 區域性物件的析構函式。

3) 如果定義了乙個全域性物件,也只有在程式結束時才會呼叫該全域性物件的析構函式。

4) 如果用 new 運算子動態地建立了乙個物件,當用delete 運算子釋放該物件時,先呼叫該物件的析構函式。

注意:析構函式的作用並不是刪除物件,而是在撤銷物件占用的記憶體之前完成一些清理工作,使這部分記憶體可以分配給新物件使用。

C Primer 複製控制

複製建構函式 當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯式使用複製建構函式 a a a 當將該型別的物件傳遞給函式或從函式返回該型別的物件時,將隱式使用複製建構函式 顯式使用和隱式使用的區別?析構函式 當物件超出作用域或動態分配的物件被刪除時,將自動應用析構函式。複製建構函式,賦值操...

C Primer 複製控制

複製控制 當定義乙個新型別的時候,需要顯式或隱式地指定複製 賦值和撤銷該型別的物件時會發生什麼 這是通過定義特殊成員 複製建構函式 賦值操作符和析構函式來達到的。如果沒有顯式定義複製建構函式或賦值操作符,編譯器 通常 會為我們定義。複製建構函式 是一種特殊建構函式,具有單個形參,該形參 常用 con...

C Primer筆記 13 複製控制

當定義乙個新型別的時候,需要顯式或隱式地指定複製 賦值和撤銷該型別的物件時會發生什麼 這就是通過定義特殊成員 複製建構函式 賦值操作符和析構函式來達到的。如果沒有顯式定義複製建構函式或賦值操作符,編譯器會為我們定義。複製建構函式 賦值操作符和析構函式總稱為複製控制 copy constrol 編譯器...