Basisklasseninitialisierer



  • Hallo nochmal!

    Ich habe nun fast alles, was mit Klassen zu tun hat, grob verstanden.
    Ein kleines Problem bereitet mir jedoch noch der Basisklasseninitialiserer sowie der Elementinitialisierer sowie der Standardkonstruktor!

    Dazu hier drei Fragen:

    Frage1:
    Was genau ist der Standardkonstruktor? Ist dieser denn überhaupt selbst erstellbar oder wird er lediglich vom Compiler zur Verfügung gestellt?
    Ich dachte bisher immer, der Standardkonstruktor wird nur verwendent, sofern man keine anderen Konstruktoren deklariert bzw. definiert hat.
    Und dieser Standard/oder Defaultkonstruktor belegt dann alle Eigenschaften eines Objekts beim Erstellen mit 0, richtig?

    Aber das hier müsste doch auch ein Standardkonstruktor sein, oder?:
    Klassenname::Klassenname()
    {
    }

    Und das hier doch auch:
    Klassenname::Klassenname(int a, int b)
    {
    }

    Oder das hier:
    Klassenname::Klassenname(int a, int b)
    {
    cout "Hallo";
    }

    Solange ein Konstruktor, welchen man selbst definiert, die Eigenschaften einer Klasse nicht speziell definiert, ist es doch ein Standardkonstruktor, oder???
    Kann ein Standardkonstruktor überhaupt Parameter haben??
    Und wenn ich einen "normalen" Konstruktor mit 3 Parametern definiere, ihn jedoch nur mit 2 Parametern aufrufe, wird dann der dritte Parameter durch 0 ersetzt??

    Frage2:
    Angenommen ich habe eine Basisklasse Produkt mit den Eigenschaften ID, Name, Preis und eine abgeleitete Klasse Buch mit den Eigenschaften Verlag, Autor.
    Wenn ich jetzt den Konstruktor der Klasse Buch zusammen mit dem Basisklasseninitialisierer aufrufe, warum muss ich dann:

    Buch::Buch(ID, Name, Preis, Verlag, Autor) : Produkt(ID, Name, Preis)

    schreiben anstatt:

    Buch::Buch(Verlag, Autor) : Produkt(ID, Name, Preis)

    ?? 😕

    Frage3:
    Wie funktioniert die ganze Geschichte mit Elementinitialisierer??



  • Frage1:
    Klassenname::Klassenname() {}
    ist ein Standardkonstruktor.

    Wenn du einen mit drei Parametern hast und nur 2 davon in der parameterliste einträgst, dann bekommst du einen Compilerfehler, dass er den Konstruktor nicht kennt.

    Frage2:

    class Produkt
    {
      private:
        int ID;
        char* Name;
        float Preis;
      public:
        Produkt(int i, char* n, float p):ID(i),Name(n),Preis(p);
    };
    
    class Buch: Produkt
    {
      private: 
        char* Verlag;
        char* Autor;
      public:
        Buch(int i, char* n, float f, char* v, char* a):Verlag(v),Autor(a),Produkt(i,n,p);
    };
    

    Das darfst du ja nicht weglassen, sonst wird deine Basisklasse ja nie mit Werten gefuellt

    Frage 3:
    Mit

    Verlag(v)
    

    wird Variable Verlag mit dem Wert direkt beim Konstruktor initialisiert.



  • 1. Standardkonstruktor = Defaultkonstruktor. Der wird erstellt, wenn du keinen eigenen deklariert hast. Der Standarkonstruktor wird aufgerufen für Objekte, die du erstellst, ohne einen Parameter anzugeben.

    Klassenname::Klassenname() //Standardkonstruktor
    {}
    
    Und das hier doch auch:
    Klassenname::Klassenname(int a, int b) //Konstruktor
    {}
    
    int main (){
    
    Klassenname k; //Standarkonstruktor wird aufgerufen
    Klassenname k (2,5); //Konstruktor (int, int ) wird aufgerufen
    };
    

    Und dieser Standard/oder Defaultkonstruktor belegt dann alle Eigenschaften eines Objekts beim Erstellen mit 0, richtig?

    Falsch. Der Konstruktor macht nichts anderes, als die Konstruktoren der Objete aufzurufen. Mit einem int wird nichts gemacht, weil das ein eingebauter Typ ist und daher keinen Konstruktor hat. Sprich du musst den (mit der Initialisierungsliste) selber initialisieren. Falls eines deiner Objekte (in einer Klasse) KEINEN Standarkonstruktor anbietet, musst du ebenfalls mit der der Initialisierungsliste initialisieren.Ebenso musst du mit const- Obejekten verfahren. (Achtung: bei Debug Builds, wird oftmals 0 initialisiert, was aber nicht Garantiert ist und in der Release Versoin dann inkonsitzen ergeben kann, wenn du davon ausgehst, dass mit 0 initialisiert wird.)

    2. Das Objetkt wird ja mit Buch initialisiert, also musst du auch dort die Parameter für Produkt angeben. Sonst hast du die Daten ja nicht.

    Edit:
    3. Siehe Initialisierungsliste


Log in to reply