c primer 3 13 析構函式

2021-08-26 18:46:38 字數 923 閱讀 6476

// p points to default constructed object

sales_item *p = new sales_item;

// exit local scope; destructor called on

item

變數(如 item)在超出作用域時應該自動撤銷。因此,當遇到右花括號時,將執行 item 的析構函式。

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

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

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

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

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

class sales_item 

// other members as before

};

撤銷 sales_item 型別的物件時,將執行這個什麼也不做的析構函式,它執行完畢後,將執行合成析構函式以撤銷類的成員。合成析構函式呼叫 string 析構函式來撤銷 string 成員,string 析構函式釋放了儲存 isbn 的記憶體。units_sold 和 revenue 成員是內建型別,所以合成析構函式撤銷它們不需要做什麼。

C Primer 析構函式

1 建構函式初始化物件的非static資料成員,還可能做一些其他的工作 析構函式釋放物件使用的資源,並銷毀物件的非static資料成員。2 析構函式是類的乙個成員函式,名字由波浪號接類名構成。沒有返回值,也不接受引數,因此不能被過載。3 對於乙個給定類,只會有唯一乙個析構函式。4 在乙個建構函式中,...

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

如果類需要析構函式,則它也需要賦值操作符和複製建構函式,這是乙個有用的經驗法則。這個規則常稱為 三法則,指的是如果需要析構函式,則需要所有這三個複製控制成員。複製建構函式或賦值操作符不同,編譯器總是會為我們合成乙個析構函式。合成析構函式按物件建立時的逆序撤銷每個非static 成員,因此,它按成員在...

C 析構函式 虛析構函式

1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...