Jestem bardzo zdezorientowany co do inicjalizacji wartości i domyślnej oraz zerowej. a zwłaszcza wtedy, gdy zaczynają stosować różne standardy C ++ 03 i C ++ 11 (i C ++ 14 ).
Cytuję i próbuję rozszerzyć naprawdę dobrą odpowiedź Value- / Default- / Zero- Init C ++ 98 i C ++ 03 tutaj, aby uczynić ją bardziej ogólną, ponieważ pomogłoby to wielu użytkownikom, gdyby ktoś pomógł wypełnić potrzebne luki, aby mieć dobry przegląd tego, co się dzieje, kiedy?
Pełen wgląd w przykłady w pigułce:
Czasami pamięć zwrócona przez nowego operatora zostanie zainicjowana, a czasami nie będzie to zależało od tego, czy typ, który tworzysz, to POD (zwykłe stare dane) , czy też jest to klasa, która zawiera członków POD i używa Konstruktor domyślny generowany przez kompilator.
- W C ++ 1998 istnieją 2 typy inicjalizacji: inicjalizacja zerowa i inicjalizacja domyślna
- W C ++ 2003 dodano trzeci typ inicjalizacji: inicjalizacja wartości .
- W C ++ 2011 / C ++ 2014 dodano tylko inicjalizację listy, a zasady inicjalizacji wartości / domyślnej / zerowej nieco się zmieniły.
Założyć:
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 */
W kompilatorze C ++ 98 powinno wystąpić :
new A
- wartość nieokreślona (A
to POD)new A()
- inicjalizacja zerowanew B
- domyślna konstrukcja (nieB::m
jest zainicjowana,B
nie jest POD)new B()
- domyślna konstrukcja (B::m
jest niezainicjowana)new C
- domyślna konstrukcja (C::m
jest zainicjowana przez zero,C
nie jest POD)new C()
- domyślna konstrukcja (C::m
jest inicjalizowana przez zero)new D
- domyślna konstrukcja (nieD::m
jest zainicjowana,D
nie jest POD)new D()
- domyślna konstrukcja? (nieD::m
jest zainicjowany)
W kompilatorze zgodnym z C ++ 03 wszystko powinno wyglądać tak:
new A
- wartość nieokreślona (A
to POD)new A()
- inicjalizacja wartościA
, która jest inicjalizacją zerową, ponieważ jest to POD.new B
- default-inicjalizuje (pozostawiaB::m
niezainicjowany,B
nie jest POD)new B()
- wartość-inicjalizuje,B
która inicjalizuje wszystkie pola zerem, ponieważ jego domyślny procesor jest generowany przez kompilator, a nie zdefiniowany przez użytkownika.new C
- default-initializesC
, co wywołuje domyślny ctor. (C::m
jest zainicjowany przez zero,C
nie jest POD)new C()
- inicjalizuje wartośćC
, która wywołuje domyślny ctor. (C::m
jest zainicjowany przez zero)new D
- domyślna konstrukcja (nieD::m
jest zainicjowana,D
nie jest POD)new D()
- wartość-inicjalizuje D? , który wywołuje domyślnego ctora (D::m
jest niezainicjowany)
Wartości kursywą i? są niejasne, pomóż to poprawić :-)
W kompilatorze zgodnym z C ++ 11 wszystko powinno wyglądać tak:
??? (proszę o pomoc, jeśli zacznę tutaj, to i tak pójdzie źle)
W kompilatorze zgodnym z C ++ 14 wszystko powinno wyglądać tak: ??? (proszę o pomoc, jeśli zacznę tutaj, to i tak pójdzie źle) (Wersja robocza oparta na odpowiedzi)
new A
- default-inicjalizujeA
, kompilator gen. ctor, (odchodziA::m
niezainicjalizowany) (A
jest POD)new A()
- inicjalizacja wartościA
, która jest inicjalizacją zerową od 2. punktu w [dcl.init] / 8new B
- default-inicjalizujeB
, kompilator gen. ctor, (opuszczaB::m
niezainicjalizowany) (B
nie jest POD)new B()
- wartość-inicjalizuje,B
która inicjalizuje wszystkie pola zerem, ponieważ jego domyślny procesor jest generowany przez kompilator, a nie zdefiniowany przez użytkownika.new C
- default-initializesC
, co wywołuje domyślny ctor. (C::m
jest zainicjowany przez zero,C
nie jest POD)new C()
- inicjalizuje wartośćC
, która wywołuje domyślny ctor. (C::m
jest zainicjowany przez zero)new D
- default-inicjalizujeD
(nieD::m
jest zainicjowany ,D
nie jest POD)new D()
- inicjalizuje wartośćD
, która wywołuje domyślny ctor (D::m
jest niezainicjowany)new E
- default-inicjalizujeE
, co wywołuje komp. gen. ctor. (nieE::m
jest zainicjowany, E nie jest POD)new E()
- inicjalizuje wartośćE
, która inicjalizuje zeroE
od 2 punktu w [dcl.init] / 8 )new F
- default-inicjalizujeF
, co wywołuje komp. gen. ctor. (nieF::m
jest zainicjowany,F
nie jest POD)new F()
- inicjalizuje wartośćF
, która inicjalizuje się domyślnieF
od 1. punktu w [dcl.init] / 8 (F
funkcja ctor jest dostarczana przez użytkownika, jeśli została zadeklarowana przez użytkownika i nie została jawnie ustawiona jako domyślna lub usunięta przy pierwszej deklaracji. Link )