2012-10-07 5 views
5

vom previous question Weiter Ich mag würde fragen, warum der „Freund“ Form zusätzlich in einer Überschreibung C++ OperatorC++ Operator Override - warum ist es Freund bevorzugt?

bevorzugt wird

Fassen wir zusammen:

für den Additionsoperator Überschreibung gibt es zwei Möglichkeiten, es zu tun :

int operator+(Object& e); 
friend int operator+(Object& left, Object& right); 

Warum ist die zweite (Freund) Form bevorzugt? Was sind die Vorteile?

+1

Wahrscheinlich besser die entsprechenden Bits zu zitieren von der letzten Frage, damit die Leute nicht durchklicken müssen (und auch für den Fall, dass die Frage verschwindet) – nneonneo

Antwort

5

Die Nichtmitgliedsversion (Freund oder nicht) wird bevorzugt, da sie implizite Konvertierungen sowohl auf der linken als auch auf der rechten Seite des Operators unterstützen kann.

eine Art gegeben, die implizit konvertierbar ist zu diesem Objekt

kann
struct Widget 
{ 
    operator Object() const; 
}; 

Nur die Nicht-Mitglied-Version, wenn eine Instanz von Widget erscheint auf der linken Seite aufgerufen werden:

Widget w; 
Object o; 

o + w; // can call Object::operator+(Object &) since left-hand side is Object 
w + o; // can only call operator+(Object &, Object &) 

Als Antwort auf Ihren Kommentar:

Durch die Definition der Konvertierung op Erator in Widget, wir informieren den Compiler, dass Instanzen von Widget automatisch in Instanzen von Object konvertiert werden können.

Widget w; 
Object o = w; // conversion 

Im Ausdruck o + w, ruft der Kompilierer Object::operator+(Object &) mit einem Argument, erzeugt durch w zu einer Object umwandelt. Das Ergebnis ist das gleiche wie das Schreiben o + w.operator Object().

Aber im Ausdruck w + o sucht der Compiler nach Widget::operator+ (die nicht existiert) oder ein Nichtmitglied operator+(Widget, Object). Letzteres kann durch Umwandlung von w in Object wie oben beschrieben aufgerufen werden.

+0

Ich verstehe den Widget/Objekt-Struktur-Code nicht ganz, können Sie bitte ein einfaches und extrem kurzes Beispiel geben? –

2

Die Regel ist nicht universal: Die friend Version wird bevorzugt, wenn Sie eine logisch symmetrische Operation implementieren, die zwei Argumente des gleichen Typs, wie der Fall, den Ihr Beitrag zeigt, verwendet.

Diese Implementierung unterstreicht die Tatsache, dass der Betrieb wirklich symmetrisch ist: es ist kein ‚dieses Objekt‘, die Object e ihr fügt - besser gesagt, das ist ein Zusatz von lhs und rhs.

In Situationen, in denen der Betrieb ist nicht symmetrisch - zum Beispiel, wenn Sie ein int zu einem Iterator hinzufügen möchte, sollten Sie die erste Art und Weise der Umsetzung Betreiber bevorzugen, nämlich

Object& operator+(int& offset);