c++ - умолчанию - наследование конструкторов с++




Конструктор c++ имеет конструктор по умолчанию? (4)

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

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 из строки инициализируется равным нулю.


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

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

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


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

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

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


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


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

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

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

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. Не используйте _ как первый символ в имени типа. Вы столкнетесь с проблемами.







c++