2010-04-19 4 views
29

Wenn im folgenden Code der ctor von X aufgerufen wird, wird zuerst der ctor von A oder B aufgerufen? Regelt die Reihenfolge, in der sie im Klassenkörper platziert sind, dies? Wenn jemand ein Schnipsel von Text aus dem C++ - Standard zur Verfügung stellen kann, der über dieses Problem spricht, wäre das perfekt.C++: Initialisierungsreihenfolge der Klassendatenelemente

class A {}; 
class B {}; 
class X 
{ 
A a; 
B b; 
}; 

Antwort

46

Die Reihenfolge ist die Reihenfolge, wie sie in der Klassendefinition erscheinen - dies ist aus dem Abschnitt 12.6.2 des C++ Standard:

5 Initialisierung wird im folgenden Reihenfolge vorgehen:

- Erste und nur für den Konstruktor der meisten abgeleiteten Klasse, wie unten beschrieben, virtuelle Basis Klassen werden sowohl im Reihenfolge, wie sie auf einem tiefen ersten von links nach rechts Durchlauf dererscheinen initialisiert werdengerichtete azyklische Grafik der Basis Klassen, wobei "links nach rechts" die Reihenfolge des Auftretens der Basisklasse Namen in der abgeleiteten Klasse Basis-Spezifizierer-Liste ist.

- Dann direkte Basisklassen werden in die Reihenfolge der Deklaration initialisiert werden, da sie in die Basis-Bezeichner-Liste (unabhängig von die Reihenfolge des mem-initializers) erscheinen.

- nicht-statische Datenelemente gelten, werden in der Reihenfolge, wie sie in der Klassendefinition deklariert waren initialisiert (wieder unabhängig von der Reihenfolge des mem-initializers) Dann.

- Schließlich wird der Rumpf des Konstruktors ausgeführt. [Hinweis: die Reihenfolge der Deklaration ist verpflichtet, sicherzustellen, dass Basis- und Teilobjekte in der umgekehrten Reihenfolge der Initialisierung zerstört werden. ]

+2

Wow, ich reichte nur einreichen. GR. – GManNickG

+4

@GMan Das Rennen ist nicht immer schnell. Außer wenn es ist. –

+0

Ich musste warten, um die Antwort für 7 Minuten zu akzeptieren, nachdem es gepostet wurde, es war so schnell. Wusste nicht, dass SO diese Einschränkung bei der Annahme von Antworten hatte. – Nikhil

8

Initialisierung ist immer in der Reihenfolge, in der die Teilnehmer in Ihrer Klassendefinition erscheinen, so in Ihrem Beispiel a, dann b.

Es gibt einen Sequenzpunkt zwischen der Initialisierung jedes Mitglieds und Sie können einen Verweis auf ein noch zu initialisierendes Mitglied in den Konstruktor eines Klassenmember übergeben, aber Sie könnten es nur in begrenzt verwenden Wege (wie zum Beispiel seine Adresse, um einen Zeiger zu bilden), können andere Verwendungen durchaus undefiniertes Verhalten verursachen.

Die Zerstörung der Klassenmitglieder geschieht immer in der umgekehrten Reihenfolge der Konstruktion.

Reihenfolge der Initialisierung von Basen und Mitgliedern ist in 12.6.2 [class.base.init]/5 definiert.

+0

Können Sie eine Referenz angeben? – Nikhil

+0

Um dies hinzuzufügen, wenn Sie einen Konstruktor für X wie folgt haben - X(): b(), a() {} a wird immer noch zuerst initialisiert. –

+0

Ich weiß das. Ich bitte um eine Referenz. Ich sagte dies zuversichtlich zu jemandem, der nach einer Referenz fragte und ich konnte keine finden. Daher die Frage. – Nikhil

Verwandte Themen