Destruktor/Konstruktor Aufgabe



  • In der Klasur bekommen wir zum Beispiel folgenden Quelltext:

    #include <iostream>
    using namespace std;
    class Zwei
    {
    char name;
    public:
    Zwei( const char& n) : name(n) {cout <<"KZwei von " << name
    << endl;}
    ~Zwei(){ cout <<"DZwei von " << name << endl; }
    };
    class Eins
    {
    Zwei member1, member2;
    public:
    Eins( const Zwei& m1, const Zwei& m2) // Konstruktor
    : member1(m2), member2(m1) {cout << "KEins!" << endl;}
    ~Eins()
    { cout << "DEins!" << endl; }
    };
    int main()
    {
    Zwei Objekt1(99), Objekt2(33);
    Eins aEins( Objekt1, Objekt2);
    Eins * EPtr = new Eins (Objekt1,Objekt2);
    cout << "Main Ende!" << endl;
    return 0;
    }
    

    Die Ausgabe lautet:

    KZwei von c
    KZwei von !
    KEins!
    KEins!
    Main Ende!
    DEins!
    DZwei von c
    DZwei von !
    DZwei von !
    DZwei von c

    So ganz versteh ich das aber nicht^^
    Ich versuchs ma so weit ichs vertsehe zu erklären, wär gut wenn mir jemand helfen kann.

    Man erzeugt 2 Objekte deren wert (99 und 33) per Referenz an n übergeben wird.
    Da es eine Char Variable ist, wird bei der Ausgabe der Wert in ein Zeichen Umgewandelt (ACII tabelle) Es wird somit 2 mal der Konstruktor aufgerufen, der die Ausgabe "KZwei von c" und "KZwei von !" erzeugt.

    Danach wird es ziemlich wüst, wenn das objekt der klasse 1 und der pointer per new operator erzeugt wird 😕 kann mir jemand kurz erklären wieso die ausgabe so weiter geht, wie er der kompiler eben tut ?^^



  • Rück den Code mal vernünftig ein. oO

    Juleian* schrieb:

    KZwei von c
    KZwei von !

    Werden natürlich von Objekt1 und Objekt2 geschrieben.

    Juleian* schrieb:

    KEins!

    Das hier gehört zum aEins, klar. Hier werden Objekt1 und Objekt2 übrigens kopiert, allerdings siehst du das nicht, weil der Kopierkonstruktor keine Ausgabe erzeugt.

    Juleian* schrieb:

    KEins!

    Das über new erzeugte Objekt. Objekt1 und Objekt2 werden hier wieder im Stillen kopiert.

    Juleian* schrieb:

    Main Ende!

    Logisch.
    Ab hier werden die Objekte die auf dem Stack liegen in umgekehrter Reihenfolge wieder zerstört.

    Juleian* schrieb:

    DEins!

    Ausgabe im Destruktor von aEins.

    Juleian* schrieb:

    DZwei von c
    DZwei von !

    Hier werden die Membervariablen von aEins zerstört. c steht dabei zuerst, weil der Konstruktor von "Zwei" die Reihenfolge vertauscht.

    Juleian* schrieb:

    DZwei von !
    DZwei von c

    Objekt2 und Objekt1 werden zerstört.

    Es fällt natürlich auf, dass die mit new angelegten Objekte nicht zerstört werden.



  • ok soweit eig verständlich. das objekt mit dem new operator wird ja nicht zerstört weils im heap angelegt wird. die vertauschte reihenfolge beim destruktoraufruf der verborgenen kopierten objekte ergit sich doch aus dieser zeile: : member1(m2), member2(m1) {cout << "KEins!" << endl;) ?
    kennst du eine gute seite wo ich genaueres zu dem kopierkonstruktor nachlesen kann?

    danke schonmal; der quellcode ist übrigens so durcheinander in der klausur 😉




Anmelden zum Antworten