2012-06-09 16 views
9

Czytałem the C++ FAQ. Nie znalazłem punkt w wytycznej przeciążenia operatora korzysta:Znaczenie przeciążania operatora -() jako funkcji bezpłatnej, a nie funkcji członka?

Jeśli podasz konstruktywne operatorów, powinny one pozwolić promocji operandu lewostronnego (przynajmniej w przypadku, gdy klasa ma konstruktor pojedynczego parametru który nie jest oznaczony jawnym słowem kluczowym). Na przykład, jeśli Twoja frakcja klasowa obsługuje promocję z int do frakcji (za pomocą nieostrego ctor Frakcja :: ułamek (int)), a jeśli zezwolisz na x - y dla dwóch obiektów frakcji, powinieneś także zezwolić na 42 - y. W praktyce oznacza to po prostu, że operator-() nie powinien być członkiem funkcji frakcji. Zazwyczaj uczynisz go przyjacielem, jeśli nie z innego powodu, niż zmusić go do publicznego: część klasy, ale nawet jeśli nie jest przyjacielem, nie powinien być członkiem.

Dlaczego autor napisał, że operator-() nie powinien być funkcją członka?

Jakie są złe konsekwencje, jeśli ustawię funkcję operatora() jako członka i jakie są inne konsekwencje?

+0

Należy pamiętać, że tytuł jest nieprawidłowy: 'operator()' nie może być zaimplementowany jako funkcja bezpłatna. Większość operatorów może, ale nie wszystkie. Cytat dotyczy 'operator-', a nie 'operator()' –

+0

możliwy duplikat [powinien być operator << realizowany jako przyjaciel lub funkcja członka?] (Http://stackoverflow.com/questions/236801/should -operator-być-zaimplementowany-jako-przyjaciel-lub-jako-członek-funkcja-funkcji) –

Odpowiedz

16

Oto Fraction z operatorem w funkcji użytkownik:

class Fraction 
{ 
    Fraction(int){...} 

    Fraction operator -(Fraction const& right) const { ... } 
}; 

z nim, to jest poprawny kod:

Fraction x; 
Fraction y = x - 42; 

i jego odpowiednik x.operator-(Fraction(42)); ale to nie jest:

Fraction z = 42 - x; 

Ponieważ 42 ma funkcję składową operator - w nim (oczywiście, to nie jest nawet klasa).

Jednakże, jeśli zamiast tego deklarujesz swojego operatora jako funkcję bezpłatną, operacje konwersji dotyczą obu jego argumentów. Więc to

Fraction z = 42 - x; 

zamienia się tym

Fraction z = Fraction(42) - x; 

co odpowiada operator-(Fraction(42), x).

+0

... czy możesz tutaj wyjaśnić znaczenie funkcji bezpłatnej? Czy chcesz powiedzieć funkcję znajomego? –

+0

@Abhishek Gupta: Nie, chciałem powiedzieć _free function_. Funkcja _free_ jest funkcją w zakresie przestrzeni nazw, która jest przeciwieństwem funkcji _member_. –

+0

Proszę mi również powiedzieć, jakie jest znaczenie konstruktywnych operatorów? –

Powiązane problemy