【C++】類的六大預設的成員函式 之 解構函式以及建構函式和解構函式的呼叫順序
阿新 • • 發佈:2019-01-08
解構函式
一.解構函式定義
解構函式也是特殊的成員函式,他的作用和建構函式相反。
class Box
{
public:
//建構函式
Box(int h,int w,int l);
//解構函式
~Box();
private:
int height;
int wedth;
int leng;
};
二.解構函式的特點
- 沒有返回值
- 函式名與類名相同且前面加~
- 沒有函式型別
- 沒有函式引數
- 不能被過載
- 一個類中可以有多個建構函式但解構函式只能有一個(若未顯式定義則編譯器會自動合成一個預設的解構函式)
- 不必使用者呼叫,編譯器會自己呼叫(在一個生命週期結束時)
三.在哪些情況下會程式會執行解構函式????
- 如果一個函式中定義了一個物件,當這個函式被呼叫結束時,物件應該釋放,在這個物件釋放前自動執行解構函式
- 靜態(static)區域性物件在函式呼叫結束時物件並不釋放,因此也不呼叫解構函式,只有在main函式結束或者呼叫exit函式結束程式時,才呼叫static區域性物件的解構函式
- 如果定義了一個全域性物件,則在程式的流程離開其作用域時(main函式結束或者呼叫exit函式結束程式),呼叫其全域性物件的解構函式
- 如果用new運算子動態的建立了一個物件,當用delete運算子釋放物件時,先呼叫該物件的解構函式
四.解構函式的作用
- 在撤銷物件佔用的記憶體之前完成一些清理工作(注意:他的作用不是刪除物件)
- 還用來執行使用者希望在最後一次使用物件之後執行的任何操作
五.呼叫建構函式和解構函式的順序
最先呼叫的建構函式,與之對應的物件的解構函式最後呼叫。最後呼叫的建構函式與之對應的物件的解構函式先呼叫
簡記為:先構造後呼叫,後構造先呼叫
他就類似於棧:先進後出
下邊來看一段程式碼:
#include<iostream> #include<Windows.h> #include <fstream> using namespace std; fstream fout("estructor.txt", ios::app); class Box { public: //建構函式 Box(int h, int w, int l) { height = h; wedth = w; leng = l; } //解構函式 ~Box() { fout << "hello world:" << height << endl; } void print(); private: int height; int wedth; int leng; }; void Box::print() { cout << height << " " << wedth << " " << leng << endl; } int main() { Box b(10, 20, 30); Box b1(7, 8, 9); Box b2(1, 2, 3); system("pause"); return 0; }