Я очень запутался в инициализации значений, значений по умолчанию и нуля. и особенно когда они вступают в силу различных стандартов 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
- неопределенное значение (A
POD)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
- неопределенное значение (A
POD)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
неинициализированным) (A
POD)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 предоставляется пользователем, если она объявлена пользователем и не используется явно по умолчанию или не удалена при первом объявлении. Ссылка )