Zero-initialization
Setzt den Anfangswert eines Objekts auf null.
Inhaltsverzeichnis |
Syntax
Beachten Sie, dass dies nicht die Syntax für Null-Initialisierung ist, die keine dedizierte Syntax in der Sprache hat. Dies sind Beispiele anderer Initialisierungsarten, die möglicherweise Null-Initialisierung durchführen.
static
T
object
;
|
(1) | ||||||||
T
()
;
T
t
T
|
(2) | ||||||||
CharT
array
[
n
]
=
"
short-sequence
";
|
(3) | ||||||||
Erklärung
Null-Initialisierung wird in den folgenden Situationen durchgeführt:
Die Auswirkungen der Null-Initialisierung sind:
-
Wenn
Tein Skalartyp ist, wird das Objekt mit dem Wert initialisiert, der durch explizite Konvertierung des Integer-Literals 0 (Null) zuTerhalten wird. -
Wenn
Tein Nicht-Union-Klassentyp ist:
-
- alle Padding-Bits werden auf Null-Bits initialisiert,
- jedes nicht-statische Datenmitglied wird null-initialisiert,
- jede nicht-virtuelle Basisklassen- Unterobjekt wird null-initialisiert, und
- wenn das Objekt kein Basisklassen-Unterobjekt ist, wird jedes virtuelle Basisklassen -Unterobjekt null-initialisiert.
-
Wenn
Tein Union-Typ ist:
-
- alle Auffüllbits werden auf Null-Bits initialisiert, und
- das erste nicht-statische benannte Datenmitglied des Objekts wird null-initialisiert.
-
Wenn
Tein Array-Typ ist, wird jedes Element null-initialisiert. -
Wenn
Tein Referenztyp ist, wird nichts unternommen.
Hinweise
Wie beschrieben in non-local initialization , werden statische und thread-lokale (since C++11) Variablen, die nicht constant-initialized sind, zero-initialized, bevor eine andere Initialisierung stattfindet. Wenn die Definition einer Nicht-Klassen-Nicht-Lokal-Variable keinen Initialisierer hat, dann tut default initialization nichts und lässt das Ergebnis der früheren zero-initialization unverändert.
Ein null-initialisierter Zeiger ist der Nullzeigerwert seines Typs, selbst wenn der Wert des Nullzeigers nicht integral Null ist.
Beispiel
#include <iostream> #include <string> struct A { int a, b, c; }; double f[3]; // nullinitialisiert auf drei 0.0 int* p; // nullinitialisiert auf Nullzeigerwert // (selbst wenn der Wert nicht integral 0 ist) std::string s; // nullinitialisiert auf unbestimmten Wert, dann // standardinitialisiert auf "" durch den std::string-Standardkonstruktor int main(int argc, char*[]) { delete p; // sicher, einen Nullzeiger zu löschen static int n = argc; // nullinitialisiert auf 0 dann kopierinitialisiert auf argc std::cout << "n = " << n << '\n'; A a = A(); // der Effekt ist derselbe wie: A a{}; oder A a = {}; std::cout << "a = {" << a.a << ' ' << a.b << ' ' << a.c << "}\n"; }
Mögliche Ausgabe:
n = 1
a = {0 0 0}
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| CWG 277 | C++98 |
Zeiger könnten mit einem nicht-konstanten
Ausdruck des Wertes 0 initialisiert werden, was keine Nullzeiger-Konstante ist |
muss mit einem integralen
konstanten Ausdruck des Wertes 0 initialisiert werden |
| CWG 694 | C++98 | Nullinitialisierung für Klassentypen ignorierte Padding | Padding wird mit Null-Bits initialisiert |
| CWG 903 | C++98 |
Nullinitialisierung für skalare Typen setzte den Anfangswert auf den Wert
konvertiert von einem integralen konstanten Ausdruck mit Wert 0 |
das Objekt wird auf den Wert
konvertiert vom Integer-Literal 0 initialisiert |
| CWG 2026 | C++98 |
Nullinitialisierung war spezifiziert, immer
zuerst aufzutreten, sogar vor konstanter Initialisierung |
keine Nullinitialisierung wenn
konstante Initialisierung anwendbar ist |
| CWG 2196 | C++98 | Nullinitialisierung für Klassentypen ignorierte Basisklassen-Subobjekte | diese werden ebenfalls nullinitialisiert |
| CWG 2253 | C++98 |
es war unklar, ob Nullinitialisierung
auf unbenannte Bitfelder anwendbar ist |
sie ist anwendbar (alle Padding-Bits
werden mit Null-Bits initialisiert) |