2012-11-16 4 views
5

Wenn eine Klasse operator+ überlädt, sollte es const deklariert werden, da es keine Zuweisung auf dem Objekt tut? Ich weiß auch, dass operator= und 10 eine Referenz zurückgeben, weil eine Zuweisung vorgenommen wird. Aber was ist mit operator+? Wenn ich es implementiere, sollte ich eine Kopie des aktuellen Objekts machen, das gegebene Objekt zu diesem hinzufügen und diesen Wert zurückgeben?C++ - Soll ich `operator +` const machen? Und gibt es eine Referenz zurück?

Hier ist, was ich habe:

class Point 
{ 
public: 
    int x, int y; 

    Point& operator += (const Point& other) { 
     X += other.x; 
     Y += other.y; 
     return *this; 
    } 

    // The above seems pretty straightforward to me, but what about this?: 
    Point operator + (const Point& other) const { // Should this be const? 
     Point copy; 
     copy.x = x + other.x; 
     copy.y = y + other.y; 
     return copy; 
    } 
}; 

Ist dies eine korrekte Umsetzung der operator+? Oder gibt es etwas, das ich übersehe, das Probleme oder unerwünschtes/undefiniertes Verhalten verursachen könnte?

+1

Viele Details der Operator Überladung können hier gefunden werden: http://StackOverflow.com/Questions/4421706/Operator-Overloading – chris

Antwort

6

Besser als das, sollten Sie ihm eine kostenlose Funktion machen:

Point operator+(Point lhs, const Point& rhs) { // lhs is a copy 
    lhs += rhs; 
    return lhs; 
} 

Aber ja, wenn man es als Mitglied Funktion verlassen sollte es const sein, da es nicht das linke Seite Objekt nicht verändert.

Bezug darauf, ob ein Verweis oder eine Kopie zurückzubringen, ist die Hinweise für die Bedienungsperson Überlastung als Grundtypen tun tun (d tun, wie int s tun). In diesem Fall gibt die Addition für zwei Ganzzahlen eine separate Ganzzahl zurück, die keine Referenz auf eine der beiden Eingaben ist.

+0

Ah, ich verstehe. Vielen Dank. Was ist der Vorteil davon, dass es eine freie Funktion hat? –

+1

@BrandonMiller: Symmetrie in Bezug auf Typen. Wenn Ihr Typ einen impliziten Konvertierungskonstruktor hat (d. H. Implizit von einem anderen Typ konvertiert werden kann), erlaubt die freie Funktionsimplementierung Konvertierungen für beide Argumente, während die Elementfunktion nur Konvertierungen auf der rechten Seite ausführen kann. –

+0

Einige gute Informationen dort! Daran hatte ich nie gedacht. –