Ich habe einen Konstruktor, der einige Argumente übernimmt. Ich hatte angenommen, dass sie in der aufgeführten Reihenfolge erstellt wurden, aber in einem Fall scheint es, als würden sie in umgekehrter Reihenfolge erstellt, was zu einem Abbruch führte. Als ich die Argumente umkehrte, hörte das Programm auf abzubrechen. Dies ist ein Beispiel für die Syntax, die ich verwende. Die Sache ist, dass a_ in diesem Fall vor b_ initialisiert werden muss. Können Sie die Baureihenfolge garantieren?
z.B
class A
{
public:
A(OtherClass o, string x, int y) :
a_(o), b_(a_, x, y) { }
OtherClass a_;
AnotherClass b_;
};
Dies hängt von der Reihenfolge der Member-Variablen-Deklaration in der Klasse ab. Damit a_
wird dann der erste sein b_
wird die zweite in Ihrem Beispiel sein.
Um die Norm zur Klarstellung zu zitieren:
12.6.2.5
Die Initialisierung erfolgt in der folgenden Reihenfolge:
…
- Dann sollen nichtstatische Datenelemente in der Reihenfolge initialisiert werden, in der sie in der Klassendefinition deklariert wurden (wieder unabhängig von der Reihenfolge der Mem-Initialisierer).
…
Die Standardreferenz dafür erscheint jetzt 12.6.2 Abschnitt 13.3:
(13.3) — Dann werden nicht-statische Datenelemente in der Reihenfolge initialisiert, in der sie in der Klassendefinition deklariert wurden (wieder unabhängig von der Reihenfolge der Mem-Initialisierer).
Sie sagen, Sie fragen nach Konstruktorargumenten, aber sie werden ausgewertet, bevor Sie den Konstruktor erreichen, und sie werden in einer nicht angegebenen, vom Compiler festgelegten Reihenfolge ausgewertet. Aber Sie fragen wirklich nach der Reihenfolge der Initialisierungslisten, also habe ich den Fragentitel für Sie geändert.
– Rob Kennedy
7. August 2009 um 12:45 Uhr
Diese Frage wurde mir in einem Interview gestellt 🙂
– Sunil Kartikey
19. September 2020 um 5:46 Uhr
Der Interviewer hat wahrscheinlich die Frage von hier 🙂
– Hookenz
19. September 2020 um 6:57 Uhr