【问题标题】:Why are member classes initialized first in C++?为什么成员类在 C++ 中首先初始化?
【发布时间】:2018-11-04 06:11:12
【问题描述】:

我已经试过了。代码:

#include <iostream>
struct A
{
    A() { std::cout << "1"; }
    A(const A&) { std::cout << "2"; }
    A(A&&) { std::cout << "3"; }
};

struct B
{
    B() { std::cout << "4"; }
    B(const B& b) : a(b.a) { std::cout << "5"; }
    B(B&& b) : a(b.a) { std::cout << "6"; }
    A a;
};

int main()
{
    B b1;
    std::cout << "END OF b1" << std::endl;
    B b2 = std::move(b1);
}

输出是:

14END OF b1
26

我只是想知道为什么会这样,为什么 B 的构造函数被称为第二个?我也尝试过使用 class 而不是 struct,这是相同的行为。

【问题讨论】:

    标签: c++ class struct constructor initialization


    【解决方案1】:

    这是预期的行为。 initialization order 指定为

    1) 如果构造函数用于最派生类,则虚拟基类 类按照它们出现的顺序进行初始化 基类声明的深度优先从左到右遍历 (从左到右指的是在基本说明符列表中的出现)

    2) 然后,直接基类按从左到右的顺序初始化为 它们出现在此类的基本说明符列表中

    3) 然后,非静态数据成员按顺序初始化 类定义中的声明。

    4) 最后执行构造函数的主体

    那么数据成员a总是在B的构造函数执行之前被初始化(步骤#3)(步骤#4)。

    【讨论】:

    • 感谢分享!我现在意识到我需要学习更多,因为我几乎不理解前 2 个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多