# ~

在 C++ 中，析构函数（destructor）是一种特殊的成员函数，用于清理对象在销毁之前需要释放的资源。当一个对象生命周期结束时，例如对象的作用域结束或者删除动态分配的对象，析构函数会被自动调用。

## 析构函数的特点

### 名称

- 析构函数的名字是类名前加一个波浪号 `~`，如 `~ClassName()`。

### 参数

- 析构函数没有参数列表。

### 返回类型

- 析构函数没有返回类型，即使是 `void` 也不需要指定。

### 自动调用

- 当对象离开作用域或被显式删除时，析构函数会自动调用。

### 成员函数调用

- 析构函数中可以调用其他成员函数，但需要注意避免访问已经销毁的数据成员。

### 示例代码

```cpp
#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` 是一个基类，并且你希望确保派生类的析构函数也能被调用，你可以将其声明为虚析构函数：

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