Я очень запутался в инициализации значений, значений по умолчанию и нуля. и особенно когда они вступают в силу различных стандартов C ++ 03 и C ++ 11 (и C ++ 14 ).
Я цитирую и пытаюсь расширить действительно хороший ответ Value- / Default- / Zero- Init C ++ 98 и C ++ 03 здесь, чтобы сделать его более общим, поскольку это помогло бы многим пользователям, если бы кто-то мог помочь заполнить нужны пробелы, чтобы иметь хорошее представление о том, что и когда происходит?
Полный анализ примеров вкратце:
Иногда память, возвращаемая оператором new, будет инициализирована, а иногда это не будет зависеть от того, является ли тип, который вы обновляете, POD (простые старые данные) , или если это класс, который содержит члены POD и использует конструктор по умолчанию, созданный компилятором.
- В C ++ 1998 есть 2 типа инициализации: инициализация нуля и инициализация по умолчанию.
- В C ++ 2003 был добавлен 3-й тип инициализации - инициализация значения .
- В C ++ 2011 / C ++ 2014 была добавлена только инициализация списка, а правила для инициализации значения / значения по умолчанию / нуля немного изменены.
Предполагать:
struct A { int m; };
struct B { ~B(); int m; };
struct C { C() : m(){}; ~C(); int m; };
struct D { D(){}; int m; };
struct E { E() = default; int m;}; /** only possible in c++11/14 */
struct F {F(); int m;}; F::F() = default; /** only possible in c++11/14 */
В компиляторе C ++ 98 должно произойти следующее :
new A- неопределенное значение (APOD)new A()- нулевая инициализацияnew B- конструкция по умолчанию (B::mне инициализирована, неBявляется POD)new B()- конструкция по умолчанию (B::mне инициализирована)new C- конструкция по умолчанию (C::mинициализирована нулем, неCявляется POD)new C()- конструкция по умолчанию (C::mинициализируется нулем)new D- конструкция по умолчанию (D::mне инициализирована, неDявляется POD)new D()- конструкция по умолчанию? (D::mне инициализирован)
В компиляторе, совместимом с C ++ 03, все должно работать так:
new A- неопределенное значение (APOD)new A()- value-initializeA, что является нулевой инициализацией, поскольку это POD.new B- инициализируется по умолчанию (неB::mинициализируется, неBявляется POD)new B()- value-initializes,Bкоторый инициализирует нулем все поля, поскольку его ctor по умолчанию создается компилятором, а не определяемым пользователем.new C- default-initializesC, который вызывает ctor по умолчанию. (C::mинициализируется нулем, неCявляется POD)new C()- value-initializesC, который вызывает ctor по умолчанию. (C::mинициализируется нулем)new D- конструкция по умолчанию (D::mне инициализирована, неDявляется POD)new D()- инициализирует значение D? , который вызывает ctor по умолчанию (D::mне инициализирован)
Значения курсивом и? есть сомнения, пожалуйста, помогите исправить это :-)
В компиляторе, совместимом с C ++ 11, все должно работать так:
??? (пожалуйста, помогите, если я начну здесь, все равно пойдет не так)
В компиляторе, совместимом с C ++ 14, все должно работать так: ??? (пожалуйста, помогите, если я начну здесь, все равно пойдет не так) (Черновик на основе ответа)
new A- инициализируется по умолчаниюA, компилятор gen. ctor, (оставляетA::mнеинициализированным) (APOD)new A()- value-initializesA, что является нулевой инициализацией с момента 2. точки в [dcl.init] / 8new B- инициализируется по умолчаниюB, компилятор gen. ctor, (оставляетB::mнеинициализированным) (неBявляется POD)new B()- value-initializes,Bкоторый инициализирует нулем все поля, поскольку его ctor по умолчанию создается компилятором, а не определяемым пользователем.new C- default-initializesC, который вызывает ctor по умолчанию. (C::mинициализируется нулем, неCявляется POD)new C()- value-initializesC, который вызывает ctor по умолчанию. (C::mинициализируется нулем)new D- инициализируется по умолчаниюD(D::mне инициализируется, неDявляется POD)new D()- value-initializesD, который вызывает ctor по умолчанию (D::mне инициализирован)new E- default-initializesE, который вызывает comp. ген. ctor. (E::mне инициализирован, E не POD)new E()- значение-инициализируетE, который инициализируется нулем,Eначиная с 2 точки в [dcl.init] / 8 )new F- default-initializesF, который вызывает comp. ген. ctor. (F::mне инициализирован, неFявляется POD)new F()- инициализирует значениеF, которое инициализируется по умолчанию,Fначиная с 1. точки в [dcl.init] / 8 (Fфункция ctor предоставляется пользователем, если она объявлена пользователем и не используется явно по умолчанию или не удалена при первом объявлении. Ссылка )