0

Ich habe viele Tutorials gesehen und versucht, die Antwort auf Stackoverflow aber ohne Erfolg zu finden.Operator überladen C++ Referenz oder Wert

Worüber ich mir nicht sicher bin; Gibt es eine Praxis, wann man nach Wert oder durch Referenz zurückkehrt, wenn man einen Operator überlädt?

Für z.B.

Class &operator+(){ 
    Class obj; 
    //... 
    return obj; 
} 

oder das Gleiche, aber von Wert

Class operator+(){ 
    Class obj; 
    //... 
    return obj; 
} 

Und ich würde zu erwähnen, ich habe bemerkt, dass Fälle, in fast 90% der, wenn das gleiche Objekt zurückkehrt (*this), ist auf dasselbe Objekt verwiesen wird zurückgegeben. Könnte jemand erklären, warum das so ist?

+0

Sie meinen wie obj = obj1 + obj2 + obj3; ? –

+0

Das erste Beispiel ist falsch, geben Sie keine lokale Variable als Referenz zurück. – masterxilo

Antwort

2

... gibt es eine Praxis, wann nach Wert oder durch Referenz, wenn Überlastung Operator?

Ja, es gibt einige kanonische Formen found here. Sie haben nicht alle dieselbe Form - sie variieren je nach Betreiber. Der allgemeine Rat ist, der Semantik der eingebauten Typen zu folgen. Wie bei allen Funktionen gelten weiterhin allgemeine Regeln, z. B. keine Verweise auf lokale Variablen (wie im OP angezeigt).

z. (gefunden in dem obigen Link) gegeben der Additionsoperator der Frage;

class X 
{ 
public: 
    X& operator+=(const X& rhs) // compound assignment (does not need to be a member, 
    {       // but often is, to modify the private members) 
    /* addition of rhs to *this takes place here */ 
    return *this; // return the result by reference 
    } 

    // friends defined inside class body are inline and are hidden from non-ADL lookup 
    friend X operator+(X lhs,  // passing lhs by value helps optimize chained a+b+c 
        const X& rhs) // otherwise, both parameters may be const references 
    { 
    lhs += rhs; // reuse compound assignment 
    return lhs; // return the result by value (uses move constructor) 
    } 
}; 

The operator+ ist ein Dritt Verfahren (oft als friend) und kehrt nach Wert - dies auf die Semantik der in Typen aufgebaut entspricht. In ähnlicher Weise ist die operator+= eine Member-Methode und gibt als Referenz zurück (eine aktualisierte Version von *this).

... wird bei der Rückgabe desselben Objekts (*this) auf dasselbe zurückgegebene Objekt verwiesen. Könnte jemand erklären, warum das so ist?

Wenn der Rückgabetyp wird durch Wert (X operator+), dann bedeutet return *this;, dass eine Kopie des aktuellen Objekts (was durch this gerichtet ist) hergestellt ist und zurückgegeben.

Wenn der Rückgabetyp durch-Referenz (X& operator+), dann bedeutet return *this;, dass ein Verweis auf das aktuelle Objekt (was durch this gezeigt wird) zurückgeführt wird (das heißt keine Kopie).

+0

Also im Grunde muss ich die Referenz des gleichen Objekts zurückgeben, wenn ich die Kettenaddition machen möchte? Kein anderer Unterschied als nur das Zurückbringen * dieses? –

+0

Es würde eine Kopie von "* this" erstellen. – Niall

1

Die erste Möglichkeit, von operator+ per Referenz zurückzukommen, ist falsch, weil Sie das lokale Objekt per Referenz zurückgeben, das lokale Objekt jedoch nicht mehr existiert, nachdem die Operatorfunktion beendet ist. Allgemein gilt:

  • Mutierende Operatoren wie += oder -= Rückkehr Bezug genommen wird, weil sie zurückkommen, die das mutierte Objekt selbst (von: return *this;)
  • Normale Operatoren wie + oder - sollte als Wert zurückgeben, weil ein neues Objekt muss konstruiert sein, um das Ergebnis zu halten.