首页 > 解决方案 > 为什么成员类在 C++ 中首先初始化?

问题描述

我试过ff。代码:

#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++classstructconstructorinitialization

解决方案


这是预期的行为。初始化顺序指定为

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

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

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

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

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


推荐阅读