析構函數小結

析構函數
析構函數是一個特殊的成員函數,其作用與構造函數相反,它的名字是類的名字前面加一個“~”符號,在c++中這是位取反運算符,理解爲析構函數是與構造函數作用相反的函數
以下四種情況程序會自動執行析構函數:

  • 如果在一個函數中定義了對象(假設是自動局部對象),當這個函數被調用結束時,對象應該釋放,在對象釋放前自動執行析構函數
  • 靜態局部對象在函數調用結束時對象並不釋放,因此也不調用析構函數,只有在main函數結束或者調用exit函數結束程序時才調用static局部對象的析構函數
  • 如果定義了一個全局的對象,則在程序的流程離開其作用域時(如main函數結束或調用exit函數結束),調用該全局的對象的析構函數
  • 如果用new運算符動態地建立了一個對象,當用delete運算符釋放該對象時,先調用該對象的析構函數

析構函數的作用並不是刪除對象,而是在撤銷對象佔用的內存之前完成一些清理工作

  • 一個類可以有多個構造函數,但是隻能有一個析構函數
  • 先構造的後析構,後構造的先析構,相當於一個棧,先進後出

注:
析構函數不能被重載

在以下情況系統調用構造函數和析構函數:
1. 如果在全局範圍中定義變量,則其構造函數在本文件模塊中的所有函數執行之前調用。但若是一個程序包含多個文件,且在不同的文件中都定義了全局對象,則這些對象的構造函數的執行順序不確定。當main函數執行完畢或調用exit函數時調用析構函數
2. 若定義的時局部自動變量(假設在函數中定義對象),則在建立對象時調用其構造函數。如果對象所在的函數被多次調用,則在每次建立對象時都要調用構造函數。在函數調用結束、對象釋放時先調用析構函數。
3.如果在函數中定義靜態局部變量,則只在程序第1次調用此函數定義對象時調用構造函數一次,在調用函數結束時對象並不釋放,因此也不調用析構函數,只在main函數結束或調用exit函數結束程序時才調用析構函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章