Initialisierungsliste



  • Hallo, ich habe eine Frage bezüglich der Initialisierungsliste: Wird ein Member des Objekts sofort aktualisiert oder erst nach Ablauf der Ini-Liste? Gegeben sei folgender Code:

    class String {
    public:
        String(const char* s) : len(strlen(s)), cap(len) { }
    private:
        size_t len;
        size_t cap;
    };
    

    Bei mir ist cap 3435973836. Scheint wohl undefiniert zu sein, obwohl in der Ini-Liste cap mit len initialisiert wird / werden soll.



  • Object54323 schrieb:

    Hallo, ich habe eine Frage bezüglich der Initialisierungsliste: Wird ein Member des Objekts sofort aktualisiert oder erst nach Ablauf der Ini-Liste? Gegeben sei folgender Code:

    class String {
    public:
        String(const char* s) : len(strlen(s)), cap(len) { }
    private:
        size_t len;
        size_t cap;
    };
    

    Bei mir ist cap 3435973836. Scheint wohl undefiniert zu sein, obwohl in der Ini-Liste cap mit len initialisiert wird / werden soll.

    Das wäre wohl ein Fehler der Implementierung.
    Ist das der Originalcode, oder aus dem Gedächtnis? Weil z.B. die Reihenfolge von len und cap in der Definition (nicht in der Initiliasierungsliste) durchaus einen Unterschied macht.



  • (war alles Quatsch)



  • Ah danke 🙂 Ja, hatte im privaten Bereich erst cap und dann len deklariert. Reihenfolge vertauscht und es funktioniert 😃 witzig. Warum ist das so?



  • [War beantworteter Quatsch]

    Object54323 schrieb:

    Ah danke 🙂 Ja, hatte im privaten Bereich erst cap und dann len deklariert. Reihenfolge vertauscht und es funktioniert 😃 witzig. Warum ist das so?

    Weil Member in der Reihenfolge der Deklaration, nicht in der Reihenfolge in der Initialisierungsliste initialisiert werden.



  • Der Standard komt sogar mit Begründung daher:

    12.6.2 Initializing bases and members
    10 In a non-delegating constructor, initialization proceeds in the following order:
    — First, and only for the constructor of the most derived class (1.8), virtual base classes are initialized in
    the order they appear on a depth-first left-to-right traversal of the directed acyclic graph of base classes,
    where “left-to-right” is the order of appearance of the base classes in the derived class base-specifier-list.
    — Then, direct base classes are initialized in declaration order as they appear in the base-specifier-list
    (regardless of the order of the mem-initializers).
    — Then, non-static data members are initialized in the order they were declared in the class definition
    (again regardless of the order of the mem-initializers).
    — Finally, the compound-statement of the constructor body is executed.
    [ Note: The declaration order is mandated to ensure that base and member subobjects are destroyed in
    the reverse order of initialization. —end note ]


Anmelden zum Antworten