析構函數
析構函數通常用於釋放在構造函數或在對象生命期內獲取的資源(如動態分配的內存) 。
析構函數的作用並不僅限於釋放資源方面, 它可以包含任意操作, 用來執行“對象即將被撤銷之前程序員所期待的任何操作” 。
如果類需要析構函數, 則該類幾乎必然需要定義自己的複製構造函數和賦值運算符重載, 這個規則稱爲析構函數三法則(rule of
three) 。
程序
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
class CString
{
private:
/* data */
char *p;//存儲字符串動態內存區
public:
CString(const char *str);//單個參數構造函數
~CString();//析構函數
void show(){
//顯示字符串
cout<<"show:"<<p<<endl;
}
};
CString::CString(const char *str){
p=new char[strlen(str)+1];
//申請分配存儲動態內存區
strcpy(p,str);//複製str到p
printf("構造str:%s\n",str);
//printf("構造p:%s\n",p);
}
CString::~CString(){
cout<<"析構"<<p<<endl;
delete [] p;
//釋放申請內存區
}
int main(){
CString obj1="obj1";
CString obj2("obj2");
//實例類CString的obj1,obj2兩個對象
/****
obj1.show();
obj2.show();
****/
return 0;
}
構造函數和析構函數的調用很像一個棧的先進後出, 調用析構函數的次序正好與調用構造函數的次序相反。 最先被調用的構造函數,其對應的(同一對象中的) 析構函數最後被調用, 而最後被調用的構造函數, 其對應的析構函數最先被調用。