Инициализация в списке инициализаторов участников

class A
{
  public:
    int a ,b;
    A() : a(1)
    {
      b=3;
    }
};

Если мы создадим объект этого класса:

A obj;

то какой из них будет сначала инициализирован, a или b?

В процессе назначения b = 3 будет ли какое-либо участие конструктора по умолчанию? Я имею в виду предоставленный ответ: Если вы используете назначение, тогда поля будут сначала инициализированы конструкторами по умолчанию, а затем переназначены (через оператор присваивания) с фактическими значениями.

Ответ 1

mem-initializer выполняется сначала в том порядке, в котором они были объявлены в определении класса, и затем выполняется тело конструктора.

Для справки проект стандарта С++ гласит:

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

[...]

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

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

Если вы не присвоили значение b в теле конструктора, оно будет иметь неопределенное значение.

Чтобы уточнить ответ который вы упомянули, часть ответа, на которую вы, похоже, ссылаетесь, такова:

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

то, что они хотели сказать, было то, что он будет инициализирован по умолчанию, который в случае для int означает неопределенное значение, из черновика стандарта С++:

Если для объекта не задан инициализатор, объект по умолчанию инициализируется. При хранении для объекта с автоматическим или динамическая длительность хранения, объект имеет неопределенный значение, и если для объекта не выполняется инициализация, это объект сохраняет неопределенное значение до тех пор, пока это значение не будет заменено (5,17).

Обратите внимание, что с использованием неопределенного значения - undefined поведение.

Ответ 2

Порядок инициализации - это всегда порядок, в котором переменные объявлены, независимо от порядка mem-инициализаторов. Итак, a, затем b.