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 (Ato POD)new A()- inicjalizacja zerowanew B- domyślna konstrukcja (nieB::mjest zainicjowana,Bnie jest POD)new B()- domyślna konstrukcja (B::mjest niezainicjowana)new C- domyślna konstrukcja (C::mjest zainicjowana przez zero,Cnie jest POD)new C()- domyślna konstrukcja (C::mjest inicjalizowana przez zero)new D- domyślna konstrukcja (nieD::mjest zainicjowana,Dnie jest POD)new D()- domyślna konstrukcja? (nieD::mjest zainicjowany)
W kompilatorze zgodnym z C ++ 03 wszystko powinno wyglądać tak:
new A- wartość nieokreślona (Ato POD)new A()- inicjalizacja wartościA, która jest inicjalizacją zerową, ponieważ jest to POD.new B- default-inicjalizuje (pozostawiaB::mniezainicjowany,Bnie jest POD)new B()- wartość-inicjalizuje,Bktó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::mjest zainicjowany przez zero,Cnie jest POD)new C()- inicjalizuje wartośćC, która wywołuje domyślny ctor. (C::mjest zainicjowany przez zero)new D- domyślna konstrukcja (nieD::mjest zainicjowana,Dnie jest POD)new D()- wartość-inicjalizuje D? , który wywołuje domyślnego ctora (D::mjest 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::mniezainicjalizowany) (Ajest 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::mniezainicjalizowany) (Bnie jest POD)new B()- wartość-inicjalizuje,Bktó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::mjest zainicjowany przez zero,Cnie jest POD)new C()- inicjalizuje wartośćC, która wywołuje domyślny ctor. (C::mjest zainicjowany przez zero)new D- default-inicjalizujeD(nieD::mjest zainicjowany ,Dnie jest POD)new D()- inicjalizuje wartośćD, która wywołuje domyślny ctor (D::mjest niezainicjowany)new E- default-inicjalizujeE, co wywołuje komp. gen. ctor. (nieE::mjest zainicjowany, E nie jest POD)new E()- inicjalizuje wartośćE, która inicjalizuje zeroEod 2 punktu w [dcl.init] / 8 )new F- default-inicjalizujeF, co wywołuje komp. gen. ctor. (nieF::mjest zainicjowany,Fnie jest POD)new F()- inicjalizuje wartośćF, która inicjalizuje się domyślnieFod 1. punktu w [dcl.init] / 8 (Ffunkcja 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 )