携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天
三:析构函数
析构函数也是成员函数的一种,它的名字和类名相同,类名前面要加一个字符“~”,用于区分构造函数。析构函数没有参数也没有返回值,一个类中有且仅有一个析构函数。若程序中没有定义析构函数,编辑器会自动生成一个函数体为空的默认析构函数, 它的作用是在对象销毁之前,做一个清理善后的工作,保证空间的可利用性。
析构函数会在对象销毁时被调用,举个简单的例子:
# include <iostream>
using namespace std;
class Deom
{
public:
~Deom()
{
cout<<"调用析构函数"<<endl;
}
};
int main()
{
{
Deom deo;
}//局部变量在超出局部作用域后对象销毁,这时调用析构函数
cout<<"调用完毕"<<endl;
}
当使用new运算符生成对象指针时,编辑器会自动调用本类的析构函数;使用delete删除这个对象时,首先为这个动态对象调用本类的析构函数,然后再释放占用的空间。
using namespace std;
class A
{
public:
A()
{
cout<<"A的构造函数" <<endl;
}
~A()
{
cout<<"A的析构函数"<<endl;
}
};
class B
{
A *a;//在B中定义一个指针
public:
B()
{
cout<<"B的构造函数"<<endl;
a=new A;//指针指向堆区空间 ,使用new生成对象指针时,自动调用本类的构造函数
}
~B()
{
cout<<"B的析构函数" <<endl;
delete a;//使用关键字new 创建的对象,用delete来撤销 ;使用delete删除这个对象时,首先调用本类的析构函数,再释放占用的内存。
}
};
int main()
{
B b;//B的对象b定义在栈区,出栈之后自动调用本类的析构函数
return 0;
}
假如将“delete a;”注释掉,那么就会出现内存泄露的情况,而析构函数可以清理类中有指针、并且指向堆区空间的成员,释放指针指向的堆区空间,防止内存泄露。