C++ Kopierkonstruktor

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Der Aufruf des CopyConstructors erfolgt implizit, wenn Du ein CRaumschiff "by value" übergibst, in diesem Fall also bei "Jaeger.ZeigeWerte();". Versuche einmal die Deklaration von Funktion() nach

void Funktion (const CRaumschiff& Schiff)

zu ändern, dann sollte der Aufruf verschwinden. Falls das allerdings nicht in dem Buch erklärt ist (und warum man Objekte wenn möglich immer als Referenz übergeben sollte!) taugt's nicht viel.... dann lieber "Thinking in C++" von Bruce Eckel :-)

Danke für den Tipp mit der Referent. Als ich dieses Kapitel gelesen habe, habe ich vergessen was eine Referenz ist :S . Ist mir wieder eingefallen und werde mir das alles noch einmal in Ruhe durch lesen. Ich werde mich dann wahrscheinlich morgen nocheinmal melden, falls ich fragen haben sollte.

0

Die erste Frage hat possel ja schon richtig beantwortet (Stichwort: "Funktion" ist call-by-value, es wird also eine Kopie des Objektes übergeben)

Beim copy-Konstruktor wird eine Kopie des Objektes zurückgegeben. Daher muss auch im Parameter m_Geschwindigkeit des neuen Objektes der entsprechende Wert des alten Objektes kopiert werden. In die Zeile kannst du noch einen this-Objekt einfügen, dann wird es vielleicht klarer:

 this->m_pGeschwindigkeit = new int;
 *this->m_pGeschwindigkeit = *(rhs.m_pGeschwindigkeit);

Schreibe mal in jede Methode eine AUsgabe. Am besten über std::cerr und nicht std::cout. Dann bekommst Du so etwas wie:

Konstruktor wurde aufgerufen.

ZeigeWerte wurde aufgerufen

Geschwindigkeit: 1541

Kopierkonstruktor wurde aufgerufen.

Funktion wurde aufgerufen

ZeigeWerte wurde aufgerufen

Geschwindigkeit: 1541

Destruktor wurde aufgerufen.

Destruktor wurde aufgerufen.

Eine Frage. Warum hast du den Typ von Geschwindigkeit als Pointer (int*) vereinbart? Ein int (besser double?) wäre einfacher gewesen. Das spart dann auch den Ärger mit new, den man eventuell bei der Weiterentwicklung des Programmes bekommen könnte.

Was möchtest Du wissen?