1、析构函数的定义
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)
C++当中的析构函数格式如下:
class <类名>
{
public:
~<类名>();
};
<类名>::~<类名>()
{
//函数体
};
2、析构函数的理解
请看下面一个例子:
class myclass
{
public:
myclass()
{
cout << "构造函数" << endl;
}
~myclass()
{
cout << "析构函数" << endl;
}
};
int main()
{
myclass mc;
return 0;
}
输出结果:
构造函数
析构函数
请按任意键继续...
在main主函数当中,如果直接声明一个对象,在声明的时候,直接就调用了类内的构造函数,在主函数结束之前的那一小刻,也自动调用了这个类的析构函数。
再看一段代码:
int main()
{
myclass * mc;
return 0;
}
输出结果:
请按任意键继续...
在main主函数当中,如果直接声明一个对象指针(只是声明而已),既不自动调用构造函数和析构函数。
但是将main函数改为下面这样:
int main()
{
myclass * mc;
mc = new myclass();
return 0;
}
输出结果:
构造函数
请按任意键继续...
这里不仅声明了一个对象指针,而且new了,这说明给这一对象指针分配一个内存空间,当然这就会调用构造函数了;但是,为什么不自动调用析构函数了?说明C++内部缺少这一机制,C++毫不客气的对你说:“你提醒我给一个对象分配空间,那也得麻烦你提醒我将它释放(delete)。于是便有:
int main()
{
myclass * mc;
mc = new myclass();
delete mc;
return 0;
}
输出结果:
构造函数
析构函数
请按任意键继续...
所以,指针在使用new之后需要手动释放资源。在较大型的工程当中,资源的释放很重要,因为涉及的数据量比较多,稍有不慎,就会造成资源的浪费和泄露之类的问题,从现在起你就应该养成把握资源的好习惯。