Namespaces
Variants

Zero-initialization

From de.cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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 {} ; (seit C++11)

(2)
CharT array [ n ] = " short-sequence "; (3)

Erklärung

Null-Initialisierung wird in den folgenden Situationen durchgeführt:

1) Für jede benannte Variable mit statischer oder thread-lokaler (seit C++11) Speicherdauer , die nicht Konstanteninitialisierung unterliegt, vor jeder anderen Initialisierung.
2) Als Teil der Wertinitialisierung für Nicht-Klassen-Typen und für Mitglieder von wertinitialisierten Klassentypen ohne Konstruktoren, einschließlich der Wertinitialisierung von Elementen von Aggregaten , für die keine Initialisierer bereitgestellt werden.
3) Wenn ein Array eines beliebigen character type mit einem string literal initialisiert wird, das zu kurz ist, wird der Rest des Arrays mit Nullen initialisiert.

Die Auswirkungen der Null-Initialisierung sind:

  • Wenn T ein Skalartyp ist, wird das Objekt mit dem Wert initialisiert, der durch explizite Konvertierung des Integer-Literals ​ 0 ​ (Null) zu T erhalten wird.
  • Wenn T ein Nicht-Union-Klassentyp ist:
  • Wenn T ein Union-Typ ist:
  • alle Auffüllbits werden auf Null-Bits initialisiert, und
  • das erste nicht-statische benannte Datenmitglied des Objekts wird null-initialisiert.
  • Wenn T ein Array-Typ ist, wird jedes Element null-initialisiert.
  • Wenn T ein 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)

Siehe auch