C++中構造函數和析構函數的調用順序


 

一般而言,析構函數調用的順序和構造函數調用順序相反,但是,對象的存儲類別可以改變調用析構函數的順序。舉例說明:

CreateAndDestroy類的定義

 

CreateAndDestroy類的成員函數的定義

 

測試函數

 

構造函數和析構函數的調用順序:

分析

  全局作用域內定義的對象的構造函數,在文件內任何其他函數(包括main函數)開始執行之前調用,當main函數執行結束時,相應的析構函數被調用,如上面的Object 1.

exit函數迫使程序立即結束,不執行自動對象的析構函數。當程序中檢測到輸入中有錯誤,或者程序要處理的文件不能打開時,常常使用exit函數來終止程序。abort函數的執行情況與exit

函數類似,但是迫使程序立刻終止,不允許調用任何對象的析構函數。通常使用abort函數指示程序的非正常終止。

  當程序執行到自動局部對象的定義處時,該對象的構造函數被調用;當程序執行離開對象的作用域時,相應的析構函數被調用。如果程序的終止是由調用exit函數或者abort函數完成,

那么自動對象的析構函數將不被調用。

  static 局部對象的構造函數只調用一次,即在程序第一次執行到該對象的定義處時;而相應的析構函數的調用則發生在main函數結束或者程序調用exit函數。全局或靜態對象的的撤銷

順序與它們建立的順序正好相反。abort函數的調用終止程序時,static對象的析構函數將不被調用。

  在測試函數的第10行定義了全局static對象first, 在main中任何語句執行之前,調用它的構造函數;而在運行所有其他對象的析構函數之后程序終止,調用它的析構函數。

  對象second和fourth都是局部自動對象,對象third是一個static局部對象。當程序執行到每個對象聲明處時,調用它們的構造函數;當程序執行到main函數結尾時,依次調用對象fourth和second的析構函數(與構造函數的調用順序相反)。因為對象third是static局部對象,所以直到程序終止時,他才撤銷,即對象third的析構函數在全局對象first的析構函數調用之前、在所有其它對象撤銷之后調用。

  第25行的create函數聲明了3個對象:fifth和senventh是局部自動對象,sixth是局部static對象。程序執行到create函數結尾時,依次調用對象seventh和fifth的析構函數(與構造函數調用的順序相反)。由於sixth是static,因此直到程序終止時它才撤銷。sixth的析構函數的調用發生在third和first的析構函數之前及其它所有對象撤銷之后。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM