Когда список инициализации просматривается C++

Я пытаюсь понять, когда на список инициализации ссылаются (участвуют) во время создания экземпляра нестатического члена базового класса и класса. Я прочитал эту статью и эта статья, в которой резюмируется порядок инициализации класса (я резюмировал его здесь)

Инициализация должна выполняться в следующем порядке:

  • Во-первых, и только для конструктора наиболее производного класса, как описано ниже, виртуальные базовые классы должны быть инициализированы в том порядке, в котором они появляются при обходе в глубину слева направо ориентированного ациклического графа базовых классов, где «слева -to-right» — это порядок появления имен базовых классов в списке базовых спецификаторов производных классов.

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

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

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

Теперь, прочитав вышеизложенное, я понимаю, что сначала создаются базовые классы, а затем производный класс. Кроме того, члены создаются в том порядке, в котором они были объявлены в определении класса, независимо от их положения в порядке списка инициализации.

Это заставляет меня думать, что каждый раз, когда создается экземпляр базового класса или переменной-члена во время создания экземпляра класса (в порядке, указанном выше), С++ в основном проверяет список инициализации класса, чтобы увидеть, был ли указан какой-либо конкретный параметр или аргумент для этой базы. класс или переменная-член. Если ничего не указано, то С++ вызывает конструктор по умолчанию. Правильно ли я понимаю. Пожалуйста, поправьте меня, если я ошибаюсь.


person James Franco    schedule 21.05.2017    source источник


Ответы (1)


Да, вы правы1, когда вы не инициализируете базовый класс или нестатический член в списке-инициализации-членов или когда вы этого не делаете. предоставить список-инициализации-членов, применяется следующее:

class.base.init/9

В конструкторе без делегирования, если данный потенциально создаваемый подобъект не обозначен mem-initializer-id (включая случай отсутствия mem-initializer-list поскольку в конструкторе нет ctor-initializer), то

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

    • класс конструктора является объединением, и никакие другие варианты членов этого объединения не обозначаются с помощью mem-initializer-id или

    • класс конструктора не является объединением, и, если объект является членом анонимного объединения, никакой другой член этого объединения не обозначается mem-initializer-id,

    -- сущность инициализируется из своего инициализатора члена по умолчанию, как указано в [dcl.init];

  • в противном случае, если сущность является анонимным объединением или вариантным членом ([class.union.anon]), инициализация не выполняется;

  • в противном случае объект инициализируется по умолчанию.


1: Вы сказали:

... Если ничего не указано, то c++ вызывает конструктор по умолчанию...

Чтобы быть несколько педантичным, инициализация по умолчанию в приведенной выше цитате не всегда означает, что будет вызываться конструктор по умолчанию, например, в случае неклассовых типов, таких как int, чья инициализация по умолчанию зависит от продолжительности хранения.

person WhiZTiM    schedule 21.05.2017