Skip to content

Latest commit

 

History

History
85 lines (68 loc) · 1.92 KB

类构造和析构的顺序.md

File metadata and controls

85 lines (68 loc) · 1.92 KB

在C++中,类的构造和析构顺序遵循以下规则:

  1. 构造顺序:
    • 基类优先于派生类进行构造。
    • 在同一个类中,成员变量按照声明的顺序进行初始化。
    • 对于多个基类的情况,会按照声明顺序来初始化。
  2. 析构顺序:
    • 析构顺序与构造顺序相反。
    • 派生类对象先于基类对象进行析构。
    • 在同一个类中,成员变量按照声明顺序的逆序进行析构。
    • 对于多个基类的情况,会按照声明顺序的逆序进行析构。

举个例子:

#include <iostream>
using namespace std;

class Base {
public:
    Base() { cout << "构造基类对象\n"; }
    ~Base() { cout << "析构基类对象\n"; }
};

class Derived : public Base {
public:
    Derived() { cout << "构造派生类对象\n"; }
    ~Derived() { cout << "析构派生类对象\n"; }
};

int main() {
    Derived d;
    return 0;
}

输出将会是:

复制代码构造基类对象
构造派生类对象
析构派生类对象
析构基类对象

对于成员变量,我们可以稍微修改一下代码:

#include <iostream>
using namespace std;

class Member {
public:
    Member(const char* s) { cout << "构造成员对象: " << s << "\n"; }
    ~Member() { cout << "析构成员对象\n"; }
};

class WithMembers {
public:
    WithMembers() : m2("m2"), m1("m1") { cout << "构造包含成员的对象\n"; }
    ~WithMembers() { cout << "析构包含成员的对象\n"; }

private:
    Member m1;
    Member m2;
};

int main() {
    WithMembers wm;
    return 0;
}

你会看到如下的输出:

复制代码构造成员对象: m1
构造成员对象: m2
构造包含成员的对象
析构包含成员的对象
析构成员对象
析构成员对象

即使在构造函数中 m2m1 之前初始化,m1m2 的构造顺序还是按照它们在类中声明的顺序。同样,析构顺序与构造顺序相反。