为什么在C++中首先初始化成员类

Why are member classes initialized first in C++?

本文关键字:初始化 成员类 C++ 为什么      更新时间:2023-10-16

我试过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的构造函数被称为second?我也试着用class代替struct,这是相同的行为。

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

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

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

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

4( 最后,构造函数的主体被执行

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