Вызывается ли конструктор по умолчанию автоматически для переменных-членов?

Скажем, у меня есть этот класс:

//Awesome.h
class Awesome
{
    public:
        Awesome();
    private:
        membertype member;
}

//Awesome.cpp
#include "Awesome.h"

Awesome::Awesome()
:member()
{
}

Если я опущу member() в списке инициализации конструктора AwesomeБудет конструктором member вызываться автоматически? И это только называется, когда я не включаю member в списке инициализации?

2 ответа

Решение

Из § 8.5

Если для объекта не указан инициализатор, объект инициализируется по умолчанию; если инициализация не выполняется, объект с автоматическим или динамическим сроком хранения имеет неопределенное значение. [Примечание: объекты со статическим или потоковым хранением инициализируются нулями, см. 3.6.2. —Конечная записка]

Обновление для будущих ссылок: далее значение инициализированного по умолчанию определяется как

По умолчанию инициализировать объект типа T означает:
- если T является (возможно, cv-квалифицированным) типом класса (раздел 9), вызывается конструктор по умолчанию для T (и инициализация некорректна, если у T нет доступного конструктора по умолчанию);
- если T является типом массива, каждый элемент инициализируется по умолчанию;
- иначе инициализация не выполняется.
Если программа вызывает инициализацию по умолчанию для объекта типа T с определением константы, T должен быть типом класса с предоставленным пользователем конструктором по умолчанию.

Далее это изменяется от значения, инициализированного, ссылаясь на это:

Инициализировать значение объекта типа T означает:
- если T является (возможно, cv-квалифицированным) типом класса (раздел 9) с предоставленным пользователем конструктором (12.1), то вызывается конструктор по умолчанию для T (и инициализация является некорректной, если у T нет доступного конструктора по умолчанию));
- если T является (возможно, cv-квалифицированным) типом класса, не являющимся объединением, без предоставленного пользователем конструктора, то объект инициализируется нулями и, если неявно объявленный конструктор T по умолчанию является нетривиальным, вызывается этот конструктор.
- если T является типом массива, то каждый элемент инициализируется значением;
- иначе объект инициализируется нулями.

Да. Когда переменная не указана в списке инициализаторов, она создается по умолчанию автоматически.

Конструкция по умолчанию означает, что если membertype это class или же struct, тогда он будет сжиматься по умолчанию, если это встроенный массив, то каждый элемент будет сконструирован по умолчанию, а если это встроенный тип, то инициализация не будет выполняться (если только Awesome объект имеет статическую или локальную для потока продолжительность хранения). Последний случай означает, что переменная-член может (и часто будет) содержать непредсказуемый мусор в случае, если Awesome Объект создается в стеке или размещается в куче.

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