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 (Aist POD)new A()- Nullinitialisierungnew B- Standardkonstrukt (B::mist nicht initialisiert,Bist kein POD)new B()- Standardkonstrukt (B::mist nicht initialisiert)new C- Standardkonstrukt (C::mist nullinitialisiert,Ckein POD)new C()- Standardkonstrukt (C::mist nullinitialisiert)new D- Standardkonstrukt (D::mist nicht initialisiert,Dist kein POD)new D()- Standardkonstrukt? (D::mist nicht initialisiert)
In einem C ++ 03-konformen Compiler sollten die Dinge so funktionieren:
new A- unbestimmter Wert (Aist POD)new A()- WertinitialisierungA, dh Nullinitialisierung, da es sich um einen POD handelt.new B- Standardinitialisierung (lässtB::mnicht initialisiert,Bist kein POD)new B()- Wert initialisiertBdem 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::mist nullinitialisiert,Ckein POD)new C()- value-initializesC, der den Standard-ctor aufruft. (C::mist nullinitialisiert)new D- Standardkonstrukt (D::mist nicht initialisiert,Dist kein POD)new D()- Wert initialisiert D? , der den Standard-Ctor aufruft (D::mist 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::mnicht initialisiert) (Aist POD)new A()- Wertinitialisierung, dh NullinitialisierungAseit 2. Punkt in [dcl.init] / 8new B- Standard-InitialisierungenB, Compiler-Gen. ctor, (verlässtB::mnicht initialisiert) (Bist kein POD)new B()- value-initializes, beiBdem 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::mist nullinitialisiert,Ckein POD)new C()- value-initializesC, der den Standard-ctor aufruft. (C::mist nullinitialisiert)new D- StandardinitialisierungenD(D::mist nicht initialisiert,Dist kein POD)new D()- value-initializesD, der den Standard-ctor aufruft (D::mnicht initialisiert)new E- default-initializesE, wodurch der Comp aufgerufen wird. gen. ctor. (E::mist nicht initialisiert, E ist kein POD)new E()- WertinitialisierungenE, dieEseit 2 Punkten in [dcl.init] / 8 ) mit Null initialisiert werden )new F- default-initializesF, wodurch der Comp aufgerufen wird. gen. ctor. (F::mist nicht initialisiert,Fist 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 )FF
struct D { D() {}; int m; };kann es sich lohnen, es in Ihre Liste aufzunehmen.