1 Star 0 Fork 0

huyi / TechCPP

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
类构造和析构的顺序.md 1.92 KB
一键复制 编辑 原始数据 按行查看 历史
alu234 提交于 2023-11-13 18:49 . Update 类构造和析构的顺序.md

在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 的构造顺序还是按照它们在类中声明的顺序。同样,析构顺序与构造顺序相反。

1
https://gitee.com/hylhm/TechCPP.git
git@gitee.com:hylhm/TechCPP.git
hylhm
TechCPP
TechCPP
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891