Namensräume
Varianten
Aktionen

Nullinitialisierung

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

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

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

[bearbeiten] Erklärung

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

1) Für jede benannte Variable mit statischer oder Thread-lokaler(seit C++11) Speicherdauer, die nicht einer konstanten Initialisierung unterliegt, vor jeder anderen Initialisierung.
2) Als Teil der Wert-Initialisierung-Sequenz für Nicht-Klassentypen und für Mitglieder von wert-initialisierten Klassentypen ohne Konstruktoren, einschließlich der Wert-Initialisierung von Elementen von Aggregaten, für die keine Initialisierer bereitgestellt werden.
3) Wenn ein Array eines beliebigen Zeichentyps mit einem zu kurzen String-Literal initialisiert wird, werden die verbleibenden Elemente des Arrays Null-initialisiert.

Die Auswirkungen der Null-Initialisierung sind:

  • Wenn T ein Skalartyp ist, wird das Objekt auf den Wert initialisiert, der durch explizites Umwandeln des Ganzzahl-Literals 0 (Null) in T erhalten wird.
  • Wenn T ein 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 T ein Union-Typ ist,
  • werden alle Füllbits mit Null-Bits initialisiert, und
  • das erste nicht-statische benannte Datenelement des Objekts wird Null-initialisiert.
  • Wenn T ein Array-Typ ist, wird jedes Element Null-initialisiert.
  • Wenn T ein 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)

[bearbeiten] Siehe auch