程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 第13章 復制控制(4)

第13章 復制控制(4)

編輯:C++入門知識

13.3 析構函數
析構函數可以完成資源回收,作為類構造函數的補充。
1. 何時調用析構函數
撤銷類對象時會自動調用析構函數。
變量在超出作用域時應該自動撤銷。
動態分配的對象只有在指向該對象的指針被刪除時才撤銷。如果沒有刪除指向動態對象的指針,則不會運行該對象的析構函數,對象就一直存在,從而導致內存洩漏,而且對象內部使用的任何資源也不會釋放。
當對象的引用或指針超出作用域時,不會運行析構函數。只有刪除指向動態分配對象的指針或實際對象(而不是對象的引用)超出作用域時,才會運行析構函數。
撤銷一個容器(不管是標准庫容器還是內置數組)時,也會運行容器中的類類型元素的析構函數。
容器中的元素總是按逆序撤銷。
2. 何時編寫析構函數
析構函數通常用於釋放在構造函數或在對象生命期內獲取的資源。
如果類需要析構函數,則它也需要賦值操作符和復制構造函數,這是一個有用的經驗法則。這個規則成為三法則,指的是如果需要析構函數,則需要所有這三個復制控制成員。
3. 合成析構函數
與復制構造函數或賦值操作符不同,編譯器總是會為我們合成一個析構函數。合成析構函數按對象創建時的逆序撤銷每個非static成員,因此,它按成員在類中聲明次序的逆序撤銷成員。對於類類型的每個成員,合成析構函數調用該成員的析構函數來撤銷對象。
撤銷內置類型成員或復合類型的成員沒什麼影響。尤其是,合成析構函數並不刪除指針成員所指向的對象。
4. 如何編寫析構函數
析構函數是個成員函數,它的名字是在類名字之前加上一個代號(~),它沒有返回值,沒有形參。因為不能指定任何形參,所以不能重載析構函數。雖然可以為一個類定義多個構造函數,但只能提供一個析構函數,應用於類的所有對象。
析構函數與復制構造函數或賦值操作符之間的一個重要區別是,即使我們編寫了自己的析構函數,合成析構函數仍然運行。

class Class5 

public: 
    ~Class5() 
    { 
    } 
}; 

摘自 xufei96的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved