什么是析构函数
析构函数是类的一个成员函数,名字由波浪号接类名构成,没有返回值,不接受参数,一个类只有一个析构函数。当一个类未定义自己的析构函数时,编译器会为它定义一个合成的析构函数。
析构函数完成什么工作
在构造函数中,成员的初始化时在函数体执行前完成的,且按照他们在类中的顺序进行初始化。在析构函数中,首先执行函数体,然后按照初始化顺序的逆序销毁成员。
析构函数销毁类类型成员时执行成员自己的析构函数,内置类型(包括指针)则什么也不做,智能指针是类类型,会被自动销毁。
析构函数什么时候被调用
- 变量在离开其作用域时被销毁。
- 当一个对象被销毁时,其成员被销毁。
- 容易起被销毁时,其元素也被销毁。
- 对于动态分配的对象,当对指向它的指针使用delete运算符时被销毁。
- 对于临时对象,创建它的完整表达式结束时被销毁。
派生类在销毁时,派生类的析构函数首先执行,然后是基类的析构函数,以此类推,沿着继承体系的反方向直至最后。
虚析构函数
在执行析构函数时,如果指针指向的对象的静态类型与动态类型不符,例如一个指向基类对象的指针实际上指向了一个派生类对象,那么只有基类的析构函数会被执行,为了确保执行正确的析构函数,可以将基类中的析构函数声明为虚函数,一个基类总是需要虚析构函数。虚析构函数将阻止合成移动操作。
class Person
{
public:
const char* name_;
Person(const char* name):name_(name) {};
~Person()
{
std::cout << "invoke person deinit" << std::endl;
}
};
class Worker :public Person
{
public:
Worker() :Person("work man"){};
~Worker()
{
std::cout << "invoke worker deinit" << std::endl;
}
};
int main(void)
{
Person* person = new Worker();
std::cout << person->name_ << std::endl;
delete person;
system("pause");
return 0;
}
来源:CSDN
作者:土豆吞噬者
链接:https://blog.csdn.net/xiongya8888/article/details/89424781