1. 程式人生 > >《面向物件程式設計 C++》解構函式

《面向物件程式設計 C++》解構函式

解構函式

建立類的物件時,會自動呼叫某個合適的建構函式,同樣,當物件被摧毀時,也會自動呼叫一個解構函式
解構函式的名稱與類的名稱是完全相同的,只是在前面加了個波浪號(~)作為字首,它不會返回任何值,也不能帶有任何引數。解構函式有助於在跳出程式(比如關閉檔案、釋放記憶體等)前釋放資源。
物件的摧毀出現在以下兩種情況:

  • 以某個類作為資料型別的變數超出其作用範圍。
  • 用delete操作符刪除動態分配的物件

與建構函式一樣,解構函式也是成員函式。由於解構函式不帶引數,因此不能被過載,每個類也只能擁有一個解構函式。

#include<iostream>
#include<string> using namespace std; class C{ public: C() { name="Null"; cout<<name<<" constructing."<<endl; } C(const char* n) { name = n; cout<<name<<" constructing."<<endl; } ~C(){ cout<<name<<
" destructing"<<endl; } private: string name; }; int main() { C c0("Elen"); // parameterized constructor { C c1; //default constructor C c2("Anny"); // parameterized constructor } cout<<endl; // c1 and c2 destructors called C* ptr=new C(); //default constructor
delete ptr; //destructor for the ptr object return 0; //c0 destructor called }

最後輸出結果為:

Elen constructing.
Null constructing.
Anny constructing.
Anny destructing
Null destructing

Null constructing.
Null destructing
Elen destructing
  • 在這段程式碼中,首先物件c0建立,並伴隨著轉型建構函式的呼叫,c0此時生效,直到main函式退出之前那一刻。
  • 接著物件c1建立,並伴隨著預設建構函式的呼叫
  • 接著物件c2建立,並伴隨著轉型建構函式的呼叫
  • 而由於定義c1和c2的語句位於一個程式塊當中,因此在程式塊結束之前的一刻,分別呼叫了c1和c2的解構函式。
  • 使用new操作符動態地分配一個物件,並將其地址儲存在型別為C*的指標ptr中,由於使用了操作符new,呼叫預設建構函式以初始化ptr所指物件。
  • 使用delete操作符刪除ptr所指物件,此時自動呼叫解構函式。
  • 最後main函式在退出之前呼叫c0的解構函式

可以看出解構函式的呼叫順序即位棧的思想,最先建立的則最後呼叫解構函式。>_<