Ich bin sehr verwirrt über Wert- & Standard- & Null-Initialisierung. und vor allem, wenn sie sich für die verschiedenen Standards C ++ 03 und C ++ 11 (und C ++ 14 ) einsetzen.
Ich zitiere und versuche, eine wirklich gute Antwort Value- / Default- / Zero-Init C ++ 98 und C ++ 03 hier zu erweitern, um sie allgemeiner zu gestalten, da es vielen Benutzern helfen würde, wenn jemand beim Ausfüllen helfen könnte Benötigten Sie Lücken, um einen guten Überblick darüber zu erhalten, was wann passiert?
Der vollständige Einblick anhand von Beispielen auf den Punkt gebracht:
Manchmal wird der vom neuen Operator zurückgegebene Speicher initialisiert, und manchmal hängt es nicht davon ab, ob der Typ, den Sie neu erstellen, ein ist POD (einfache alte Daten) ist oder ob es sich um eine Klasse handelt, die POD-Mitglieder enthält und eine verwendet Vom Compiler generierter Standardkonstruktor.
- In C ++ 1998 gibt es zwei Arten der Initialisierung: Null- und Standardinitialisierung
- In C ++ 2003 wurde eine dritte Art der Initialisierung, die Wertinitialisierung, hinzugefügt.
- In C ++ 2011 / C ++ 2014 nur list-Initialisierung wurde hinzugefügt und die Regeln für die wert- / Default- / Null-Initialisierung ein wenig verändert.
Annehmen:
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 */
In einem C ++ 98-Compiler sollte Folgendes auftreten :
new A
- unbestimmter Wert (A
ist POD)new A()
- Nullinitialisierungnew B
- Standardkonstrukt (B::m
ist nicht initialisiert,B
ist kein POD)new B()
- Standardkonstrukt (B::m
ist nicht initialisiert)new C
- Standardkonstrukt (C::m
ist nullinitialisiert,C
kein POD)new C()
- Standardkonstrukt (C::m
ist nullinitialisiert)new D
- Standardkonstrukt (D::m
ist nicht initialisiert,D
ist kein POD)new D()
- Standardkonstrukt? (D::m
ist nicht initialisiert)
In einem C ++ 03-konformen Compiler sollten die Dinge so funktionieren:
new A
- unbestimmter Wert (A
ist POD)new A()
- WertinitialisierungA
, dh Nullinitialisierung, da es sich um einen POD handelt.new B
- Standardinitialisierung (lässtB::m
nicht initialisiert,B
ist kein POD)new B()
- Wert initialisiertB
dem alle Felder mit Null initialisiert werden, da der Standard-ctor vom Compiler generiert wird und nicht benutzerdefiniert.new C
- default-initializesC
, der den Standard-ctor aufruft. (C::m
ist nullinitialisiert,C
kein POD)new C()
- value-initializesC
, der den Standard-ctor aufruft. (C::m
ist nullinitialisiert)new D
- Standardkonstrukt (D::m
ist nicht initialisiert,D
ist kein POD)new D()
- Wert initialisiert D? , der den Standard-Ctor aufruft (D::m
ist nicht initialisiert)
Kursive Werte und? Sind Unsicherheiten, bitte helfen Sie dies zu korrigieren :-)
In einem C ++ 11-konformen Compiler sollten die Dinge so funktionieren:
??? (Bitte helfen Sie, wenn ich hier anfange, wird es sowieso schief gehen)
In einem C ++ 14-konformen Compiler sollten die Dinge so funktionieren: ??? (Bitte helfen Sie, wenn ich hier anfange, wird es trotzdem schief gehen) (Entwurf basierend auf Antwort)
new A
- Standard-InitialisierungenA
, Compiler-Gen. ctor, (verlässtA::m
nicht initialisiert) (A
ist POD)new A()
- Wertinitialisierung, dh NullinitialisierungA
seit 2. Punkt in [dcl.init] / 8new B
- Standard-InitialisierungenB
, Compiler-Gen. ctor, (verlässtB::m
nicht initialisiert) (B
ist kein POD)new B()
- value-initializes, beiB
dem alle Felder mit Null initialisiert werden, da der Standard-ctor vom Compiler generiert wird und nicht benutzerdefiniert.new C
- default-initializesC
, der den Standard-ctor aufruft. (C::m
ist nullinitialisiert,C
kein POD)new C()
- value-initializesC
, der den Standard-ctor aufruft. (C::m
ist nullinitialisiert)new D
- StandardinitialisierungenD
(D::m
ist nicht initialisiert,D
ist kein POD)new D()
- value-initializesD
, der den Standard-ctor aufruft (D::m
nicht initialisiert)new E
- default-initializesE
, wodurch der Comp aufgerufen wird. gen. ctor. (E::m
ist nicht initialisiert, E ist kein POD)new E()
- WertinitialisierungenE
, dieE
seit 2 Punkten in [dcl.init] / 8 ) mit Null initialisiert werden )new F
- default-initializesF
, wodurch der Comp aufgerufen wird. gen. ctor. (F::m
ist nicht initialisiert,F
ist kein POD)new F()
- value-initializesF
, die seit dem 1. Punkt in [dcl.init] / 8 standardmäßig initialisiert werden ( ctor-Funktion wird vom Benutzer bereitgestellt, wenn sie vom Benutzer deklariert und bei ihrer ersten Deklaration nicht explizit standardmäßig standardisiert oder gelöscht wird. Link )F
F
struct D { D() {}; int m; };
kann es sich lohnen, es in Ihre Liste aufzunehmen.