2012-04-09 1 views
6

Mögliche Duplizieren Überlastung:
Operator overloadingC++ Operator ==

Was sind die Unterschiede zwischen den folgenden Möglichkeiten, um Betreiber zu Überlastung ==?

// stroustrup way 
friend bool operator== (MyClass &lhs, MyClass &rhs); 

und

// as taught in other places, including caltech 
bool MyClass::operator== (MyClass &rhs); 

Welcher Weg ist besser?

+3

Die Antwort auf diese Frage und vieles mehr finden Sie in der [FAQ zum Überladen von Operatoren] (http://stackoverflow.com/questions/4421706/operator-overloading) :) –

+0

Die FAQ sagt "Die binären Infix Vergleichsoperatoren sollte nach den Faustregeln als Nichtmitgliedsfunktionen implementiert werden, "aber es begründet nicht, warum diese Regel existiert - http://stackoverflow.com/questions/4421706/operator-overloading/4421719#4421719 – danio

Antwort

1

Dieser:

friend bool operator== (MyClass &lhs, MyClass &rhs); 

ist eine Funktion, die zwei Objekte vergleicht.

Dies:

bool MyClass::operator== (MyClass &rhs); 

ist Mitglied Funktion.

Sie sollten den von Ihrem Codierungsstandard vorgeschlagenen verwenden oder den von Ihnen bevorzugten verwenden. Nichts ist besser. Einige Leute (einschließlich mir) bevorzugen den Vergleichsoperator als Funktion, andere bevorzugen ihn als Elementfunktion.

Übrigens sollten die Parameter vom Typ const MyClass & sein.

2

Zunächst ist die externe friend-Funktion (Freisprechfunktion)

friend bool operator== (MyClass &lhs, MyClass &rhs); 

Zweitens ist Mitglied Funktion

bool MyClass::operator== (MyClass &rhs); 

Sie zweite Variante verwenden sollte immer dann können Sie

Sie erste Variante verwenden sollten in Fall: 1) Erstes Argument ist die externe (Bibliotheks-) Klasse

2) Betriebs Logik nicht zu Ihrer Klasse verwandt und muss separat

friend bool operator(const MyClass& my, const std::string& string_form) 

(weil Ihre Klasse wissen alles über Klassen können nicht Operator) implementiert werden, die brauchen

+0

-1 : Entschuldigung, aber die erste Variante sollte generell bevorzugt werden, wie in meiner Antwort erklärt. –

3
// stroustrup way 
friend bool operator== (MyClass &lhs, MyClass &rhs); 
kann in vergleichen

Argumente sollten const - friend bool operator==(const MyClass& lhs, const MyClass& rhs); sein. Dies wird bevorzugt, da es funktioniert, wenn das erste Argument implizit konstruiert werden kann. Wenn zum Beispiel std::string nur eine Elementfunktion operator== hatte, würde "abc" == my_std_string sie nicht aufrufen! Die Nichtmitgliedsfunktion kann jedoch aufgerufen werden, indem implizit eine Zeichenfolge aus "abc" erstellt wird (besser ist in diesem speziellen Fall eine separate bool operator==(const char*, const std::string&) aus Leistungsgründen vorgesehen, aber der Punkt steht immer noch - Nichtmitgliedsfunktionen können dazu beitragen, sicherzustellen Der Operator arbeitet mit dem benutzerdefinierten Typ auf jeder Seite.

Separat sind implizite Konstruktoren ein bisschen gefährlich - und Sie möchten über den Komfort gegen die Gefahr denken, sie zu verwenden.