Initialisierungsliste
Die Initialisierungsliste ist eine Spezialität der Programmiersprache C++. Sie kommt ausschließlich in Konstruktoren vor und hat die Aufgabe, die Konstruktion von Vorfahren-Klassen, eingebetteten Elementen und Referenzen zu regeln.
Hintergrund
Im Gegensatz zu C, wo man eine Variable deklarieren kann, ohne sich zunächst um ihre Initialisierung zu kümmern, gibt es in C++ Fälle, in denen eine sofortige Initialisierung nötig ist:
- In C++ ist es möglich, Variablen per Deklaration unveränderlich zu machen. Das geschieht durch Voranstellen des Schlüsselwortes const. Man muss einer solchen Variable allerdings mit der Deklaration bereits einen Wert zuweisen.
- Referenzen nennt man in C++ – vereinfacht ausgedrückt – Zeiger, die nie null sein können, ihnen muss bereits zum Zeitpunkt der Deklaration ein Objekt oder eine bereits bestehende Referenz zugewiesen werden.
- Klassen können von ihrem Entwickler so gestaltet werden, dass sie zur Konstruktion von Objekten Initialisierungswerte übergeben bekommen müssen. Ein Beispiel wäre eine Klasse Bruch, bei der man von Anfang an sicherstellen will, dass im Nenner keine Null steht, das kann in C++ mittels Konstruktor (unter Verwendung von Exceptions) erreicht werden.
Finden solch restriktive Deklarationen in einer Klassendefinition statt (Vererbungsbeziehung, Element-Deklaration), wird die Definition der entsprechenden Initialisierungswerte auf den Konstruktionszeitpunkt verschoben (es muss ein Konstruktor definiert werden). Vor dem Beginn des Konstruktor-Körpers werden Initialisierungen von Basisklassen und konstanten bzw. Referenzelementen in Form einer Liste vorgenommen.
Beispiel
Die Klasse A verfügt über
- eine Basisklasse B (die einen Konstruktor definiert)
- ein Element der Klasse E (die einen Konstruktor definiert)
- ein konstantes Element c
- ein Referenz-Element r
die über die Initialisierungsliste – im Codebeispiel gelb hinterlegt – mit Initialisierungswerten versorgt werden müssen.
class B
{
public:
// Der Compiler erkennt automatisch, dass mit b(b) die Elementvariable b
// mit dem Parameter b initialisiert werden soll. Dieser Mechanismus
// heißt argument dependent name lookup.
B( int b ) : b( b ) {}
int b;
};
class E
{
public:
E( int ein_e ) : e( ein_e ) {}
int e;
};
class A : public B: public C: public D: public E:
{
public:
A( int b, int ein_e, int ein_c, int& ein_r ):
B(b), e(ein_e), c(ein_c), r(ein_r)
{}
E e;
const int c;
int& r;
};