Frage zu Konstruktor
-
Hallo, ich versuche gerade ein Beispiel aus einem Buch von Stroustrup zu verstehen, einfachheits halber habe ich das Beispiel gekürtzt.
Meine Fragen:
Wieso wird am Anfang: const Date& default_date() aufgerufen? Müsste da nicht eigentlichDate::Date() : y( default_date() . year() )aufgerufen werden?
Wenn ich
const Date& default_date()aus dem Code rausnehmen und z.b.schreibe:
Date::Date() : y( 8 )dann wird
Date::Date()auch zu erst aufgerufen.
Oh, jetzt seh ich glaub ich gerade meinen Denkfehler:
Date::Date() : y( default_date() . year()wird anscheind wohl auch zu erst aufgerufen doch bevor ich meine Ausgabe
cout<<"third"<<endl;sehe kann wird im Konstruktor ja die Funktion
const Date& default_date()aufgerufen sehe ich das richtig?
Date::Date() : y( default_date() . year() )Und mit .year(); sage ich an dieser Stelle das ich die Funktion year(); direkt im Konstruktor Code aufrufen will? Stimmt das so?
Im Buch ist diese Stelle leider nur sehr kurz beschrieben, ich weiss nicht ob der Herr Stroustrup ein paar Kapitel weiter dieses Programm nochmal genauer erklärt, daher würde ich es jetzt gerne verstehen.
#include <iostream> #include <fstream> #include <string> #include <vector.h> using namespace std; class Date { public: Date(); Date(int yy ); int year() const { return y; } // private: int y; }; //------------------------------------------------------------------------------ const Date& default_date() { cout<<"first"<<endl; static const Date dd(2001 ); return dd; } //------------------------------------------------------------------------------ Date::Date() : y( default_date() . year() ) // .year() bedeutet das die Funktion im Konstruktur Code // aufgerufen werden soll? { cout<<"third"<<endl; } //------------------------------------------------------------------------------ Date::Date(int yy ) : y(yy) { cout<<"second" <<endl; } //------------------------------------------------------------------------------ int main() { Date ff; // Kein Parameter, übergeben erster Aufruf also: const Date& default_date(); cout<<"ff: " << ff.y << endl; cout<<"year: " << ff.year() << endl; // vector<Date> birthdays(4); // cout<< birthdays[0].year() << endl; // cout<<birthdays[0]. y << endl; system("PAUSE"); return 0; } //------------------------------------------------------------------------------
-
Hallo,
ja, das hast du wohl richtig verstanden. Zuerst wird bei einem Konstruktor die Initialisierungsliste abgearbeitet (und dort dann evtl. auch Funktionen aufgerufen). Und danach wird dann erst der Block des Konstruktors verarbeitet.