Kursinhalt
C++ OOP
C++ OOP
Konstruktor-Initialisierungsliste
Eine Initialisierungsliste ermöglicht es Konstruktoren, Klassenmitglieder vor Ausführung des Konstruktorkörpers zu initialisieren. Sie ist besonders nützlich für komplexe Initialisierungen oder beim Arbeiten mit Objekten von Klassen, die const
-Mitglieder enthalten.
Syntax der Initialisierungsliste
Die Syntax von Initialisierungslisten kann zunächst übermäßig komplex und verwirrend erscheinen. Man könnte in Erwägung ziehen, stattdessen nur einen Konstruktor zu verwenden, da dies einfacher wirkt. Mit wachsendem Programmumfang erweisen sich Initialisierungslisten jedoch als praktisch und unkompliziert in der Anwendung.
:
(Doppelpunkt-Symbol): leitet die Member-Initialisierungsliste in einem Konstruktor ein;member (value): ein Klassenmitglied, das mit dem Wert (dem an den Konstruktor übergebenen Argument) initialisiert wird;
{ }
(geschweifte Klammern): der Körper des Konstruktors, in dem nach der Member-Initialisierung zusätzlicher Code ausgeführt werden kann.
temperature_sensor.h
class TemperatureSensor { public: TemperatureSensor(int initialTemperature) : currentTemperature(initialTemperature) {} int currentTemperature; };
Einschränkungen und Überlegungen
Es gibt ein weit verbreitetes Missverständnis bezüglich der Initialisierungsreihenfolge in der Initialisierungsliste. Entgegen der allgemeinen Annahme erfolgt die Initialisierung von Variablen in der Initialisierungsliste nicht in der Reihenfolge, in der sie geschrieben sind. Stattdessen wird sie durch die Reihenfolge der Member-Deklarationen in der Klasse bestimmt, nicht durch die Reihenfolge in der Initialisierungsliste.
main.cpp
#include <iostream> class Exchanger { public: Exchanger(float _quantity, float _rate) : quantity(_quantity), rate(_rate), total(quantity * rate) {} float quantity, rate, total; }; int main() { Exchanger exchanger(100, 0.3); std::cout << exchanger.total; }
Versuchen Sie, die Reihenfolge der Initialisierung der Variablen total
in der Initialisierungsliste und bei der Variablendeklaration innerhalb der class
zu ändern.
Bei der Verwendung von Initialisierungslisten in einem Konstruktor kann der Argumentname mit dem Attributnamen der class
identisch sein.
main.cpp
#include <iostream> class Exchanger { public: Exchanger(float quantity, float rate) : quantity(quantity), rate(rate), total(quantity * rate) {} float quantity, rate, total; }; int main() { Exchanger exchanger(100, 0.3); std::cout << exchanger.total; }
Wenn Sie jedoch denselben Namen sowohl für die Member-Variablen als auch für die Argumente verwenden, erhält total den Wert der multiplizierten Argumente, nicht der Member. Um dies zu verdeutlichen, versuchen Sie, quantity auf null statt auf das Argument zu setzen.
1. Was ist eine Konstruktor-Initialisierungsliste?
2. Welches Symbol leitet die Member-Initialisierungsliste in einem Konstruktor ein?
Danke für Ihr Feedback!