Vorteile der Verwendung der Initialisierungsliste? [Duplikat]

8

Ich habe mich gefragt, ob es einen Vorteil hat, Mitglieder mit der Initialisiererliste zu initialisieren, anstatt diese in den Konstruktor zu setzen. Bestimmte Dinge müssen die Initialisierungsliste verwenden, aber für die meisten Dinge, die das nicht tun, gibt es einen Unterschied? Ich bevorzuge das letztere, weil ich, wenn ich mehrere Konstruktoren habe, den Aufruf von construct () vorziehe, um die Wiederverwendung von Code zu fördern.

Danke

    
jmasterx 27.11.2010, 02:58
quelle

5 Antworten

12

Wenn Sie die Initialisierungsliste nicht verwenden, wird der Member oder die Basisklasse standardmäßig vor der öffnenden geschweiften Klammer konstruiert.

So fügen Ihre Anrufe, um es später festzulegen, einen operator=() Anruf hinzu.

Wenn Sie die Initialisierungsliste verwenden, hat der Member oder die Basisklasse den richtigen Konstruktor namens.

Abhängig von Ihren Klassen ist dies möglicherweise erforderlich oder schneller.

    
Lou Franco 27.11.2010, 03:02
quelle
10

Für Grundelemente gibt es keinen Unterschied zwischen der Verwendung von Initialisierungslisten oder deren Erstellung über Zuweisung.

Bei anderen Typen können Initialisiererlisten beim Erstellen von Objekten zu Leistungsverbesserungen führen.

Beachten Sie, dass die Reihenfolge der Initialisierung (in Initialisierungslisten) von der Reihenfolge der Deklaration in der Klasse abhängt. Wenn die Deklarationen nicht in Ordnung sind und Sie Daten erstellen müssen, die von etwas anderem abhängen, das bereits vorher initialisiert wurde, ist dies eine Ausnahme von der Regel "Initialisierungslisten verwenden, wenn möglich".

Weitere Informationen: Ссылка

    
wkl 27.11.2010 03:01
quelle
2

Abgesehen von dem, was alle anderen erwähnt haben, erlaubt es die Disambiguierung der Schattenvariablen, also wo this->var = var geschrieben werden soll, können Sie stattdessen myclass(int var) : var(var) tun. Natürlich finden manche Leute das sehr verwirrend / schwer zu lesen, wenn Sie einen großen Konstruktor haben.

    
Necrolis 27.11.2010 04:35
quelle
2

Führen Sie in den Initialisierungslisten auch niemals eine nicht verwaltete Ressourcenerfassung durch. Mit anderen Worten, verwenden Sie entweder "Ressourcenakquisition ist Initialisierung" (dadurch vermeiden Sie nicht verwaltete Ressourcen vollständig) oder führen Sie die Ressourcenakquisition im Konstruktorhauptteil durch.

Und Warnung # 2 Führen Sie jede Ressourcenzuweisung (z. B. neu) in einer eigenen Codeanweisung durch, die die neue Ressource sofort einem Managerobjekt (z. B. auto_ptr) gibt.

Ссылка

    
Chris Bednarski 27.11.2010 05:12
quelle
1

anders als gezwungen zu sein, eine Initialisierungsliste für Konstanten und Referenzen zu verwenden. Es ist auch nützlich, weil Sie vermeiden, die Elementobjekte vor der Eingabe des Konstruktors standardmäßig zu konstruieren und dann sofort zuzuweisen, was ineffizient sein kann, wenn die Mitgliedsobjekte teuer sind konstruieren

    
Bwmat 27.11.2010 03:02
quelle

Tags und Links