Initialisierung von Variablen



  • Hallo

    Unter welchen Voraussetzungen darf ich annehmen, dass eingebaute Typen mit 0 initialisiert werden?

    int v0; //hier?
    void f()
    {
    	static int v1; //hier?
    	int v2; //hier?
    }
    struct s
    {
    	int v3;
    };
    int main()
    {
    	s v4; //hier?
    	int* v5 = new int; //hier?
    	delete v5;
    }
    template<class T>
    void g()
    {
    	T v6; //hier? (im Falle dass T == int)
    }
    


  • int v0; //hier? ja (global)
    void f()
    {
    	static int v1; //hier? ja (statisch)
    	int v2; //hier? nein (lokal)
    }
    struct s
    {
    	int v3;
    };
    int main()
    {
    	s v4; //hier? nein (lokal + POD)
    	s v4a = {}; //hier? ja (Aggregat-Initialisierung, bzw. Uniform Initialization in C++11)
    	s v4b = s(); //hier? ja (Kopier-Initialisierung)
    
    	int* v5 = new int; //hier? nein
    	int* v5a = new int(); //hier? ja
    	int* v5b = new int[7]; //hier? nein
    	int* v5c = new int[7](); //hier? ja
    
    	delete v5;
    	delete v5a;
    	delete[] v5b;
    	delete[] v5c;
    }
    template<class T>
    void g()
    {
    	T v6; //hier? nein (immer noch lokal)
    }
    

    Grundsätzlich werden lokale Variablen von skalaren oder POD-Typen nicht initialisiert. Bei Klassen hängt es davon ab, ob ein Defaultkonstruktor definiert ist, der eine allfällige Initialisierung vornimmt.


  • Mod

    v0 == 0
    v1 == 0
    v2 undefiniert
    v3/v4 undefiniert (Merke: v4 = s() wäre mit 0 initialisiert)
    v5 undefiniert (Merke: new int() wäre mit 0 initialisiert)
    v6 undefiniert (Merke: v6 = T() wäre mit 0 initialisiert)

    Ich hoffe, ich bin selber nicht durcheinander gekommen 🙂 . Merkregel: Objekte mit statischer Lebensdauer werden zero-initialized. Lokale Objekte nicht. Wenn du value-initialized (mit leeren Klammern), so ist dies für POD-Typen eine Initialisierung mit 0.

    P.S.:
    http://en.cppreference.com/w/cpp/language/initialization
    http://en.cppreference.com/w/cpp/language/zero_initialization
    http://en.cppreference.com/w/cpp/language/value_initialization
    http://stackoverflow.com/questions/3102096/when-do-c-pod-types-get-zero-initialized

    edit: Zu langsam.



  • v4b verstehe ich nicht ganz. Der Default-Konstruktor eines POD's initialisiert zwar alle Built-In-Member mit 0, jedoch wird der Default-Konstruktor eines POD's beim Erstellen des POD's nicht aufgerufen?


  • Mod

    Der Default-Konstruktor eines POD's initialisiert zwar alle Built-In-Member mit 0

    Nein, wieso sollte er?

    §5.2.3/2 schrieb:

    The expression T() [...] creates a prvalue of the specified type, whose value is that produced by value-initializing (8.5) an object of type T

    §8.5/8 schrieb:

    To value-initialize an object of type T means:
    — if T is a [...] class type without a user-provided or deleted default constructor, then the object is zero-initialized [..]

    §8.5/6 schrieb:

    To zero-initialize an object or reference of type T means:
    — if T is a [...] non-union class type, each non-static data member [...] is zero-initialized and padding is initialized to zero bits;



  • Ah, ich sehe in den Standard-Quotes, dass da das Verhalten vom generierten Default-Konstruktor ganz anders ist als das vom manuell geschriebenen Default-Konstruktor.

    Danke allen für die Hilfe.



  • KeineKlassenMachen schrieb:

    Ah, ich sehe in den Standard-Quotes, dass da das Verhalten vom generierten Default-Konstruktor ganz anders ist als das vom manuell geschriebenen Default-Konstruktor.

    Würde ich so nicht sagen. Der compilergenerierte Defaultkonstruktor entspricht einem leeren, manuell definierten Defaultkonstruktor. Damit das Verhalten anders ist, musst du explizit Variablen initialisieren.


Anmelden zum Antworten