~#
在 C++ 中,析构函数(destructor)是一种特殊的成员函数,用于清理对象在销毁之前需要释放的资源。当一个对象生命周期结束时,例如对象的作用域结束或者删除动态分配的对象,析构函数会被自动调用。
析构函数的特点#
名称#
析构函数的名字是类名前加一个波浪号
~
,如~ClassName()
。
参数#
析构函数没有参数列表。
返回类型#
析构函数没有返回类型,即使是
void
也不需要指定。
自动调用#
当对象离开作用域或被显式删除时,析构函数会自动调用。
成员函数调用#
析构函数中可以调用其他成员函数,但需要注意避免访问已经销毁的数据成员。
示例代码#
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "MyClass constructor called." << std::endl;
}
~MyClass() {
std::cout << "MyClass destructor called." << std::endl;
// 这里可以添加释放资源的代码
}
void doSomething() {
std::cout << "Doing something..." << std::endl;
}
};
int main() {
MyClass obj; // 构造函数被调用
obj.doSomething();
return 0;
}
在这个例子中,当 main
函数执行完毕后,obj
对象的生命周期结束,其析构函数会被自动调用。
虚析构函数#
如果一个类有可能被继承,并且想要确保派生类的析构函数也被正确调用,应该将基类的析构函数声明为虚函数。
虚析构函数保证了当通过基类指针删除派生类对象时,派生类的析构函数会被正确调用。
示例代码#
如果 MyClass
是一个基类,并且你希望确保派生类的析构函数也能被调用,你可以将其声明为虚析构函数:
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "MyClass constructor called." << std::endl;
}
virtual ~MyClass() {
std::cout << "MyClass destructor called." << std::endl;
}
void doSomething() {
std::cout << "Doing something..." << std::endl;
}
};
这样,即使是从 MyClass
派生出的新类,当使用基类指针删除派生类对象时,派生类的析构函数也会被正确调用。这是 C++ 中实现多态的一个重要方面。