C++析构函数

 ̄綄美尐妖づ 提交于 2019-12-07 08:21:03

什么是析构函数

析构函数是类的一个成员函数,名字由波浪号接类名构成,没有返回值,不接受参数,一个类只有一个析构函数。当一个类未定义自己的析构函数时,编译器会为它定义一个合成的析构函数。

析构函数完成什么工作

在构造函数中,成员的初始化时在函数体执行前完成的,且按照他们在类中的顺序进行初始化。在析构函数中,首先执行函数体,然后按照初始化顺序的逆序销毁成员。

析构函数销毁类类型成员时执行成员自己的析构函数,内置类型(包括指针)则什么也不做,智能指针是类类型,会被自动销毁。

析构函数什么时候被调用

  • 变量在离开其作用域时被销毁。
  • 当一个对象被销毁时,其成员被销毁。
  • 容易起被销毁时,其元素也被销毁。
  • 对于动态分配的对象,当对指向它的指针使用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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!