Welche Ausgabe erwartet ihr ?
-
#include <iostream> struct A { A() { std::cout << "A"; } }; struct B { B() { std::cout << "B"; } }; class C { public: C() : a(), b() {} // hier seh ich den Sinn nicht private: B b; A a; }; int main() { C(); }
-
BA -- die Member werden in Deklarationsreihenfolge initialisiert, egal was in der Initialisiererliste steht. Normalerweise solltest du eine Compilerwarnung bekommen.
-
manchmal versteh ich die Sprache C wirklich nicht. Heisst das etwa der Compiler schaut sich erst die Deklarationen an und geht dann in die Initalisierungsliste ?
-
Nein, bei Klassen:
class Foo { int i; A a; public: bar(); };ist das eine Definition. Nur die Methoden werden "nur" deklariert
-
blurry333 schrieb:
manchmal versteh ich die Sprache C**++** wirklich nicht. Heisst das etwa der Compiler schaut sich erst die
DeklarationenDefinition an und geht dann in die Initalisierungsliste ?Ja.
-
blurry333 schrieb:
manchmal versteh ich die Sprache C wirklich nicht.
Der Grund liegt darin, dass der Destruktor die Member in der genau umgekehrten Reihenfolge zerstören sollte in der sie konstruiert wurden. Wenn jeder Konstruktor in seiner Initialisiererliste eine andere Reihenfolge hätte, müsste man zusätzlich die Reihenfolge speichern. Da das anscheinend niemand so haben will, hat man festgelegt, dass es eine eindeutige Reihenfolge geben muss und wie sie sich ergibt.
Die Sprache heißt übrigens C++.Heisst das etwa der Compiler schaut sich erst die Deklarationen an und geht dann in die Initalisierungsliste ?
Du und deine superschlauen Fragen immer. Der Compiler muss doch wissen, welche Member es überhaupt gibt, bevor er irgendwas sinnvolles mit der Initialisierungsliste anfangen kann.