C++ Member-Initialisierung



  • Wo sollte man die Member einer Klasse am besten initialisieren? In der Initialisierungsliste des Konstruktors, im Konstruktor-Body oder direkt bei der Deklaration?



  • Wenns geht und Sinn macht bei Dekleration ansonsten Initialisierungsliste.



  • oder auch erst im Konstruktorbody. Falls du z.B. bestimmte Dinge erstmal errechnen musst.



  • Gehen wir mal davon aus, dass der Init-Wert nicht berechnet werden muss. Gibt es dann irgendeinen Vor- Nachteil, wenn ich die Initialisierung schon bei der Deklaration mache? Wie ist da überhaupt die Reihenfolge? Ich weiß, dass die Init-Liste wohl vor dem Konstruktor-Body abgearbeitet wird. Wird denn die Initialisierung bei der Deklaration, also die Definition, auch noch vor der Init-List abgearbeitet, so dass die Reihenfolge Definition, Init-List und dann Konstruktor-Body ist?



  • Skym0sh0 schrieb:

    oder auch erst im Konstruktorbody. Falls du z.B. bestimmte Dinge erstmal errechnen musst.

    Du kannst doch in der Initialisierungsliste auch Funktionen aufrufen und Rechnungen machen, oder nicht?


  • Mod

    InitMember schrieb:

    Wird denn die Initialisierung bei der Deklaration, also die Definition, auch noch vor der Init-List abgearbeitet, so dass die Reihenfolge Definition, Init-List und dann Konstruktor-Body ist?

    An der Reihenfolge der Initialisierung ändert sich nichts, ein Member wird vor Betreten des ctor-{}-Blocks initialisiert:
    - wenn er in der ctor-Initialisierungsliste auftaucht, mit dem dort genannten Ausdruck, andernfalls
    - wenn bei der Definition ein Intialisierer angegeben wurde, mit dem dort genannten Ausdruck, anderfalls
    - erfolgt Defaultinitialisierung (=keine Initialisierung für hinreichend primitive Typen).

    Die Angabe eines Initialisierers bei nichtstatischen Membern ist also nur eine Vereinfachung, die Codeduplikation vermeiden hilft, wenn mehrere Konstruktoren geschrieben werden, aber Member z.T. gleichartig initialisiert werden sollen. Delegierende Konstruktoren sind ein anderes Mittel für diesen Zweck, die Anwendungsbereiche sind aber nicht ganz identisch.

    Initialisierende Ausdrücke müssen nicht konstant sein, allerdings kann nat. ein Initialisierer, der in der Klassendefinition steht, nicht von irgendwelchen Konstruktorparametern abhängen.



  • out schrieb:

    Skym0sh0 schrieb:

    oder auch erst im Konstruktorbody. Falls du z.B. bestimmte Dinge erstmal errechnen musst.

    Du kannst doch in der Initialisierungsliste auch Funktionen aufrufen und Rechnungen machen, oder nicht?

    Klar. Ich hatte vor kurzer Zeit den Fall, dass 2 Membervariablen von mehreren Konstruktorparametern abhingen, wobei jedoch als Zwischenschritt ein Array oder eine Liste erzeugt werden musste. Das in Funktionen auszulagern wäre möglich, aber das war recht komplex und von den Berechnungen redundant.

    Umgekehrt hab ich den UseCase nicht mehr im Kopf, ich hatte auch nicht viel drüber nachgedacht, kann daher also auch sein, dass ich das nicht gut aufgebaut habe. 🤡


Anmelden zum Antworten