Вопрос о семантике инициализации объекта - PullRequest
1 голос
/ 12 августа 2011

Мне было интересно узнать о языке в спецификации C ++ 03, касающемся инициализации объекта, в частности, в разделе 8.5, параграф 9, в котором говорится:

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

Я хочу обратить особое внимание на предложение, "В противном случае, если для нестатического не указан инициализатор объект, объект и его подобъекты, если таковые имеются, имеют неопределенное начальное значение ". В соответствии с пунктом 5 раздела 8.5 определение инициализации по умолчанию делится на три случая:

  1. если T является типом класса не POD (пункт 9), вызывается конструктор по умолчанию для T (и инициализация плохо сформирован, если T не имеет доступного конструктора по умолчанию)
  2. если T является типом массива, каждый элемент инициализируется по умолчанию
  3. в противном случае объект инициализируется нулями.

Итак, насколько я понимаю, в параграфе 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-классов, означает, что его конструктор по умолчанию не является называется, или это просто не инициализируется нулями?

1 Ответ

5 голосов
/ 12 августа 2011

Ваш POD_class на самом деле не класс POD.Класс POD не может иметь объявленного пользователем конструктора.

...