konstruktor



  • Nein, ich wollte klar machen, das du Standard mit t geschrieben hast 😃



  • achso, ja das mach ich gerne, aber eigentlich zensiert das Forum das...wahrscheinlich hier nicht, weil es ein zusammengesetztes Wort ist.

    lg, freakC++



  • Der Konstruktor einer Klasse wird aufgerufen, wenn ein neues Objekt dieser Klasse erzeugt werden soll.
    Wenn der ctor betreten wird, existiert das Objekt schon im Speicher. Der Konstruktor dient lediglich dazu, das Objekt in einen definierten Zustand zu bringen, dass der Erzeuger damit bedenkenlos weiterarbeiten kann.
    Wenn zur Erzeugung Parameter notwendig sind, können die dem Konstruktor mitgegeben werden (wie bei jeder anderen Methode auch).
    Außerdem kann er über die Initalisierungsliste erste Zuweisungen ausführen, bevor der Konstruktor betreten wird bzw. können darin die Konstruktoren der Basisklasse(n) aufgerufen werden. Notwendig ist er bei const-Membern, da diese ja nicht mehr geändert werden können, sobald das Objekt erzeugt wurde. Sie müssen ihren Wert also in der Initalisierungsliste zugewiesen bekommen

    Der ctor ist neben dem dtor die einzige "Methode" einer Klasse, die keinen Rückgabewert haben darf. Außerdem heißen sie (zumindest in C++) genauso wie der Klassenname

    Das dürfte es grob gewesen sein



  • Die Antworten sind mir ein wenig zu unpräzise. Ein Konstruktor erstellt keine Objekte und ein Destruktor zerstört auch keine. Ein Konstruktor initialisiert Klassen und ein Destruktor räumt auf.

    Wenn ich eine Klasse erstelle, dann wird immer ein Konstruktor aufgerufen, in dem ich die Möglichkeit habe, die Klasse zu initialisieren. Wird eine Klasse zerstört, dann wird der Destruktor aufgerufen, wo ich eben Aufräumarbeiten durchführen kann.

    Klassen werden entweder auf dem Stack oder auf dem Heap angelegt. Lege ich Objekte auf den Stack, werden die Objekte automatisch beim Verlassen des Gültigkeitsbeireiches gelöscht. Das brauche ich nicht explizit zu machen und kann es damit auch nicht vergessen. Dabei wird auch der Destruktor aufgerufen.

    Auf dem Heap lege ich Objekte mit new an. Diese muss ich mit delete wieder explizit löschen. new reserviert Speicher für das Objekt und ruft dann einen Konstruktor auf. delete ruft erst den Destruktor der Klasse auf und gibt den Speicher wieder frei. Da ich solche Objekte explizit löschen muss, kann es schon mal passieren, dass das vergessen wird. Dann hat mein Programm einen Memory-Leak.

    Die Aussgabe, dass der dtor die einzige Methode einer Klasse sei, die keinen Rückgabewert haben darf stimmt nicht ganz. Auch der Konstruktor hat keinen Rückgabewert.



  • Und was mache ich da falsch?

    CWare::CWare()
    {
    	char Bezeichnung[MaxBez] = Bez1;
    	char Strichcode[MaxCode] = Code1;
    	Preis = 123;
    }
    

    Er meckert bei der char Zuordnung rum



  • char-Zeichenketten können so nicht kopiert werden. Was sind den Bez1 und Code1? Auch char-Zeichenketten? Wenn ja, siehe strcpy oder strncpy.

    Edit: C-Strings verwendet man auch gar nicht mehr. 😉 In C++ gibt es die Klasse string, die ist deutlich praktischer. Wirf mal einen Blick drauf.



  • tntnet schrieb:

    Ein Konstruktor erstellt keine Objekte und ein Destruktor zerstört auch keine. Ein Konstruktor initialisiert Klassen und ein Destruktor räumt auf.

    so in etwa hab ich es doch geschrieben (oder zumindest gemeint. Kann leicht sein, dass es anders rüberkommt)

    tntnet schrieb:

    Die Aussgabe, dass der dtor die einzige Methode einer Klasse sei, die keinen Rückgabewert haben darf stimmt nicht ganz. Auch der Konstruktor hat keinen Rückgabewert.

    da du dich mit dieser Aussage wohl ebenfalls auf meine beziehst: genau das hab ich geschrieben. Und diesesmal bin ich mir sogar sicher, dass man sie nicht falsch verstehen konnte 😉



  • Die Aussgabe, dass der dtor die einzige Methode einer Klasse sei, die keinen Rückgabewert haben darf stimmt nicht ganz. Auch der Konstruktor hat keinen Rückgabewert.

    Und was ist mit Methoden, die void "zurueckgeben" ...

    Wenn der ctor betreten wird, existiert das Objekt schon im Speicher.

    Nein, erst nachdem der Konstruktor verlassen wird. Ein Haufen von Nullen und Einsen ist kein Objekt. Ein Konstruktor macht wesentlich mehr als Member mit Standardwerten zu initialisieren. Es ist richtig, dass Speicher von der Groesse des Objektes bereitsteht.



  • tntnet schrieb:

    Klassen werden entweder auf dem Stack oder auf dem Heap angelegt. Lege ich Objekte auf den Stack, werden die Objekte automatisch beim Verlassen des Gültigkeitsbeireiches gelöscht. Das brauche ich nicht explizit zu machen und kann es damit auch nicht vergessen. Dabei wird auch der Destruktor aufgerufen.

    Wenn du schon exakt bist, dann solltest du aber auch Begriffe, wie Stack und Heap vermeiden und eher von automatischen (automatic) und dynamischen (dynamic) Speicher reden. Denn ob jetzt etwas wirklich auf dem Stack oder Heap angelegt wird kann dem Programmierer völlig egal sein. Ihn interessiert nur das unterschiedliche Verhalten.

    knivil schrieb:

    Nein, erst nachdem der Konstruktor verlassen wird.

    Exakt. Und das kann auch beobachtet werden, wenn eine Exception aus dem ctor fliegt. Dann wird der Destruktor NICHT aufgerufen, was oftmals noch wichtig zu wissen ist.
    Wollts nur als Ergänzung anfügen.



  • tntnet schrieb:

    Die Antworten sind mir ein wenig zu unpräzise. Ein Konstruktor erstellt keine Objekte und ein Destruktor zerstört auch keine. Ein Konstruktor initialisiert Klassen und ein Destruktor räumt auf.

    Wenn ich eine Klasse erstelle, dann wird immer ein Konstruktor aufgerufen, in dem ich die Möglichkeit habe, die Klasse zu initialisieren. Wird eine Klasse zerstört, dann wird der Destruktor aufgerufen, wo ich eben Aufräumarbeiten durchführen kann.

    Ich hingegen halte das nicht nur für unpräzise, sondern für falsch. Die Klasse ist nur der Typ, gewissenmassen also die Vorlage für ein Objekt bzw. eine Instanz. Du kannst zur Laufzeit weder Klassen initialisieren noch aufräumen. Genauer gesagt existieren die Klassen an sich nach der Kompilierzeit gar nicht mehr, schon gar nicht in einer Flexibilität, die solche Operationen zuliesse (zumindest in C++). Das sind Objekte.

    Dass ein Konstruktor Objekte erstellt und ein Destruktor sie zerstört, hat schon seine Richtigkeit.

    tntnet schrieb:

    Klassen werden entweder auf dem Stack oder auf dem Heap angelegt. Lege ich Objekte auf den Stack, werden die Objekte automatisch beim Verlassen des Gültigkeitsbeireiches gelöscht. Das brauche ich nicht explizit zu machen und kann es damit auch nicht vergessen. Dabei wird auch der Destruktor aufgerufen.

    Genauso wenig kannst du Klassen auf den Stack oder Heap (besser Freestore) legen, das sind wiederum Objekte.


Anmelden zum Antworten