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

时间:2018-11-04 06:11:13

标签: c++ class struct constructor initialization

我已经尝试过了。代码:

null

输出为:

#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);
}

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

1 个答案:

答案 0 :(得分:4)

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

  

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

     

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

     

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

     

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

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