1. 程式人生 > >解構函式(C++學習筆記 19)

解構函式(C++學習筆記 19)

一、什麼是解構函式?

解構函式也是一種特殊的成員函式。它執行與建構函式相反的操作,通常用於執行一些清理任務,如釋放分配給物件的記憶體空間等。

二、解構函式的特點是什麼?

1、解構函式名與類名相同,但它前面必須加一個波浪號(~)。
2、解構函式不返回任何值。在定義解構函式時,是不能說明它的型別的,甚至說明為void型別也不行。
3、解構函式沒有引數,因此它不能被過載。一個類可以有多個建構函式,但是隻能有一個解構函式。
4、撤銷物件時,編譯系統會自動地呼叫解構函式。

三、例子:既含有建構函式,又含有解構函式。

#include<iostream>
#include
<cmath>
using namespace std; class Complex{ public: Complex(double r=0.0,double i=0.0); //宣告建構函式 ~Complex(); double abscomplex(); private: double real; double imag; }; Complex::Complex(double r,double i){ real=r; imag=i; cout<<"Constructor called."<<endl; } Complex::~Complex
(){ cout<<"Destructor called."<<endl; } double Complex::abscomplex(){ double t; t=real*real+imag*imag; sqrt(t); } int main(){ Complex A(1.1,2.2); cout<<"複數的絕對值是:"<<A.abscomplex()<<endl; return 0; }

在執行主函式時先建立物件A,在建立物件A時呼叫建構函式,對物件A中的資料成員賦初值,然後呼叫A的函式abscomplex,計算並輸出物件A的複數的絕對值。在執行return語句之後,主函式中的語句已執行完畢,物件A的宣告週期結束,在撤銷物件A時要呼叫解構函式,釋放分配給物件A的儲存空間,並顯示資訊“Destructor called.”。

執行結果如下:
在這裡插入圖片描述說明:
1、每個類必須有一個解構函式。若沒有顯式地為一個類定義解構函式,則編譯系統會自動地生成一個預設解構函式:
Complex::~Complex(){}
類似於系統自動地生成的預設建構函式,這個自動生成的預設解構函式也是空的,但是它能夠完成釋放物件所佔儲存空間的任務。

2、對於大多數類而言,這個預設解構函式就能滿足要求。但是,如果在一個物件需要完成另外一些處理工作的話,則應該顯示地定義解構函式。例如:

class String_data{
	public:
		String_data(char *s){   //建構函式 
			str=new char[strlen(s)+1];  //用運算子new為字串str動態地分配了一個儲存空間
			strcpy(str,s);
		}
		~String_data(){
			delete str;
		}
		void get_info(char *);
		void sent_info(char *);
	private:
		char *str;
}; 

這是建構函式和解構函式的常見用法,即在建構函式中用運算子new 為字串分配空間,最後再解構函式中用運算子delete釋放已分配的儲存空間。

3、解構函式被呼叫的情況:

①主函式結束(或呼叫exit函式)時,物件被撤銷,系統會自動呼叫解構函式。

②如果一個物件被定義在一個函式體內,則當這個函式體呼叫結束時,該物件將釋放,解構函式被自動呼叫。

③若一個物件是使用new運算子動態建立的,在使用delete運算子釋放它時,delete會自動呼叫解構函式。