1. 程式人生 > >【C++】類的六大預設的成員函式 之 解構函式以及建構函式和解構函式的呼叫順序

【C++】類的六大預設的成員函式 之 解構函式以及建構函式和解構函式的呼叫順序

                                              解構函式

一.解構函式定義

              解構函式也是特殊的成員函式,他的作用和建構函式相反

class Box
{
public:
	//建構函式
	Box(int h,int w,int l);

	//解構函式
	~Box();
private:
	int height;
	int wedth;
	int leng;
};

二.解構函式的特點

  • 沒有返回值
  • 函式名與類名相同且前面加~
  • 沒有函式型別
  • 沒有函式引數
  • 不能被過載
  • 一個類中可以有多個建構函式但解構函式只能有一個(若未顯式定義則編譯器會自動合成一個預設的解構函式)
  • 不必使用者呼叫,編譯器會自己呼叫(在一個生命週期結束時)

三.在哪些情況下會程式會執行解構函式????

  1. 如果一個函式中定義了一個物件,當這個函式被呼叫結束時,物件應該釋放,在這個物件釋放前自動執行解構函式
  2. 靜態(static)區域性物件在函式呼叫結束時物件並不釋放,因此也不呼叫解構函式,只有在main函式結束或者呼叫exit函式結束程式時,才呼叫static區域性物件的解構函式
  3. 如果定義了一個全域性物件,則在程式的流程離開其作用域時(main函式結束或者呼叫exit函式結束程式),呼叫其全域性物件的解構函式
  4. 如果用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;
}

我們可以很清楚的看到b先呼叫建構函式但是解構函式最後呼叫,b2最後呼叫的建構函式但是解構函式先呼叫