Мне было интересно узнать о языке в спецификации C ++ 03, касающемся инициализации объекта, в частности, в разделе 8.5, параграф 9, в котором говорится:
"Если для объекта не указан инициализатор, и объект относится к (возможно, cv-квалифицированному) не классу POD (или
его массив), объект должен быть инициализирован по умолчанию; если объект имеет константный тип, базовый
Тип класса должен иметь объявленный пользователем конструктор по умолчанию. В противном случае, если для нестатического не указан инициализатор
объект, объект и его подобъекты, если таковые имеются, имеют неопределенное начальное значение; если объект или любой
его подобъекты относятся к константному типу, программа некорректна. "
Я хочу обратить особое внимание на предложение, "В противном случае, если для нестатического не указан инициализатор
объект, объект и его подобъекты, если таковые имеются, имеют неопределенное начальное значение ". В соответствии с пунктом 5 раздела 8.5 определение инициализации по умолчанию делится на три случая:
- если T является типом класса не POD (пункт 9), вызывается конструктор по умолчанию для T (и инициализация
плохо сформирован, если T не имеет доступного конструктора по умолчанию)
- если T является типом массива, каждый элемент инициализируется по умолчанию
- в противном случае объект инициализируется нулями.
Итак, насколько я понимаю, в параграфе 9 говорится, что если у нас есть тип класса не POD, у которого нет инициализатора, то будет вызван его конструктор по умолчанию. Что меня смущает, так это то, что происходит в случае типов POD-классов ... из вышеприведенного предложения видно, что нет упоминания о вызове конструктора по умолчанию, необходимого для типов POD-классов. И все же, если бы я создал тип POD-класса, такой как
struct POD_class
{
int a;
int b;
POD_class() { cout << "Default constructor called" << endl; }
};
int main()
{
POD_class test;
return 0;
}
конструктор по умолчанию POD_class
, кажется, вызывается, когда этот код компилируется и запускается с g++
. Следовательно, даже если у POD_class
не было определенного инициализатора, кажется, что он все еще инициализирован по умолчанию, для случая № 1 в определении инициализации по умолчанию, потому что был вызван конструктор по умолчанию для типа.
Исходя из описанного выше сценария, вот мой вопрос: для * POD-класса не инициализация объекта по умолчанию, как указано в параграфе 9 для нестатических POD-классов, означает, что его конструктор по умолчанию не является называется, или это просто не инициализируется нулями?