~#

在 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++ 中实现多态的一个重要方面。