解構函式(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會自動呼叫解構函式。