析构函数的概念
于构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作
析构函数的作用
清理对象中的资源(从堆上申请的资源,打开的文件)
析构函数的使用
在对象的生命周期结束时,C++编译器会自动调用析构函数,若用户没有显式定义析构函数,则编译器会自动生成默认析构函数,一般情况下在类中不涉及资源的管理可以不给出析构函数,但若在类中涉及资源管理就要用户显式的给出自定义析构函数
class String{
public:
String(char* str = "")//构造函数
{
cout<<this<<"String()"<<endl;
_str = (char*)malloc(sizeof(char)*(strlen(str)+1));
strcpy(_str,str);
}
~String()//析构函数 _str在堆上申请空间
{
if(_str)
{
cout<<this<<"~String()"<<endl;
free(_str);
_str = nullptr;
}
}
private:
char* _str;
};
class student{
public:
student()
{
cout<<this<<"student"<<endl;
}
~student()//析构函数:无返回值,无参,用来释放对象中的资源
//一个类中只能有一个析构函数,在对象的生命周期结束时,C++编译器会自动调用
{
cout<<this<<"~student"<<endl;
}
private:
String _name;
String _gender;
int _age;
};
void Test()
{
String s1("hello");
String s2("你好");
student stu1;
}
int main()
{
Test();
system("pause");
}
运行结果:
在student类中不析构函数没有做什么事,实际上是可以不用显式给出的,在这里给出是为了方便观察函数调用的过程
特性
(1)函数名为类名前加上“~”;
(2)析构函数无参数无返回值;
(3)一个类有且只有一个析构函数;
(4)若在内中没有给出析构函数,则系统会自动生成缺省的析构函数;
(5)对象生命周期结束时,C++编译系统自动调用析构函数;
(6)析构函数的函数内部实现的并不是删除对象,而是做一些清理工作;
(7)一般来讲,若不需要进行特殊的清理工作(如动态释放等),使用系统缺省的析构函数即可。