Frage

Ich bin mir ziemlich sicher, dass arrays von eingebauten Typen sind nicht initialisiertes, in der Erwägung, dass arrays von UDTs default-initialisiert.

int foo[5]; // will contain junk
Foo foo[5]; // will contain 5 Foo objects that are default initialized

Dies geschieht unabhängig davon, ob das array zugeordnet ist, auf dem stack oder heap.

Aber ich finde es schwer zu finden eine autorisierende Quelle dazu.Bjarne besagt, dass:

"Die Mitglieder von arrays und Strukturen werden standardmäßig initialisiert oder nicht, abhängig davon, ob der array-oder Struktur ist statisch", das nicht wirklich sagen mir auch viel.

Ich habe auch versucht, etwas zu finden, in der standard, aber bisher nicht ohne Erfolg.

Kennt jemand eine verbindliche Quelle, um zu bestätigen die oben genannten?

War es hilfreich?

Lösung

ISO C++03 ist in etwa so MAßGEBEND, wie es geht:

Eine POD-Struktur ist ein Aggregat-Klasse, die hat keine nicht-statischen Daten-member des Typs nicht-POD-Struktur, nicht-POD-union (oder ein array solcher Arten) oder ein Verweis, und keine Benutzer-definierten copy-Zuweisungsoperator und keine benutzerdefinierten Destruktor.Ebenso ein POD-union ist ein Aggregat union, die keine nicht-statischen Daten-member des Typs nicht-POD-Struktur, nicht-POD-union (oder ein array solcher Arten) oder ein Verweis, und keine Benutzer-definierten copy-Zuweisungsoperator und keine benutzerdefinierten Destruktor.Eine POD-Klasse ist eine Klasse, die entweder eine POD-Struktur oder ein POD-union.

Arithmetische Typen (3.9.1), enumeration types, pointer types, und Zeiger auf member-Typen (3.9.2), und cv-qualifizierte Versionen dieser Typen (3.9.3), werden zusammenfassend als Skalare Typen.Skalare Typen, POD-struct-Typen, POD-union-Typen (Klausel 9), arrays auf diese Art und cv-qualifizierte Versionen dieser Typen (3.9.3), werden zusammenfassend als POD-Typen.

Null-Initialisierung eines Objekts des Typs T bedeutet:

  • wenn T ein Skalar-Typ (3.9), wird das Objekt auf den Wert 0 (null) umgewandelt, T;
  • wenn T ein nicht-union-Klassentyp, jedes nicht statische Datenelement und jede Basis-Klasse teilobjekt ist null initialisiert;
  • wenn " T " ist eine union geben, das Objekt zuerst genannten Daten ist Mitglied der null-initialisiert;
  • wenn T ein array-Typ, jedes element ist auf null initialisiert;
  • wenn T ein Referenztyp ist keine Initialisierung durchgeführt.

Auf default-Initialisierung eines Objekts des Typs T bedeutet:

  • wenn T ein nicht-POD-Klasse Typ (Klausel 9), wird der Standardkonstruktor für T aufgerufen wird (und die Initialisierung ist schlecht ausgebildet, wenn T keinen zugänglichen default constructor);
  • wenn T ein array-Typ, jedes element ist standardmäßig initialisiert;
  • andernfalls wird das Objekt mit null initialisiert.

Wert-Initialisierung eines Objekts des Typs T bedeutet:

  • wenn T ein Klassentyp (Ziffer 9), die einen vom Benutzer deklarierten Konstruktor (12.1), dann wird der Standardkonstruktor für T aufgerufen wird (und die Initialisierung ist schlecht ausgebildet, wenn T keinen zugänglichen default constructor);
  • wenn T ein nicht-union-Klassentyp ohne ein Benutzer-Konstruktor deklariert ist, so ist jeder nicht-statischen Daten-member und Basis-Klasse-Komponente von T ist-Wert initialisiert;
  • wenn T ein array-Typ, dann jedes element wird mit dem Wert initialisiert wird;
  • andernfalls wird das Objekt mit null initialisiert

Jedes Objekt von statischer Speicher-Dauer ist null initialisiert werden bei Programm-Start, bevor andere Initialisierung stattfindet.[Hinweis:in einigen Fällen, zusätzliche Initialisierung erfolgt später.]

Ein Objekt, dessen Initialisierung ist ein leeres Klammernpaar, d.h., (), wird mit dem Wert initialisiert wird.

Wenn kein Initialisierer angegeben ist für ein Objekt, und das Objekt ist von (möglicherweise cv-Qualifizierter) nicht-POD-Klasse-Typ (oder ein array davon), das Objekt standardmäßig initialisiert;wenn das Objekt ist von const-qualifizierten Typ, die zugrunde liegende Klasse Typ muss ein Benutzer deklarierte Standardkonstruktor.Ansonsten, wenn kein Initialisierer angegeben ist für ein nicht-statisches Objekt, das Objekt und seine Unterobjekte, wenn überhaupt, sich auf unbestimmte initial value);wenn das Objekt oder eines seiner Unterobjekte sind von const-qualifizierten Typ, das Programm ist schlecht geformt.

Für Ihr Beispiel, int ist definitiv ein POD-Typ (es ist ein arithmetischer Typ), und deshalb wird ein lokales oder ein Feld vom Typ int, in der Abwesenheit von Initialisierer haben, werden einen unbestimmten Wert.Für Foo, dies hängt davon ab, wie es definiert ist - grob gesprochen, wenn Sie nicht über einen Konstruktor, und alle seine Mitglieder werden von POD-Typen, dann ist es selbst ein POD-Typ, und keine Initialisierung erfolgt entweder.Andernfalls wird der Standard-Konstruktor aufgerufen wird.Selbst dann bedeutet das nicht, dass Mitglieder initialisiert - Regeln sind rekursiv, so dass POD-Mitglieder nicht-POD-Typ wird nicht initialisiert werden, es sei denn, der Konstruktor von dieser Art sind ausdrücklich nicht, dass (in der Initialisierungsliste).

Statische Variablen und Felder in allen Fällen null initialisiert werden.Beachten Sie, dass dies für nicht-PODs zu - was bedeutet, dass eine statische variable einer Klasse geben wird garantiert alle Felder rekursiv gesetzt (T)0 noch bevor der Konstruktor ausgeführt wird.

A handy trick to default-initialisiert alle aggregierten POD-Typ ist die Verwendung {} im Initialisierer - beachten Sie, dass es funktioniert mit structs und arrays:

char s[10] = {}; // all elements default-initialized
Foo foo = {};    // all fields recursively default-initialized

Andere Tipps

Es heißt in dem C ++ Standard in 8.5.9:

  

Wenn kein Initialisierer für eine spezifizierte   -Objekt, und das Objekt der (möglicherweise   cv-qualifiziert) nicht-POD Klassentyp (oder   davon) Array, wird das Objekt sein,   default-initialisiert; wenn das Objekt   von const qualifizierten Typ, die   zugrunde liegende Klassentyp wird hat eine   Benutzer erklärt Standardkonstruktors.   Andernfalls, wenn kein Initialisierer ist   für ein nicht-statisches Objekt spezifiziert, das   Objekt und seine Unterobjekte, sofern vorhanden,   haben einen unbestimmten Anfangswert.

  

„Mitglieder des Arrays und Strukturen sind Standard initialisiert oder nicht, je nachdem, ob die Anordnung oder Struktur ist statisch“

Dies ist maßgebend, auch wenn es klarer sein könnte:

  • Arrays und Strukturen als static deklariert werden auf Nullen initialisiert.
  • Lokale Arrays und Strukturen von integrierten Typen ( d. Typen, die keine Konstrukteure haben) nicht initialisiert.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top