Я знаю, что в class
элементы инициализируются в том порядке, в котором они перечислены. Это относится к группировке переменных в public
и private
и т. Д.? Моя путаница в том, что я не мог понять, есть ли предпочтения, такие как private
, члены инициализируются в том порядке, в котором они были указаны до public
членов, независимо от того, где частные переменные, перечисленные в отношении публики в объявлении класса (я знаю такое смещение существует по отношению к членам базового класса)последовательность инициализации члена класса C++
ответ
правила для инициализации класса изложены в [class.base.init]/11
в не делегирование конструктора, инициализация происходит в следующем порядке:
Во-первых, и только для конструктора самого производного класса (1.8) виртуальные базовые классы инициализируются в том порядке, в котором они появляются на первом пересечении слева направо, направленном ациклическим графом базовых классов, где " слева направо "- это порядок появления базовых классов в базовом-спецификационном списке производного класса.
Затем прямые базовые классы инициализируются в порядке объявления, как они появляются в списке-спецификаторе-базе (независимо от порядка инициализаторов mem).
Затем нестатические элементы данных инициализируются в том порядке, в котором они были объявлены в определении класса (опять же, независимо от порядка инициализаторов mem).
8 И наконец, выполняется составная инструкция тела конструктора.
[Примечание: заказ декларации уполномочен гарантировать, что субобъекты базы и элемента будут уничтожены в обратном порядке инициализации. -end примечание]
курсив мой
Так что, когда мы смотрим на пули 3 он определенно заявляет, что член построены в том порядке, появляются в определении. Это означает, что независимо от private
, public
или как они перечислены в списке инициализации члена класса, они будут построены в том порядке, в котором они объявлены.
Нестатические элементы данных инициализируются в том порядке, в котором они были объявлены.
Составитель следующий код, который вы можете проверить это, если у вас есть предупреждения включены:
// 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]
- 1. std :: вектор инициализации члена класса
- 2. В инициализации класса константного члена
- 3. Код инициализации статического члена C++
- 4. инициализации Список статического члена класса шаблона
- 5. Нелегальные инициализации члена в C++
- 6. C++ Получить адрес члена класса в списке инициализации конструктора
- 7. Ошибка инициализации члена класса для одноточечного режима
- 8. Использование функций класса-члена без инициализации
- 9. Ссылка инициализации в качестве члена класса
- 10. Сокращенное обозначение для инициализации члена класса
- 11. Как передать указатель члена класса в список инициализации члена?
- 12. Java: последовательность инициализации объекта
- 13. C++ Инициализировать указатель в списке инициализации члена
- 14. наследование и последовательность инициализации
- 15. абстрактных инициализации статического члена
- 16. C# наследуется инициализации класса
- 17. Циклическая зависимость инициализации члена
- 18. Инициализация инициализации статического члена C++ const
- 19. Scala: наследуется интерфейс инициализации члена
- 20. инициализации класса массива в списке инициализации C++
- 21. C++ 11 инициализация члена класса с этим
- 22. данные инициализации члена
- 23. Visual Studio Intellisense не узнавая члена класса в скобки инициализации
- 24. в инициализации члена Initializer Список
- 25. Initialize агрегировать класса члена
- 26. Инициализатор члена класса для инициализации ifstream с проверкой ошибок?
- 27. Ошибка C++: нет члена класса?
- 28. C++ инициализация объекта-члена класса
- 29. Инициализация члена класса другим членом класса C++
- 30. Инициализация члена класса (вектора) в конструкторе через список инициализации
В случае базового класса это не смещение, это просто, что базовый конструктор вызывается перед производным, что обеспечивает соблюдение порядка. Модификаторы доступа не влияют на порядок. Однако вы можете захотеть получить официальное доказательство юридического языка. Неформально, чтобы получить интуицию о внутренней работе, вы можете написать несколько примеров классов, печатающих свои имена от конструкторов, и поиграть с помещением членов таких типов под разные модификаторы доступа. – Drop