Почему классы-члены инициализируются первыми в C ++? - PullRequest
0 голосов
/ 04 ноября 2018

Я попробовал фф. код:

#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 называется вторым? Я также пытался использовать класс вместо структуры, и это то же самое поведение.

1 Ответ

0 голосов
/ 04 ноября 2018

Это ожидаемое поведение. порядок инициализации указан как

1) Если конструктор предназначен для самого производного класса, виртуальная база классы инициализируются в том порядке, в котором они появляются в Глубокий обход слева направо объявлений базового класса (слева направо относится к появлению в списках базовых спецификаторов)

2) Затем прямые базовые классы инициализируются в порядке слева направо как они появляются в списке базовых спецификаторов этого класса

3) Затем элементы нестатических данных инициализируются в порядке объявление в определении класса.

4) Наконец, тело конструктора выполняется

Тогда элемент данных a всегда инициализируется (шаг # 3) перед выполнением конструктора B (шаг # 4).

...