Nullinitialisierung
Initialisiert ein Objekt mit dem Wert Null.
Inhalt |
[bearbeiten] Syntax
Beachten Sie, dass dies nicht die Syntax für die Null-Initialisierung ist, da diese keine dedizierte Syntax in der Sprache hat. Dies sind Beispiele für andere Arten von Initialisierungen, die möglicherweise eine Null-Initialisierung durchführen.
static T object ; |
(1) | ||||||||
T () ;T t T |
(2) | ||||||||
CharT array [ n ] = " short-sequence "; |
(3) | ||||||||
[bearbeiten] Erklärung
Die Null-Initialisierung wird in folgenden Situationen durchgeführt:
Die Auswirkungen der Null-Initialisierung sind:
- Wenn
Tein Skalartyp ist, wird das Objekt auf den Wert initialisiert, der durch explizites Umwandeln des Ganzzahl-Literals 0 (Null) inTerhalten wird. - Wenn
Tein Nicht-Union-Klassentyp ist,
- werden alle Füllbits mit Null-Bits initialisiert,
- wird jedes nicht-statische Datenelement Null-initialisiert,
- wird jedes nicht-virtuelle Basisklassen-Unterobjekt Null-initialisiert, und
- wenn das Objekt kein Basisklassen-Unterobjekt ist, wird jede virtuelle Basisklasse Null-initialisiert.
- Wenn
Tein Union-Typ ist,
- werden alle Füllbits mit Null-Bits initialisiert, und
- das erste nicht-statische benannte Datenelement des Objekts wird Null-initialisiert.
- Wenn
Tein Array-Typ ist, wird jedes Element Null-initialisiert. - Wenn
Tein Referenztyp ist, wird nichts unternommen.
[bearbeiten] Hinweise
Wie in nicht-lokaler Initialisierung beschrieben, werden statische und Thread-lokale(seit C++11) Variablen, die nicht konstant initialisiert werden, vor jeder anderen Initialisierung Null-initialisiert. Wenn die Definition einer nicht-klassischen, nicht-lokalen Variable keinen Initialisierer hat, dann bewirkt die Standardinitialisierung nichts und lässt das Ergebnis der früheren Null-Initialisierung unverändert.
Ein Null-initialisierter Zeiger ist der Nullzeigerwert seines Typs, auch wenn der Wert des Nullzeigers nicht ganzzahlig Null ist.
[bearbeiten] Beispiel
#include <iostream> #include <string> struct A { int a, b, c; }; double f[3]; // zero-initialized to three 0.0's int* p; // zero-initialized to null pointer value // (even if the value is not integral 0) std::string s; // zero-initialized to indeterminate value, then // default-initialized to "" by the std::string default constructor int main(int argc, char*[]) { delete p; // safe to delete a null pointer static int n = argc; // zero-initialized to 0 then copy-initialized to argc std::cout << "n = " << n << '\n'; A a = A(); // the effect is same as: A a{}; or A a = {}; std::cout << "a = {" << a.a << ' ' << a.b << ' ' << a.c << "}\n"; }
Mögliche Ausgabe
n = 1
a = {0 0 0}[bearbeiten] Defect reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| CWG 277 | C++98 | Zeiger können mit einem nicht-konstanten Ausdruck mit dem Wert 0 initialisiert werden, was kein Nullzeiger-Konstant ist |
muss mit einem ganzzahligen konstanten Ausdruck mit dem Wert 0 initialisiert werden |
| CWG 694 | C++98 | Null-Initialisierung für Klassentypen ignorierte Füllbits | Füllbits werden mit Null-Bits initialisiert |
| CWG 903 | C++98 | Null-Initialisierung für Skalartypen setzte den Anfangswert auf den Wert umgewandelt aus einem ganzzahligen konstanten Ausdruck mit Wert 0 |
das Objekt wird auf den Wert initialisiert umgewandelt aus dem Ganzzahl-Literal 0 |
| CWG 2026 | C++98 | Null-Initialisierung war so spezifiziert, dass sie immer zuerst auftritt, sogar vor der konstanten Initialisierung |
keine Null-Initialisierung, wenn konstante Initialisierung gilt |
| CWG 2196 | C++98 | Null-Initialisierung für Klassentypen ignorierte Basisklassen-Unterobjekte | diese werden ebenfalls Null-initialisiert |
| CWG 2253 | C++98 | es war unklar, ob Null-Initialisierung für unbenannte Bitfelder gilt |
sie gilt (alle Füllbits werden mit Null-Bits initialisiert) |