Reihenfolge der Konstruktor-Initialisierung beachten?
-
Ich habe eine Frage zur Reihenfolge der Konstruktor-Initialisierung von Objekten.
Laut Gert Willms Buch "C++ Das Grundlagen Buch" spielt die Reihenfolge bei Konstruktor-Inititialisierungen keine Rolle. (Abschnitt 15 "Abgeleitete Klassen", S.835 Zitat: Man beachte , dass die Reihenfolge der Einträge in der Initialisierungsliste des Konstruktors keinerlei Bedeutung für die Reihenfolge hat, in der die Aufrufe erfolgen.)
Laut Willms wären die folgenden beiden Klassen identisch:
class Test1 { private: int i; int j; public: Test1(int ii, int jj) : i(ii), j(jj) { } }; class Test2 { private: int i; int j; public: Test2(int ii, int jj) : j(jj), i(ii) { } };
Aber der Compiler beschwert sich über die Klasse Test2 und zwar:
Compiling: main.cpp main.cpp: In constructor »Test2::Test2(int, int)«: main.cpp:43: Warnung: »Test2::j« wird initialisiert nach main.cpp:42: Warnung: »int Test2::i« main.cpp:45: Warnung: während es hier initialisiert wurde Process terminated with status 0 (0 minutes, 0 seconds) 3 errors, 0 warnings
Jetzt bin etwas verunsichert, kann es denn wirklich sein das für den Konstruktor die Initialisierung EXAKT in der Reihenfolge meiner Klassenelemente zu erfolgen hat.
-
Das verhalten ist exakt wies ind einem Buch steht. Die Initialisierung erfolgt in der Reihenfolge wie die Elemente in der Klasse steht, also i vor j. Der Compiler Meckert hier nicht sondern möchte dir nur sagen das i eben zuerst initialisiert wird. Du solltest es einfach nur im Hinterkopf behalten, falls es mal nen Fall gibt bei dem bestimmte Elemente zuerst initialisiert werden müssen, weist du wie du dafür sorgen kannst.
-
Der Compiler weist dich nur noch einmal genau darauf hin, dass eben jj nicht, wie nach der Reihenfolge in der Initialisierungsliste, vor der Initialisierung von ii, sondern erst danach durchgeführt wird. Ansonsten ist das Ganze nur wegen etwas vermurksten Übersetzung etwas unklar.
Im englischen Orinal ist dastest.cpp: In constructor ‘Test2::Test2(int, int)’:
test.cpp:14: warning: ‘Test2::j’ will be initialized after
test.cpp:13: warning: ‘int Test2::i’
test.cpp:16: warning: when initialized here
-
DeepCopy schrieb:
Jetzt bin etwas verunsichert, kann es denn wirklich sein das für den Konstruktor die Initialisierung EXAKT in der Reihenfolge meiner Klassenelemente zu erfolgen hat.
Die Konstruktion erfolgt stets in einer festgelegten Reihenfolge, unabhängig davon, welche Elemente in der Initialiserungsliste genannt werden und in welcher Reihenfolge sie dort stehen (abgesehen davon, das nicht genannte PODs nicht initialisiert werden).
Keine Ahnung, was volkard gerade raucht, jedenfalls dürfte er es besser wissen.
-
Merci!