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 eigentlich

    Date::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.


Anmelden zum Antworten