Referenzen auf Objekte übergeben ... Anfänger Problem / Hilfe
-
Hi, ich bin relativ neu in c++ und konnte mich eine sehr lange Zeit nicht mehr mit c++ beschäftigen wegen schule und weiters

naja da ich jetzt endlich wieder Zeit hab, hab ich wieder angefangen mit c++ und hab ein ernstes Problem (jedenfalls für mich)
Den Code den ich poste ist aus einem Beispiel von meinem Buch, jedoch versteh ich nicht was der Autor sagen will -.-
(Ich weiß dass das nicht der sauberste Code ist da alles in der main.cpp steht aber wie gesagt das ist jetzt ein Beispiel aus meinem Buch)
// ------------------------------------------------------------- // INCLUDES // ------------------------------------------------------------- #include "stdafx.h" #include <iostream> // ------------------------------------------------------------- // KLASSEN DEKLARATIONEN // ------------------------------------------------------------- class CSimpleCat { public: CSimpleCat(); // Konstruktor CSimpleCat(CSimpleCat &); // Kopierkonstruktor ~CSimpleCat(); // Destruktor int GetAge() const { return itsAge; } void SetAge(int age) { itsAge = age; } private: int itsAge; }; // ------------------------------------------------------------- // FUNKTIONS-PROTOTYPEN // ------------------------------------------------------------- const CSimpleCat & functionTwo(const CSimpleCat &); // ------------------------------------------------------------- using namespace std; int main() { cout << "Eine Katze erzeugen...." << endl; CSimpleCat frisky; cout << "Frisky ist " << frisky.GetAge() << " Jahre alt!" << endl; int age = 5; frisky.SetAge(age); cout << "Frisky ist " << frisky.GetAge() << " Jahre alt!" << endl; cout << "functionTwo aufrufen...." << endl; functionTwo(frisky); cout << "Frisky ist : " << frisky.GetAge() << " Jahre alt!" << endl; getchar(); return 0; } // ------------------------------------------------------------- CSimpleCat::CSimpleCat() { cout << "CSimpleCat Konstruktor..." << endl; itsAge = 1; } CSimpleCat::CSimpleCat(CSimpleCat &) { cout << "CSimpleCat Kopierkonstruktor..." << endl; } CSimpleCat::~CSimpleCat() { cout << "CSimpleCat Destruktor..." << endl; } // ------------------------------------------------------------- const CSimpleCat & functionTwo(const CSimpleCat &theCat) { cout << "functionTwo. Rueckkehr...." << endl; cout << "Frisky ist jetzt " << theCat.GetAge() << " Jahre alt!" << endl; // theCat->SetAge(8); const ! return theCat; }also meine genaues Problem ist dass ich folgendes nicht wirklich verstehe
const CSimpleCat & functionTwo(const CSimpleCat &);Das Argument der Funktion ist ja eine Referenz eines CSimpleCat Objekts, aber was ich nicht versteh ist der & - Operator vor dem Funktionsname und was der genau bewirkt
Ich wär euch sehr dankbar wenn ihr mir dass schnell erklären könntet wenn es euch nichts ausmacht
vielen dank
lg c4fEDIT: Also ich weiß dass man dadurch viele Aufrufe des Kopierkonstruktors und Destruktors spart, viel Speicher und dass das Program schneller läuft... aber es reicht mir nicht aus zu wissen dass es so ist aber ich viel es auch verstehen.
Ich verstehe nicht warum noch die Funktion als Referenz auf das Objekt übergeben wird und was da genau "passiert". Mir ist nur aufgefallen dass der Destruktor dann 1x weniger aufgerufen wird aber warum?
-
Kann mir wirklich keiner helfen?

lg c4f
-
Wenn das Argument keine Refernz wäre könntest du das alter zwar auf 8 Jahre ändern (Hast du auskommentiert), jedoch würde sich das nicht auf frisky auswirken, da das Argument kopiert werden würde (nur für diese Funktion):
const CSimpleCat & functionTwo(const CSimpleCat theCat) { //Hier wird eine Kopie von frisky erstellt, die Referenz verhindert dies. cout << "functionTwo. Rueckkehr...." << endl; cout << "Frisky ist jetzt " << theCat.GetAge() << " Jahre alt!" << endl; theCat->SetAge(8); const ! return theCat;Der Rückgabewert könnte hier void sein da du ihn nicht benutzt, jedoch ist er im Besipiel wieder eine Refernz, was bedeutet das du sowas machen könntest:
functionTwo(frisky)->setAge(101);Auf diese Weise wird das Alter von frisky verändert. Wäre der Rückabetyp keine Refernz würdest du das alter einer temporären Kopie von frisky verändern, was dann keinen Einfluss auf frisky hätte.
Ich hoff das kann man verstehen ^^
-
@Pigeon : Danke das hat mir sehr geholfen und hat Licht ins Dunkle gebracht

Der Autor hatte es leider nicht genau erklärt deswegen hatte ich es nicht ganz kapiert, aber danke das hat mir jetzt viel geholfen
lg c4f
-
Pigeon schrieb:
Auf diese Weise wird das Alter von frisky verändert.
[b]const[/b] CSimpleCat & functionTwo(const CSimpleCat &);
-
Das const hab ich übersehn

-
Pigeon schrieb:
Das const hab ich übersehn

Ist nicht weiter tragisch
mir war's auch aufgefalen aber hatte schon verstanden was du mir sagen wolltest 
Wie gesagt du hast mir sehr geholfen

lg c4f