Есть ли в структуре c ++ конструктор по умолчанию? - PullRequest
36 голосов
/ 26 ноября 2011

Я написал следующий фрагмент кода:

void foo()
{
    struct _bar_ 
    {
        int a;
    } bar; 

    cout << "Value of a is " << bar.a;
}

и скомпилировал его с помощью g ++ 4.2.1 (Mac).Вывод «Значение a равно 0».

Верно ли говорить, что элементы данных структуры в c ++ всегда инициализируются по умолчанию (по сравнению с c)?Или наблюдаемый результат - просто совпадение?

Я могу представить, что структуры в c ++ имеют конструктор по умолчанию (так как структура и класс почти одинаковы в c ++), что объясняет, почему член данных a barинициализируется до нуля.

Ответы [ 5 ]

48 голосов
/ 26 ноября 2011

Простой ответ - да.
У него есть конструктор по умолчанию.

Примечание: структура и класс идентичны (кроме состояния по умолчанию спецификаторов доступа).

Но то, будет ли он инициализировать элементы, будет зависеть от того, как объявлен фактический объект. В вашем примере no член не инициализирован и имеет неопределенное значение.

void func()
{
    _bar_  a;                 // Members are NOT initialized.
    _bar_  b = _bar_();       // Members are zero-initialized
    // From C++14
    _bar_  c{};               // New Brace initializer (Members are zero-initialized)


    _bar_* aP = new _bar_;    // Members are NOT initialized.
    _bar_* bP = new _bar_();  // Members are zero-initialized
    // From C++14
    _bar_  cP = new _bar_{};  // New Brace initializer (Members are zero-initialized)
}

// static storage duration objects
//   i.e. objects at the global scope.
_bar_ c; // Members are zero-initialized.

Точные детали поясняются в стандарте в 8.5 Initializers [dcl.init] параграфах 4-10. Но следующее упрощенное резюме для этой ситуации.

Структура без определяемого пользователем конструктора имеет созданный компилятором конструктор. Но то, что он делает, зависит от того, как он используется, и он либо по умолчанию инициализирует свои члены (что для типов POD обычно ничто), либо может инициализировать свои члены нулями (что для POD обычно означает устанавливать его члены равными нулю).

PS. Не используйте _ в качестве первого символа в имени типа. Вы столкнетесь с проблемами.

10 голосов
/ 26 ноября 2011

Верно ли говорить, что элементы данных структуры в c ++ всегда инициализируются по умолчанию (по сравнению с c)? Или наблюдаемый результат просто совпадение?

Это совпадение.

Ваш код вызывает неопределенное поведение; если вы явно не установите членов на 0, они могут быть чем угодно.

4 голосов
/ 26 ноября 2011

Не является ответом, но вы можете считать его ... если вы хотите попробовать:

void foo() {
   struct test {
      int value;
   } x;
   std::cout << x.value << std::endl;
   x.value = 1000;
}
int main() {
   foo();
   foo();
}

В вашем примере в памяти уже было значение 0 до того, как переменная быласозданный, так что вы можете назвать это счастливое совпадение (на самом деле, некоторые ОС обнуляют всю память перед запуском процесса, что означает, что 0 - довольно вероятное значение, которое можно найти в небольшой короткой программе)..), предыдущий код будет вызывать функцию дважды, а память первого вызова будет повторно использована во втором, скорее всего, во второй раз будет напечатано 1000. Обратите внимание, что значение по-прежнему не определено, и чтоэтот тест может показывать или не показывать ожидаемый результат (т. е. есть много вещей, которые может сделать компилятор, и будет генерировать другой результат ...)

1 голос
/ 26 ноября 2011

Переменные-члены структуры не инициализируются по умолчанию. Точно так же, как класс (поскольку структура - это то же самое, что и класс, только в структуре члены по умолчанию являются открытыми).

0 голосов
/ 26 ноября 2011

Не полагайтесь на эту функциональность, это нестандартно

просто добавьте

foo() : a() {}

Я не могу вспомнить точное состояние gcc 4.2 (я думаю, что оно слишком старое), но если вы использовали C ++ 11, вы можете сделать следующее

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