Wie bereits beantwortet, werden die Initialisierungslisten vollständig ausgeführt vor Eingabe des Konstruktorblocks. Daher ist es absolut sicher, (initialisierte) Member im Konstruktor-Body zu verwenden.
Sie haben einen Kommentar in der akzeptierten Antwort gemacht zu beziehen sie auf die Konstruktorargumente zu hat, aber nicht das Mitglied Vars innerhalb des Konstruktors Blockes. Du nicht.
Es ist möglich, dass Sie die Tatsache, dass Sie verwechselte sollten beziehen sich auf Parameter und nicht an das Mitglied Attribute innerhalb die Initialisierung Liste. Als ein Beispiel kann eine Klasse X gegeben, dass zwei Mitglieder hat (a_ und B_) vom Typ int, der folgende Konstruktor schlecht definiert werden kann:
hier
X::X(int a) : a_(a), b(a_*2) {}
das mögliche Problem, dass der Aufbau der Elemente in dem Die Initialisierungsliste hängt von der Reihenfolge der Deklaration in der Klasse und nicht von der Reihenfolge ab, in der Sie die Initialisierungsliste eingeben. Wenn die Klasse definiert wurden:
class X
{
public:
X(int a);
private:
int b_;
int a_;
};
Dann, unabhängig davon, wie Sie die Initialisierung Liste eingeben, ist die Tatsache, dass b_ (a_ * 2) wird ausgeführt werden, bevor a_ seit der Erklärung des initialisiert Mitglieder sind zuerst b_ und später a_. Das wird einen Fehler verursachen, da Ihr Code glaubt (und wahrscheinlich davon abhängt), dass b_ doppelt so groß wie der Wert von a_ ist, und tatsächlich enthält b_ Müll.Die einfachste Lösung ist, beziehe nicht auf die Mitglieder:
X::X(int a) : a_(a), b(a*2) {} // correct regardless of how X is declared
diese Gefahr Vermeidung der Grund ist, warum Sie vorgeschlagen werden, nicht Mitglied zu verwenden Attribute als Teil der Initialisierung von anderen Mitgliedern.
Wundert mich, warum Leute nicht erst versuchen, die Quelle zu kompilieren :) – arul
@arul: @dehmann darf nur den einen Compiler haben. Wenn dieses Verhalten von der Implementierung definiert ist, hilft das Kompilieren nicht. Sie müssten sich auf den Standard beziehen. – paxdiablo
Ja, nur kompilieren und ausprobieren sagt dir nicht, ob das überall gleich funktioniert. – Frank