Можно ссылочку на стандарт, где написано, что там должны быть нули? Я просто давно в это не вникал, т.к. не использую переменные до их явной инициализации.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
If no initializer is specified for an object, and the object is of (possibly cv-qualified) non-POD class type (or array thereof), the object shall be default-initialized; if the object is of const-qualified type, the underlying class type shall have a user-declared default constructor. Otherwise, if no initializer is specified for a non-static object, the object and its subobjects, if any, have an indeterminate initial value; if the object or any of its subobjects are of const-qualified type, the program is ill-formed.
Для POD-типов запись T x = T(), *px = new T() — это value-initialization, приводящая к zero-initialization.
Тогда как для не-POD-типов — это default-initialization.
Поскольку derived формально является не-POD, то у него есть неявный конструктор без параметров, не инициализирующий POD-базы и члены.
Отсюда и мусор.
Статические же объекты всегда сначала обнуляются, а потом уже инициализируются в рантайме. (Компилятор вправе оптимизировать это, сразу инициализировав статическое хранилище константами).
Кстати, эта двухступенчатая инициализация является источником unspecified behavior (а то и undefined, если постараться ) при обращении к статическим объектам.
С вашего позволения, не приведу цитаты стандарта, а только укажу параграфы
— 3.6.2 Start and termination / Initialization of non-local objects
— 8.5:5 Initializers / zero-, default-, value-initializer
— 12.6.2:4 Special member functions / Initializing bases and members
Впрочем, последнее как раз и стоит процитировать.
If a given nonstatic data member or base class is not named by a mem-initializer-id (including the case where there is no mem-initializer-list because the constructor has no ctor-initializer), then
— If the entity is a nonstatic data member of (possibly cv-qualified) class type (or array thereof) or a base class, and the entity class is a non-POD class, the entity is default-initialized (8.5). If the entity is a nonstatic data member of a const-qualified type, the entity class shall have a user-declared default constructor.
— Otherwise, the entity is not initialized. If the entity is of const-qualified type or reference type, or of a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of a const-qualified type, the program is ill-formed.
Здравствуйте, Кодт, Вы писали:
К>Для POD-типов запись T x = T(), *px = new T() — это value-initialization, приводящая к zero-initialization. К>Тогда как для не-POD-типов — это default-initialization. К>Поскольку derived формально является не-POD, то у него есть неявный конструктор без параметров, не инициализирующий POD-базы и члены. К>Отсюда и мусор.
Для не-POD без конструктора точно так будет в случае: T x = T(), *px = new T() ?
Не должна ли рекурсивно для всех членов вызваться value-initialization ?
Здравствуйте, ilvi, Вы писали:
I>Здравствуйте, Кодт, Вы писали:
К>>Для POD-типов запись T x = T(), *px = new T() — это value-initialization, приводящая к zero-initialization. К>>Тогда как для не-POD-типов — это default-initialization. К>>Поскольку derived формально является не-POD, то у него есть неявный конструктор без параметров, не инициализирующий POD-базы и члены. К>>Отсюда и мусор.
I>Для не-POD без конструктора точно так будет в случае: T x = T(), *px = new T() ? I>Не должна ли рекурсивно для всех членов вызваться value-initialization ?
Здравствуйте, ilvi, Вы писали:
К>>Для POD-типов запись T x = T(), *px = new T() — это value-initialization, приводящая к zero-initialization. К>>Тогда как для не-POD-типов — это default-initialization. К>>Поскольку derived формально является не-POD, то у него есть неявный конструктор без параметров, не инициализирующий POD-базы и члены. К>>Отсюда и мусор.
I>Для не-POD без конструктора точно так будет в случае: T x = T(), *px = new T() ? I>Не должна ли рекурсивно для всех членов вызваться value-initialization ?
Сказано же: рекурсивно вызывается либо default-initialization (если элемент — не-POD), либо ничего не вызывается.
Итого, если развернуть всё дерево, ни один член не будет инициализирован, если это не делается явно.
Да, это подлянка, зашитая в стандарт, ради того, чтобы не платить за то, что не прошено.
Вот если бы в языке было две формы конструктора "без параметров" — минимальный и тотальный...
Здравствуйте, kvser, Вы писали:
K>Здравствуйте, ilvi, Вы писали:
I>>Здравствуйте, Кодт, Вы писали:
К>>>Для POD-типов запись T x = T(), *px = new T() — это value-initialization, приводящая к zero-initialization. К>>>Тогда как для не-POD-типов — это default-initialization. К>>>Поскольку derived формально является не-POD, то у него есть неявный конструктор без параметров, не инициализирующий POD-базы и члены. К>>>Отсюда и мусор.
I>>Для не-POD без конструктора точно так будет в случае: T x = T(), *px = new T() ? I>>Не должна ли рекурсивно для всех членов вызваться value-initialization ?
K>http://rsdn.ru/Forum/Info/FAQ.cpp.newnnew.aspx
Если это не-POD-класс-тип без явно объявленного конструктора, то в первом случае будет рекурсивно применена value-initialization к каждому подобъекту этого класса (что при этом получится — зависит о типов этих подобъектов),