Constructors....Wo genau kommt die Initialisation List hin???.....



  • Hallo,

    Ich hab ne ganz kurze Frage: Ich habe gerade von der Wichtigkeit der Initialisierungsliste in C++ Konstruktoren gelernt...;)

    Meine Frage lautet: Kann ich mir aussuchen, ob ich die Initialisierungsliste im .cpp file mache oder im .h file??Mit anderen Worten, ist es egal, oder gibts da wieder irgendsoeinen kleinen Seiteneffekt, von dem ich nichts weiss....

    Wenn es geht wuerde ich die Initialisierungsliste nur im cpp-file haben, aber ich frage lieber noch mal nach, ob es nicht irgendwo Nachteile bringt....

    ===> so will ich es machen:

    //File Person.h
    class Person{
     public:
       Person(Beruf & beruf, int alter);
    
     private: 
        Beruf & beruf;
        int alter;
    }
    
    //File Person.cpp
    #include "Person.h"
    Person::Person(Beruf & beruf, int alter) : 
             beruf(beruf),
             alter(45)
    {
       //nothing
    }
    ....
    

    Danke fuer jede Hilfe....ganz nebenbei, falls das Codebeispiel irgendwo Fehler hat, lasst es mich wissen....hab, wie gesagt, eben erst von der Wichtigkeit der Initialisierungslisten erfahren und bin noch nicht so der Initialisierungsexperte....:(....



  • nur in der *.cpp.
    in der *.hpp streikt der compiler.



  • Nur dort wo die Funktion definiert ("implementiert") wird. Wenn du die im Header-File definierst dann nur im Header-File, wenn du die im .cpp File definierst, dann nur im .cpp File.



  • ganz nebenbei, falls das Codebeispiel irgendwo Fehler hat, lasst es mich wissen

    Zwar kein Fehler aber ich finds zumindest fragwürdig ^^
    Wieso hält die Klasse Person nur eine Referenz auf Beruf und nicht das Beruf-Objekt an sich?
    Du kannst es ja trotzdem per (const) ref übergeben und dann halt kopieren...

    So hast du keine Möglichkeit, es zu bewerkstelligen, dass die Person auch mal keinen Beruf hat o.ä....

    bb

    PS:

    Person::Person(Beruf & beruf, int alter) : 
             beruf(beruf),
             alter(45) //!
    {}
    


  • unskilled schrieb:

    Zwar kein Fehler aber ich finds zumindest fragwürdig ^^
    Wieso hält die Klasse Person nur eine Referenz auf Beruf und nicht das Beruf-Objekt an sich?

    Datenbanknormalisierung.



  • volkard schrieb:

    unskilled schrieb:

    Zwar kein Fehler aber ich finds zumindest fragwürdig ^^
    Wieso hält die Klasse Person nur eine Referenz auf Beruf und nicht das Beruf-Objekt an sich?

    Datenbanknormalisierung.

    das es das sein könnte, dacht ich mir schon - allerdings hatte ich eher den eindruck, dass der TO sich keine Gedanken darüber macht...

    bb



  • Hallo,

    danke fuer die Antwort...und ganz nebenbei: das Beispiel hat ich innerhalb einer minute aus der Lust gezogen, um meine Frage zu illustrieren...:)...hab also weder Datenbanknormalisierung, noch sonst irgendwas im Hinterkopf gehabt...aber trotzdem recht vielen Dank fuer die Hilfe...:)))



  • janClose schrieb:

    Meine Frage lautet: Kann ich mir aussuchen, ob ich die Initialisierungsliste im .cpp file mache oder im .h file?

    Nein, das kannst Du Dir nicht aussuchen. Je nachdem wo die Funktion definiert wird, muß auch die Initialisierungsliste stehen. Wenn im Header definiert wird, dann ist der Konstruktor "inline", wird er im Implementationsdatei definiert wird er nur einmal angelegt. Es hängt vom Kontext ab, was sinnvoller ist.



  • ~john schrieb:

    [...] Wenn im Header definiert wird, dann ist der Konstruktor "inline", wird er im Implementationsdatei definiert wird er nur einmal angelegt. Es hängt vom Kontext ab, was sinnvoller ist.

    Vergiss das mal wieder - idR entscheidet das der Compiler eh allein und nimmt keine Rücksicht auf das, was du gemacht hast... (weder inline noch das garantieren, dass die Fkt tatsächlich ge-inlined wird)

    bb



  • Es hat schon seine Auswirkungen, ob man Funktionen als inline deklariert oder nicht. Bereits dadurch, dass man bei Änderungen der Implementierung auch Dateien rekompilieren muss, die den Header inkludieren. Zudem können nur Compiler mit Linkzeit-Codegenerierung inline über mehrere Module hinweg optimieren.


Anmelden zum Antworten