一.定义
析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作。
例如,在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存。
析构函数有如下特点:
1. 构函数名与类名相同,但在前面加上字符‘~’。
2. 析构函数无函数返回类型,与构造函数在这方面是一样的。但析构函数不带任何参数。
3. 一个类有一个也只有一个析构函数,这与构造函数不同。析构函数可以缺省。
4. 对象注销时,系统自动调用析构函数。
格式如下:
class 类名
{
~类名()
{
...
}
}
类名::~类名()
{
...
}
例如,如下定义是合法的:
class CStudent
{
~CStudent();
}
CStudent::~CStudent()
{
...
}
二.析构函数的作用
下面用一个实例代码说明析构函数的作用。
#include<iostream>
using namespace std;
class Test
{
public:
Test();
~Test();
private:
int *age;
};
Test::Test()
{
this->age = new int(0);
}
Test::~Test()
{
delete age;
cout<<"Destructor"<<endl;
}
int main()
{
Test *t = new Test();
delete t;
};
运行结果如下图。析构函数被自动调用。
三.应用实例
下面结合构造函数,举一个简单的实际应用例子。
#include <string.h>
#include <iostream>
using namespace std;
class CStudent
{
public:
//构造函数
CStudent(const char *name,char sex,int score);
void display(void);
//析构函数
~CStudent();
private:
char name[50];
char sex;
int score;
};
CStudent::CStudent(const char *name,char sex,int score)
{
strcpy(this->name, name);
this->sex = sex;
this->score = score;
}
void CStudent::display(void)
{
cout<<"name : "<<name<<endl;
cout<<"sex : "<<sex<<endl;
cout<<"score: "<<score<<endl;
}
CStudent::~CStudent() //析构函数
{
cout<<"Destructor!"<<endl;
}
int main()
{
CStudent stu1("Jony",'M', 80);
CStudent stu2("Lily", 'W',90);
stu1.display();
stu2.display();
return 0;
}
运行结果如下: