《面向物件程式設計 C++》解構函式
阿新 • • 發佈:2018-12-21
解構函式
建立類的物件時,會自動呼叫某個合適的建構函式,同樣,當物件被摧毀時,也會自動呼叫一個解構函式。
解構函式的名稱與類的名稱是完全相同的,只是在前面加了個波浪號(~)作為字首,它不會返回任何值,也不能帶有任何引數。解構函式有助於在跳出程式(比如關閉檔案、釋放記憶體等)前釋放資源。
物件的摧毀出現在以下兩種情況:
- 以某個類作為資料型別的變數超出其作用範圍。
- 用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的解構函式
可以看出解構函式的呼叫順序即位棧的思想,最先建立的則最後呼叫解構函式。>_<