第13章 複製控制 4

2021-06-02 14:34:38 字數 954 閱讀 6551

13.3 析構函式

析構函式可以完成資源**,作為類建構函式的補充。

1. 何時呼叫析構函式

撤銷類物件時會自動呼叫析構函式。

變數在超出作用域時應該自動撤銷。

動態分配的物件只有在指向該物件的指標被刪除時才撤銷。如果沒有刪除指向動態物件的指標,則不會執行該物件的析構函式,物件就一直存在,從而導致記憶體洩漏,而且物件內部使用的任何資源也不會釋放。

當物件的引用或指標超出作用域時,不會執行析構函式。只有刪除指向動態分配物件的指標或實際物件(而不是物件的引用)超出作用域時,才會執行析構函式。

撤銷乙個容器(不管是標準庫容器還是內建陣列)時,也會執行容器中的類型別元素的析構函式。

容器中的元素總是按逆序撤銷。

2. 何時編寫析構函式

析構函式通常用於釋放在建構函式或在物件生命期內獲取的資源。

如果類需要析構函式,則它也需要賦值操作符和複製建構函式,這是乙個有用的經驗法則。這個規則成為三法則,指的是如果需要析構函式,則需要所有這三個複製控制成員。

3. 合成析構函式

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

撤銷內建型別成員或復合型別的成員沒什麼影響。尤其是,合成析構函式並不刪除指標成員所指向的物件。

4. 如何編寫析構函式

析構函式是個成員函式,它的名字是在類名字之前加上乙個代號(~),它沒有返回值,沒有形參。因為不能指定任何形參,所以不能過載析構函式。雖然可以為乙個類定義多個建構函式,但只能提供乙個析構函式,應用於類的所有物件。

析構函式與複製建構函式或賦值操作符之間的乙個重要區別是,即使我們編寫了自己的析構函式,合成析構函式仍然執行。

class class5

};

第13章 複製控制

複製建構函式 賦值操作符和析構函式總稱為複製控制 copy control 複製建構函式可用於 1 根據另乙個同型別的物件顯式或隱式初始化乙個物件 2 複製乙個物件,將它作為實參傳給乙個函式 3 從函式返回時複製乙個物件 4 初始化順序容器中的元素,如vectorsev 5 分別用了預設建構函式和複...

第13章習題 複製控制

1.理解呼叫過程 include include using namespace std 定義exmpl類,該類給出複製控制成員和乙個預設建構函式,各成員函式輸出自己的名字。主程式中以不同方式使用exmpl型別的物件 作為非引用形參和引用形參傳遞,動態分配 作為函式返回值,進行賦值操作 作為元素放在...

第13章 複製控制 7

13.5.2 定義值型類 具有值語義的類所定義的物件,其行為很像算術型別的物件,反之亦然。string類是值型類的乙個例子。複製建構函式不再複製指標,它將分配乙個新的int物件,並初始化該物件以儲存與被複製物件相同的值。每個物件都儲存屬於自己的int值的不同副本。因為每個物件儲存自己的副本,所以析構...