In den frühen Versionen von C++ wurden die Mitglieder einer Klasse innerhalb des Konstruktors durch Zuweisung initialisiert. Später wurde die Möglichkeit eingeführt, die Mitglieder einer Klasse vor dem Betreten des Konstruktors durch eine Initialisierungsliste zu initialisieren, was für konstante Mitglieder, Referenzen und die Leistung von entscheidender Bedeutung ist.
Einige Mitglieder einer Klasse (zum Beispiel const-Felder oder Referenzen) können nicht durch Zuweisung innerhalb des Konstruktors initialisiert werden — sie müssen zum Zeitpunkt der Erstellung festgelegt werden. Darüber hinaus wird bei Verwendung von Zuweisungen zuerst der Standardkonstruktor aufgerufen und dann die Zuweisung (zwei Aktionen), was bei komplexen Objekten kostspielig sein kann:
class Example { const int x; std::string str; public: Example(int val, const std::string& s) : x(val), str(s) {} };
Verwenden Sie die Initialisierungsliste, um die Mitglieder einer Klasse sofort zu initialisieren. Dies ist besonders wichtig für const, Referenzen, Klassenmitglieder ohne Standardkonstruktor sowie für die Leistung bei der Arbeit mit STL-Klassen und großen Strukturen.
Beispielcode:
class Point { const int x; int& y; public: Point(int val, int& ref) : x(val), y(ref) {} };
Schlüsselfunktionen:
Kann man die Reihenfolge der Initialisierung der Mitglieder einer Klasse durch die Reihenfolge in der Initialisierungsliste des Konstruktors ändern?
Nein! Mitglieder werden immer in der Reihenfolge ihrer Deklaration in der Klasse initialisiert, nicht in der Reihenfolge der Initialisierungsliste. Das Ignorieren dieser Regel führt zu Fehlern bei der Initialisierungsreihenfolge.
Was passiert, wenn ein Referenzmitglied nicht in der Initialisierungsliste, sondern nur im Körper des Konstruktors initialisiert wird?
Kompilierungsfehler! Eine Referenz, wie auch const-Felder, kann nur in der Initialisierungsliste initialisiert werden — sie muss einen Wert vor dem Betreten des Konstruktors erhalten.
Kann man ein const-Mitglied nach der Initialisierung in der Initialisierungsliste im Körper des Konstruktors ändern?
Nein, ein konstantes Mitglied kann nach der Initialisierung nicht geändert werden — der Versuch, ein solches Feld zu ändern, führt zu einem Kompilierungsfehler.
Im Konstruktor wird ein Mitglied der Klasse innerhalb des Körpers des Konstruktors initialisiert. Für komplexe Objekte werden Ressourcen für den Aufruf des Standardkonstruktors, dann für die Zuweisung und schließlich für die Zerstörung des temporären Objekts ausgegeben.
Vorteile:
Nachteile:
Alle Mitglieder werden sofort in der Initialisierungsliste initialisiert, es gibt keine überflüssigen Operationen und Probleme mit unveränderlichen Feldern.
Vorteile:
Nachteile: