Делегирующий конструктор C++ со списком инициализации. Какие из них происходят?

Я посмотрел на очень похожий вопрос, но я не совсем уверен, что понимаю ответ. Если я делегирую конструктор, какие инициализации из списков инициализации происходят?

Пример:

MyClass::MyClass(int a, int b)
:
MyClass(a, b, NULL),
int1(a),
int2(b),
pOtherClass(NULL)
{
}

MyClass::MyClass(int a, int b, Other *p)
:
int1(a),
int2(b),
pOtherClass(p)
{
     if (pOtherClass == NULL)
     {
         pOtherClass = &DefaultInstance;
     }
}

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

  1. Первый конструктор (int, int) вызывает второй конструктор (int, int, Other *)
  2. Второй конструктор назначает адрес по умолчанию pOtherClass
  3. Первый список инициаторов конструктора присваивает pOtherClass в NULL,

Вопрос, который я связал сверху, кажется, указывает на то, что такое поведение не произойдет, но каков смысл списка инициализатора в (int, int) конструктор? Просто чтобы компилятор был доволен?

1 ответ

Решение

Согласно стандарту C++

Если mem-initializer-id обозначает класс конструктора, он должен быть единственным mem-initializer; конструктор является делегирующим конструктором, а конструктор, выбранный mem-initializer, является целевым конструктором. Главный конструктор - это первый конструктор, который вызывается при построении объекта (то есть не является целевым конструктором для конструирования этого объекта). Целевой конструктор выбирается по разрешению перегрузки. Как только целевой конструктор возвращается, тело делегирующего конструктора выполняется. Если конструктор делегирует самому себе прямо или косвенно, программа плохо сформирована; Диагностика не требуется.

Так что это определение конструктора

MyClass::MyClass(int a, int b)
:
MyClass(a, b, NULL),
int1(a),
int2(b),
pOtherClass(NULL)
{
}

является недействительным.

Должно быть

MyClass::MyClass(int a, int b)
:
MyClass(a, b, NULL)
{
}
Другие вопросы по тегам