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 c4f

    EDIT: 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


Anmelden zum Antworten