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

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

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

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

4 ответа

Решение

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

Смотрите живой пример здесь: struct demo

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

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

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

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

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

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

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

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

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 не определено, и его значение зависит от компилятора (в то время как a и b были установлены в true).

Явная инициализация по умолчанию может помочь:

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

Поведение bool a {} такой же как bool b = bool(); и вернуться false,

Другие вопросы по тегам