Initialisierung (Zum Mitschreiben / FAQ / etc.)


  • Mod

    Initialisierung eines Objektes bedeutet, dass der Inhalt/Wert einer Entität (Objekt bzw. Referenz) in einen mehr oder minder wohldefinierten (Anfangs-)Zustand versetzt wird.
    Außerdem fällt für bestimmte Arten von Objekten und Initialisierungen der Zeitpunkt des Abschlusses der Initialisierung mit dem Beginn der Lebensdauer des Objektes zusammen.

    Generell sind zwei verscheidene Initialisierungstypen unterscheidbar: solche, bei denen bestimmter Anfangswert (initialiser) explizit im Code vorgegeben wird, und solche, bei denen das nicht der Fall.
    Ich fange mit dem zweiten Fall (kein Initialisierer) an.
    Der Standard kennt hierbei drei Arten:
    zero-Initialisierung, default-Initialisierung und value-Initialisierung.

    C++11 schrieb:

    8.5 Initializers [dcl.init]
    [...]
    5 To zero-initialize an object or reference of type T means:
    — if T is a scalar type (3.9), the object is set to the value 0 (zero), taken as an integral constant expression, converted to T;
    — if T is a (possibly cv-qualified) non-union class type, each non-static data member and each base-class subobject is zero-initialized and padding is initialized to zero bits;
    — if T is a (possibly cv-qualified) union type, the object’s first non-static named data member is zeroinitialized and padding is initialized to zero bits;
    — if T is an array type, each element is zero-initialized;
    — if T is a reference type, no initialization is performed.

    6 To default-initialize an object of type T means:
    — if T is a (possibly cv-qualified) class type (Clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
    — if T is an array type, each element is default-initialized;
    — otherwise, no initialization is performed.
    If a program calls for the default initialization of an object of a const-qualified type T, T shall be a class type with a user-provided default constructor.

    7 To value-initialize an object of type T means:
    — if T is a (possibly cv-qualified) class type (Clause 9) with a user-provided constructor (12.1), then the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
    — if T is a (possibly cv-qualified) non-union class type without a user-provided constructor, then the object is zero-initialized and, if T’s implicitly-declared default constructor is non-trivial, that constructor is called.
    — if T is an array type, then each element is value-initialized;
    — otherwise, the object is zero-initialized.
    An object that is value-initialized is deemed to be constructed and thus subject to provisions of this International Standard applying to “constructed” objects, objects “for which the constructor has completed,” etc., even if no constructor is invoked for the object’s initialization.

    Grob Vereinfacht:
    Zero-Inialisierung: alle skalaren Elemente werden mit 0 initialisiert, paddingbits werden 0 bits
    Default-Initialisierung: Aufruf des (der im Fall von Arrays) Default-Konstruktors, sonst nichts
    Value-Initialisierung: zero-Initialisierung gefolgt von default-Initialisierung.

    Die Regeln, wann welche Initialisierung verwendet wird, sind einfach:
    - Alle Objekte mit statischer Speicherdauer werden beim Programmstart zero-Initialisiert.
    - default-Initialisierung falls das Objekt ohne Initialisierer oder ein leeres Klammerpaar definiert wurde bzw. falls kein Member-Initialiser für das Subobjekt im Konstruktor angegeben wurde (und C++11: kein Initialiser in der Klassendefinition vorhanden ist)
    - value-Initialisierung, wenn leere Klammern verwendet wurden (wo zulässig).
    Ein implizit definierter Defaultkonstruktor einer Klasse foo hat immer die Form

    foo() {};
    

    d.h. Basisklassen und Member werden durch ihn nur default-initialisiert.

    int a;         // default-Initialisierung: kein Effekt da skalar, Wert bleibt unbestimmt
    struct foo { int a; };
    new foo[10];   // default-Initialisierung: die a-Member jedes Elementes bleiben uninitialisiert, da der aufgerufene Default-Konstruktor nichts tut
    new foo[10](); // value-Initialisierung: alle a sind 0
    struct bar
    {
       int a, b;
       bar() : a() {}  // a wird value-initialisiert, b wird default-initialisiert
    };
    

    Schließlich gibt es noch die Initialisierung mit einem bestimmten explizit angegeben Wert. Dazu schreibe ich später noch.



  • camper kannst du mal den Link für den Standard posten den du zum zitieren nutzt?
    Ich hab hier nur den draft zum neuen Standard und würde gerne meine Sammlung erweitern?


  • Mod

    Der Standard wird gegen Geld von der ISO verkauft. Der letzte Draft ist schon gut genug, da hat sich nicht viel im Vergleich zum Endprodukt getan.



  • Hmm das ist doof, weil genau diese Abschnitte finde ich hier:
    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

    Oder ich bin zu unfähig das kopierte "zero-initiliaze" zu kopieren und zu finden 😃


  • Mod

    Schau einfach mal hier.



  • Super danke.


Anmelden zum Antworten