# 构造与析构顺序

URL: https://caijiao.org/cpp/oop/constructor-order
Source: docs/cpp/oop/constructor-order.md
Description: 本节介绍 C++ 中构造函数与析构函数的调用顺序。理解构造与析构顺序对于正确管理资源以及调试程序非常重要。

在 C++ 中，当对象被创建和销毁时，构造函数和析构函数会按照特定的顺序被调用。理解构造函数和析构函数的调用顺序对于正确管理资源以及调试程序非常重要。

## 构造函数的调用顺序

在派生类对象的构造过程中，构造函数的调用顺序如下：

1. **先调用基类的构造函数**：当创建派生类对象时，首先会调用基类的构造函数，确保基类的部分被正确初始化。
2. **再调用派生类的构造函数**：基类构造函数完成后，才会调用派生类的构造函数，进行派生类特有部分的初始化。

### 示例：构造函数的顺序

```cpp
#include <iostream>
using namespace std;

class Base {
public:
    Base() {
        cout << "Base class constructor" << endl;
    }
};

class Derived : public Base {
public:
    Derived() {
        cout << "Derived class constructor" << endl;
    }
};

int main() {
    Derived derivedObj;
    return 0;
}
````

### 输出：

```
Base class constructor
Derived class constructor
```

在这个例子中，首先调用基类 `Base` 的构造函数，然后才调用派生类 `Derived` 的构造函数。

## 析构函数的调用顺序

析构函数的调用顺序与构造函数相反：

1. **先调用派生类的析构函数**：当销毁派生类对象时，首先调用派生类的析构函数，释放派生类特有的资源。
2. **再调用基类的析构函数**：派生类析构函数完成后，才会调用基类的析构函数，确保基类的部分资源被释放。

### 示例：析构函数的顺序

```cpp
#include <iostream>
using namespace std;

class Base {
public:
    ~Base() {
        cout << "Base class destructor" << endl;
    }
};

class Derived : public Base {
public:
    ~Derived() {
        cout << "Derived class destructor" << endl;
    }
};

int main() {
    Derived derivedObj;
    return 0;
}
```

### 输出：

```
Derived class destructor
Base class destructor
```

在这个例子中，首先调用派生类 `Derived` 的析构函数，然后才调用基类 `Base` 的析构函数。

## 构造与析构顺序的重要性

正确理解构造和析构顺序非常重要，特别是在涉及资源管理（如动态内存分配、文件操作等）时。构造函数应当确保对象的所有资源被正确初始化，而析构函数则应该负责清理资源，以防止内存泄漏和资源浪费。

### 小结

* **构造函数顺序**：派生类对象的构造过程中，先调用基类构造函数，再调用派生类构造函数。
* **析构函数顺序**：派生类对象销毁时，先调用派生类析构函数，再调用基类析构函数。
* 理解构造和析构顺序有助于正确管理资源，并避免潜在的资源泄漏或初始化错误。
