2016-11-16 2 views
2

Я знаю, что в class элементы инициализируются в том порядке, в котором они перечислены. Это относится к группировке переменных в public и private и т. Д.? Моя путаница в том, что я не мог понять, есть ли предпочтения, такие как private, члены инициализируются в том порядке, в котором они были указаны до public членов, независимо от того, где частные переменные, перечисленные в отношении публики в объявлении класса (я знаю такое смещение существует по отношению к членам базового класса)последовательность инициализации члена класса C++

+0

В случае базового класса это не смещение, это просто, что базовый конструктор вызывается перед производным, что обеспечивает соблюдение порядка. Модификаторы доступа не влияют на порядок. Однако вы можете захотеть получить официальное доказательство юридического языка. Неформально, чтобы получить интуицию о внутренней работе, вы можете написать несколько примеров классов, печатающих свои имена от конструкторов, и поиграть с помещением членов таких типов под разные модификаторы доступа. – Drop

ответ

3

правила для инициализации класса изложены в [class.base.init]/11

в не делегирование конструктора, инициализация происходит в следующем порядке:

  • Во-первых, и только для конструктора самого производного класса (1.8) виртуальные базовые классы инициализируются в том порядке, в котором они появляются на первом пересечении слева направо, направленном ациклическим графом базовых классов, где " слева направо "- это порядок появления базовых классов в базовом-спецификационном списке производного класса.

  • Затем прямые базовые классы инициализируются в порядке объявления, как они появляются в списке-спецификаторе-базе (независимо от порядка инициализаторов mem).

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

8 И наконец, выполняется составная инструкция тела конструктора.

[Примечание: заказ декларации уполномочен гарантировать, что субобъекты базы и элемента будут уничтожены в обратном порядке инициализации. -end примечание]

курсив мой

Так что, когда мы смотрим на пули 3 он определенно заявляет, что член построены в том порядке, появляются в определении. Это означает, что независимо от private, public или как они перечислены в списке инициализации члена класса, они будут построены в том порядке, в котором они объявлены.

1

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

Составитель следующий код, который вы можете проверить это, если у вас есть предупреждения включены:

// Example program 
#include <iostream> 
#include <string> 

class Test { 

private: 
    int a; 

public: 
    int b; 

    Test() : a(0), b(0) {} 

}; 

class TestPrivatePriority { 

public: 
    int b; 

    TestPrivatePriority() : a(0), b(0) {} 

private: 
    int a; 

}; 

class TestPublicPriority { 

private: 
    int a; 

public: 
    int b; 

    TestPublicPriority() : b(0), a(0) {} 

}; 

int main() 
{ 
    Test t; 
    TestPrivatePriority t1; 
    TestPublicPriority t2; 

    return 0; 
} 

Это будет производить следующие понятные предупреждения:

In constructor 'TestPrivatePriority::TestPrivatePriority()': 
25:9: warning: 'TestPrivatePriority::a' will be initialized after [-Wreorder] 
20:9: warning: 'int TestPrivatePriority::b' [-Wreorder] 
22:5: warning: when initialized here [-Wreorder] 
In constructor 'TestPublicPriority::TestPublicPriority()': 
35:9: warning: 'TestPublicPriority::b' will be initialized after [-Wreorder] 
32:9: warning: 'int TestPublicPriority::a' [-Wreorder] 
37:5: warning: when initialized here [-Wreorder] 
Смежные вопросы