Вызывается ли конструктор по умолчанию автоматически для переменных-членов?
Скажем, у меня есть этот класс:
//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
Объект создается в стеке или размещается в куче.