Делегирующий конструктор 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) конструктор? Просто чтобы компилятор был доволен?

2

Решение

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

Если mem-initializer-id обозначает класс конструктора, это должно быть
единственный mem-инициализатор;
конструктор является делегирующим конструктором,
и конструктор, выбранный 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)
{
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]