Pointer-Verständnis-Frage



  • Hallo,... ich frische grad mein C++ ein bisschen auf und folgende Frage ist aufgetreten:

    class Calc
    {
    private:
        int m_nValue;
    
    public:
        Calc() { m_nValue = 0; }
    
        Calc& Add(int nValue) { m_nValue += nValue; return *this; }
        Calc& Sub(int nValue) { m_nValue -= nValue; return *this; }
        Calc& Mult(int nValue) { m_nValue *= nValue; return *this; }
    
        int GetValue() { return m_nValue; }
    };
    

    Man nutzt in diesem Beispiel *this, damit man durch eine Verkettung von Funktionen mehrere Aufgaben gleichzeitig erledigen kann. Aber was bedeutet das Calc&? Der Returnwert muss das Objekt sein, damit man Add(2).Sub(3)... usw., aber wieso das & am Ende?

    ps.: ich bin eine Java-geschädigte Person, die als Returnwert Calc, aber nicht Calc + komisches Sonderzeichen erwartet.



  • Aber was bedeutet das Calc&?

    & bedeuted hier Referenz.
    Simon



  • ...kann man natürlich so machen. Es kann natürlich sein, dass jemand die Funktionen aufruft, ohne das Objekt ändern zu wollen. Aus dem Grund hatte ich früher in meiner Java-Klasse "Vector3d" auch zwei Versionen ("plusEquals" und "plus" für += und +).

    In C++ geht das dann aber doch noch eleganter. Du kannst gleich die arithmetischen Operatoren überladen. Da weiß man dann sofort, woran man ist. Und: Die eigene Klasse lässt sich auch meist in generischen Algorithmen einsetzen. Zum Beispiel habe ich neulich meine point<double,3>-Klasse in eine generische Funktion gesteckt, die interpolieren soll. Weil ich für point<double,3> auch entsprechende Operatoren zur Verfügung gestellt hatte, klappte das einwandfrei ohne Extrawurst.

    class dings {
      ...
    public:
      ...
      dings& operator+=(dings const& d);
      ...
    };
    
    dings operator+(dings const& a, dings const& b)
    {
      dings ret = a; ret += b; return ret;
    }
    

    Da this ein Zeiger ist und das Ergebnis einer Zuweisung eine Referenz auf das zugewiesene Objekt sein sollte, findest Du in den ?= Operatoren (mit +, -, *, ... anstelle von ?) oft "return *this;" -- der this-Zeiger wird dereferenziert.

    Gruß,
    SP


Anmelden zum Antworten