Frage zu fragwürdiger Objekterzeugung?
-
Hallo,
ich habe eine Frage zu folgendem Programm:
#include <iostream> using namespace std; class Mietobjekt { public: Mietobjekt() { cout << 'K'; } Mietobjekt(Mietobjekt & m) { cout << 'C'; } ~Mietobjekt() { cout << 'D'; } virtual void Test() { Mietobjekt tmp; cout << 'M'; } void Test2(Mietobjekt m) { cout << 'P'; } }; class Wohnung: public Mietobjekt { public: Wohnung() { cout << '1'; } Wohnung(Wohnung & w):Mietobjekt(w) { cout << '2'; } ~Wohnung() { cout << '3'; } void Test() { cout << '4'; } }; int main() { Mietobjekt m1; cout << endl; // Ausgabe: K Wohnung w1; cout << endl; // Ausgabe: K1 Wohnung w2(w1); cout << endl; // Ausgabe: C2 Mietobjekt *m2p = new Mietobjekt(w1); cout << endl; // Ausgabe: C m1.Test(); cout << endl; // Ausgabe: KMD :arrow_right: m1.Test2(*m2p); cout << endl; // Ausgabe: CPD delete m2p; cout << endl; // Ausgabe: D m2p = &w1; cout << endl; m2p->Test(); cout << endl; // Ausgabe: 4 cin.ignore(); return 0; }In der markierten Zeile, mit der Ausgabe CPD komme ich nicht klar.
Mir ist klar, dass bei der Zeile davor der Konstruktor und Dekonstruktor aufgerufen wird. Jedoch ist mir nicht klar, warum in der markierten Zeile der Kopierkonstruktor und Dekonstruktor aufgerufen wird. Eigentlich würde ich sagen, dass da gar kein Objekt erzeugt wird, aber scheinbar irre ich da ja?Ich hoffe ihr könnt mir erklären, warum in der Zeile ein Objekt erzeugt wird, vor allem wieso.
Danke für die Mühe
MfG ViperT
-
Weil du eine Temporäre-Variable anlegst. Nimm mal als parameter eine konstante-Referenz und die unnötige Temp-Variable verschwindet.
-
Ok danke jetzt bin ich dahinter gestiegen, manchmal ist ein kleiner Denkanstoss in die passende Richtung echt Gold Wert ^^
MfG ViperT
-
Die Kopierkonstrukturen kommen mir in diesem Zusammenhang auch ein wenig komisch vor, die sollten auch mit 'const'-Referenzen versorgt werden.