Initialisierung von Variablen
-
Hallo
Unter welchen Voraussetzungen darf ich annehmen, dass eingebaute Typen mit 0 initialisiert werden?
int v0; //hier? void f() { static int v1; //hier? int v2; //hier? } struct s { int v3; }; int main() { s v4; //hier? int* v5 = new int; //hier? delete v5; } template<class T> void g() { T v6; //hier? (im Falle dass T == int) }
-
int v0; //hier? ja (global) void f() { static int v1; //hier? ja (statisch) int v2; //hier? nein (lokal) } struct s { int v3; }; int main() { s v4; //hier? nein (lokal + POD) s v4a = {}; //hier? ja (Aggregat-Initialisierung, bzw. Uniform Initialization in C++11) s v4b = s(); //hier? ja (Kopier-Initialisierung) int* v5 = new int; //hier? nein int* v5a = new int(); //hier? ja int* v5b = new int[7]; //hier? nein int* v5c = new int[7](); //hier? ja delete v5; delete v5a; delete[] v5b; delete[] v5c; } template<class T> void g() { T v6; //hier? nein (immer noch lokal) }Grundsätzlich werden lokale Variablen von skalaren oder POD-Typen nicht initialisiert. Bei Klassen hängt es davon ab, ob ein Defaultkonstruktor definiert ist, der eine allfällige Initialisierung vornimmt.
-
v0 == 0
v1 == 0
v2 undefiniert
v3/v4 undefiniert (Merke:v4 = s()wäre mit 0 initialisiert)
v5 undefiniert (Merke:new int()wäre mit 0 initialisiert)
v6 undefiniert (Merke:v6 = T()wäre mit 0 initialisiert)Ich hoffe, ich bin selber nicht durcheinander gekommen
. Merkregel: Objekte mit statischer Lebensdauer werden zero-initialized. Lokale Objekte nicht. Wenn du value-initialized (mit leeren Klammern), so ist dies für POD-Typen eine Initialisierung mit 0.P.S.:
http://en.cppreference.com/w/cpp/language/initialization
http://en.cppreference.com/w/cpp/language/zero_initialization
http://en.cppreference.com/w/cpp/language/value_initialization
http://stackoverflow.com/questions/3102096/when-do-c-pod-types-get-zero-initializededit: Zu langsam.
-
v4b verstehe ich nicht ganz. Der Default-Konstruktor eines POD's initialisiert zwar alle Built-In-Member mit 0, jedoch wird der Default-Konstruktor eines POD's beim Erstellen des POD's nicht aufgerufen?
-
Der Default-Konstruktor eines POD's initialisiert zwar alle Built-In-Member mit 0
Nein, wieso sollte er?
§5.2.3/2 schrieb:
The expression T() [...] creates a prvalue of the specified type, whose value is that produced by value-initializing (8.5) an object of type T
§8.5/8 schrieb:
To value-initialize an object of type T means:
— if T is a [...] class type without a user-provided or deleted default constructor, then the object is zero-initialized [..]§8.5/6 schrieb:
To zero-initialize an object or reference of type T means:
— if T is a [...] non-union class type, each non-static data member [...] is zero-initialized and padding is initialized to zero bits;
-
Ah, ich sehe in den Standard-Quotes, dass da das Verhalten vom generierten Default-Konstruktor ganz anders ist als das vom manuell geschriebenen Default-Konstruktor.
Danke allen für die Hilfe.
-
KeineKlassenMachen schrieb:
Ah, ich sehe in den Standard-Quotes, dass da das Verhalten vom generierten Default-Konstruktor ganz anders ist als das vom manuell geschriebenen Default-Konstruktor.
Würde ich so nicht sagen. Der compilergenerierte Defaultkonstruktor entspricht einem leeren, manuell definierten Defaultkonstruktor. Damit das Verhalten anders ist, musst du explizit Variablen initialisieren.