Подтвердить что ты не робот

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

Если мне нужно было инициализировать только несколько значений выбора структуры С++, было бы правильно:

struct foo {
    foo() : a(true), b(true) {}
    bool a;
    bool b;
    bool c;
 } bar;

Правильно ли я предполагаю, что в итоге получим один элемент struct под названием bar с элементами bar.a = true, bar.b = true и undefined bar.c?

4b9b3361

Ответ 1

Да. bar.a и bar.b установлены в значение true, но bar.c - undefined. Однако определенный компилятор установит значение false.

Смотрите живой пример здесь: демонстрационная версия

Согласно стандарту С++ Раздел 8.5.12:

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

Для примитивных встроенных типов данных ( bool, char, wchar_t, short, int, long, float, double, long double), только глобальные переменные (все статические переменные хранилища) получают значение по умолчанию, равное нулю, если они явно не инициализированы.

Если вы действительно не хотите, чтобы undefined bar.c начинался с, вы также должны инициализировать его так же, как и для bar.a и bar.b.

Ответ 2

Вам даже не нужно определять конструктор

struct foo {
    bool a = true;
    bool b = true;
    bool c;
 } bar;

Чтобы уточнить: они называются логическими или равными инициализаторами (потому что вы можете также использовать инициализацию скобки вместо знака равенства). Это не только для агрегатов: вы можете использовать это в обычных определениях классов. Это было добавлено в С++ 11.

Ответ 3

Вы можете сделать это, используя конструктор, например:

struct Date
{
int day;
int month;
int year;

Date()
{
    day=0;
    month=0;
    year=0;
}
};

или вот так:

struct Date
{
int day;
int month;
int year;

Date():day(0),
       month(0),
       year(0){}
};

В вашем случае bar.c есть undefined, и его значение зависит от компилятора (тогда как a и b установлены в true).