Список инициализации с объявленными, но не инициализированными элементами - PullRequest
0 голосов
/ 08 ноября 2018

У меня вопрос по поводу списков инициализации, когда я не инициализирую все элементы.

Допустим, у меня есть следующий код:

class Example {
  int a, b, c;

  Example() : a(1), b(2), c(3) {}
}

Мне известно, что порядок инициализации членов определяется порядком их объявления, а не порядком, в котором они перечислены в списке инициализации, но что, если у меня нет b в списке инициализации как в следующем?

class Example {
  int a, b, c;

  Example() : a(1), c(2) {}
}

Будет ли a инициализироваться с 1 , b с неопределенным значением и c с 3 ? Получу ли я неопределенное поведение, потому что я не вызываю список инициализации строго в порядке, который я объявляю? Или ничего из этого?

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

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Идея неопределенного поведения зависит от контекста здесь. Дело в том, что ваш код НЕ ДОЛЖЕН доверять значению неинициализированных переменных. Например, рассмотрим этот фрагмент кода (расширенный из вашего примера):

#include <iostream>

class Example {
public:
    int a, b, c;
    Example() : a(1), c(2) {}
};

void print(const Example& e) {
    std::cout << e.a << ' ' << e.b << ' ' << e.c << '\n';
}

int main()
{
    Example e, f, g;
    print(e);
    print(f);
    print(g);
    return 0;
}

Когда я запускаю его, я получаю:

1 32766 2
1 0 2
1 0 2

Очевидно, что значение b не следует доверять. Вы также должны получить предупреждение, которое гласит:

Конструктор не инициализирует эти поля: b

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

0 голосов
/ 08 ноября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...