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
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.
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: Ссылка
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.
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.
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
Tags und Links c++