Initialisierungsliste vs. Konstruktor
-
mal ne simple Verständnisfrage (oder Fragen):
MyClass::MyClass( MyOtherClass* param ) : _mOtherClass( param ) { }oder
MyClass::MyClass( MyOtherClass* param ) { _mOtherClass = param; }was ist besser?
Warum ist es besser?
Und wann setzt man was ein?Danke
-
Version 1 wird nur der Copy Konstruktor aufgerufen.
Version 2 wird zusätzlich noch der Zuweisungsoperator aufgerufen.Version ist besser, schneller und bei konstanten Membern die einzige Möglichkeit
diese zu initialisieren.die erste Variante wenn möglich bevorzugen.
-
Was besser ist, hängt von der Situation ab, auch wenn die Initialisierungsliste oft im Vorteil ist. Wenn sich der Typ von "_mOtherClass" erwartungsgemäß verhält (also Default-Konstruktor, Copy-Konstruktor und Zuweisungsoperator gut implementiert sind*), dann ist die Initialisierungsliste besser, einfach weil dann ein Aufruf weniger erfolgt.
Ich denke, das kannst du selbst abwägen, wenn du weißt, was vor sich geht.Beim Anwenden der Initialisierungsliste wird nur der Copy-Konstruktor des Objekts aufgerufen. Wenn du die Zuweisung im Konstruktor-Block hast, wird erst der Standard-Konstruktor aufgerufen, dann der Zuweisungsoperator.
Wenn du ein Objekt als Membervariable hast, dessen Typ keinen Default-Konstruktor (also "Z::Z()") unterstützt, dann musst du ihn über die Initialisierungsliste initialisieren.
* oder die Standard-Implementation, die vom Compiler generiert ist, ausreicht
-
Elementinitialisierungslisten machen z.B. in folgenden Fällen Sinn:
- konstante Membervariablen müssen initialisiert sein, bevor der Konstruktor-Inhalt ausgeführt wird
- Referenz-Membervariablen müssen initialisiert sein, bevor der Konstruktor-Inhalt ausgeführt wird
- Übergabe von Parametern an Konstruktoren von eingebetteten ObjektenBeispiel:
class A { public; A(){ i=0; } A(int zahl) { i=zahl; } int i; }; class B { public: B(int j); A a; // a kann einen Parameter über die Liste aufnehmen const int cnum; // kann nur hier direkt oder in Liste initialisiert werden int& rnum; // kann nur hier direkt oder in Liste initialisiert werden }; B::B(int j, int k, int m) : a(j), cnum(k), rnum(m) { }Wenn die 3 oben genannten Fälle nicht zutreffen, ist es vom Ergebnis her egal, ob Du normale Variablen in solchen Listen oder im Konstruktor selbst vordefinierst.
-
danke, ihr habt mich in meiner Vermutung bestätigt
-
Es sind beides Konstruktoren, wobei einer mit initalisierungsliste arbeitet, und der andere mit ner zuweisung..