2012-04-09 21 views
6

Powiel możliwe:
Operator overloadingC++ operator == przeciążenia

Jakie są różnice między następującymi sposobami przeciążyć operator ==?

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

i

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

Który sposób jest lepszy?

+3

Możesz znaleźć odpowiedź na to pytanie i wiele innych w [Operator przeładowujący FAQ] (http://stackoverflow.com/questions/4421706/operator-overloading) :) –

+0

Najczęściej zadawane pytania: "Operatory porównania binarnych infiksów powinien, zgodnie z zasadami, zostać wdrożony jako funkcje nie będące członkami ", ale nie uzasadnia, dlaczego ta reguła istnieje - http://stackoverflow.com/questions/4421706/operator-overloading/4421719#4421719 – danio

Odpowiedz

1

to:

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

jest funkcją, która porównuje dwa obiekty.

to:

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

jest funkcją członkiem.

Powinieneś użyć tej zaproponowanej przez twój standard kodowania lub użyć tego, który preferujesz. Żadne nie jest lepsze. Niektórzy ludzie (w tym ja) wolą mieć operatora porównania jako funkcję, inni wolą go jako funkcję członka.

Nawiasem mówiąc, parametry powinny być typu const MyClass &.

2

Pierwszy to funkcja zewnętrznego przyjaciela (free funkcja)

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

drugie jest funkcja członek

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

Należy użyć drugi wariant zawsze wtedy można

Należy użyć pierwszy wariant, w case: 1) Pierwszy argument to klasa zewnętrzna (biblioteka)

friend ostream& operator<< (ostream &out, MyClass &m) 

2) logika Operatora nie związane z klasy i muszą być realizowane oddzielnie

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

(bo klasa nie może wiedzieć wszystko o klasach, które mogą wymagać w porównania operatora)

+0

-1 : przepraszam, ale pierwszy wariant powinien być na ogół preferowany, jak wyjaśniono w mojej odpowiedzi. –

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

Argumenty powinny być następujące: const - friend bool operator==(const MyClass& lhs, const MyClass& rhs);. Jest to preferowane, ponieważ działa, gdy pierwszy argument może zostać niejawnie skonstruowany. Na przykład, jeśli std::string ma tylko funkcję składową operator==, to nie będzie jej używać "abc" == my_std_string! Ale funkcja nie-członkowska może zostać wywołana przez niejawne skonstruowanie ciągu znaków z "abc" (jeszcze lepiej w tym konkretnym przypadku można podać oddzielne bool operator==(const char*, const std::string&) ze względów wydajnościowych, ale punkt wciąż jest ważny - funkcje nie będące członkami mogą pomóc w zapewnieniu operator działa z typem zdefiniowanym przez użytkownika po dowolnej stronie).

Oddzielnie, domyślni konstruktorzy są nieco niebezpieczni - i chcecie się mocno zastanowić nad wygodą a niebezpieczeństwem ich użycia.