Betrachten wir einmal diesen Code:
class Klasse
{
private:
int& r;
int const c;
public:
Klasse(int i)
{
r=i;
c=i;
}
};Dieser Code funktioniert nicht, da sowohl int& r als auch int const c; bereits bei der Initialisierung einen Wert erhalten müssen. Doch wann findet diese Initialisierung statt?
Die Initialisierung findet vor dem Körper des Konstruktors statt - folglich können wir keine Referenzen und Konstanten werden... Aber halt - es gibt eine Lösung: die Initialisierungsliste.
class Klasse
{
private:
int& r;
int const c;
public:
Klasse(int i)
: r(i), c(i)
{
}
};Zu beachten gilt: die Reihenfolge der Initialisierungen hängt von der Reihenfolge der Deklarationen (in der Klasse) ab. Wenn wir also Klasse(int i) : c(i), r(i) {} schreiben würden, dann würde trotzdem r zuerst initialisiert werden.
Man sollte immer eine Initialisierungsliste verwenden, denn damit erspart man sich den Aufruf des Default Konstruktors. Dies kann einen großen Geschwindigkeitsvorteil bringen, denn es muss die Variable nicht erst mit sinnlosen Standardwerten gefüllt werden, sondern wir können gleich die richtigen Werte verwenden.
Nicht vergessen sollte man, dass für alle Members der Standard Konstruktor aufgerufen wird, wenn wir keinen angeben. Für built-in Typen (wie zB int, double, short,...) bedeutet dies: keine Initialisierung (sie haben dann einen undefinierten Wert).