2011-02-25 14 views
11

Słyszałem, jest on stosowany jako przeciążonego operatora + npZastosowanie jednoskładnikowa Plus operatora

class MyClass 
{ 
    int x; 
public: 
    MyClass(int num):x(num){} 
    MyClass operator+(const MyClass &rhs) 
    { 
     return rhs.x + x; 
    } 
}; 

int main() 
{ 
    MyClass x(100); 
    MyClass y(100); 
    MyClass z = x + y; 
} 

Czy to naprawdę wykorzystanie jednoskładnikowa oraz operatora, czy jest to naprawdę operatorem binarnym +?

Odpowiedz

18

To nie jest obciążająca i wykorzystaniem pojedynczego + .. Trzeba też zrobić że wolnej funkcji lub sprawić, że funkcja członek wziąć 0 argumenty

class MyClass 
{ 
    int x; 
public: 
    MyClass(int num):x(num){} 
    MyClass operator+() const 
    { 
     return *this; 
    } 
}; 

int main() { 
    MyClass x = 42; 
    + x; 
} 
+0

Czy zamiast wartości można podać "referencję"? – user963241

+4

@ cpx tak, ale to prawdopodobnie byłby zły pomysł, ponieważ wszystkie typy takie jak 'int' również dają wartość, zamiast odniesienia do oryginalnej zmiennej. "Zrób to jak ints" (Scott Meyers). –

2

Gdy funkcja operatora jest funkcją składową, ma jeszcze jeden argument (this) niż wyraźnie wymieniony w deklaracji. W twoim przypadku jest to binarny +, pierwszy argument to this, drugi to przekazany argument.

1

Zostało to zadane kilka razy wcześniej.

Twój operator + jest binarny. Jeśli jest zdefiniowana jako funkcja składowa, musi być stała.

class MyClass 
{ 
    int x; 
public: 
    MyClass(int num):x(num){} 
    MyClass operator+(const MyClass &rhs) const 
    { 
     return rhs.x + x; 
    } 
}; 

Jest to dość często realizowane pod względem operatora + =

Note włączeniu przemienność ale to będzie działać jak + do int jest przemienne.

Jednoargumentowy operator jako członek nie pobierał parametrów i nie modyfikowałby obiektu, dlatego powinien być stały. Implementacja zależy od twojego obiektu. Możesz użyć go jako "abs" do int. (Używanie go jako "no-op" nie ma większego sensu).

MyClass MyClass::operator+() const 
    { 
     return (x >= 0) ? MyClass(x) : MyClass(-x); 
    } 
+5

Używanie go jako abs będzie po prostu dezorientujące. – UncleBens

+1

Tak, ale nie widzę sensu w przeciążaniu operatora, by był no-op, chociaż zmusza kopię. – CashCow

+1

Nie należy przeciążać operatora +. Jeśli chcesz uzyskać wartość bezwzględną, użyj funkcji, która oznacza wartość bezwzględną. –