2011-02-25 11 views
11

Ho sentito che viene utilizzato come operatore di overload + per esempioL'utilizzo di unario più dell'operatore

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; 
} 

Questa è davvero l'uso di unario più dell'operatore o è davvero un operatore binario +?

risposta

18

questo non è sovraccarico e utilizzando unario + .. È necessario sia fare che una funzione libera o fare la funzione di membro prendere 0 argomenti

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

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

Potrebbe restituire un 'riferimento' invece un valore? – user963241

+4

@cpx sì ma probabilmente sarebbe una cattiva idea, perché tutti i tipi come 'int' producono anche un valore, invece di un riferimento alla variabile originale. "Fai come gli inti" (Scott Meyers). –

5

Questo è un binario operatore +. Per sovraccaricare l'operatore unario più, avresti bisogno di something like this.

2

Quando una funzione operatore è una funzione membro, ha un argomento in più (this) rispetto a quanto esplicitamente menzionato nella dichiarazione. Quindi nel tuo caso è il + binario, il primo argomento è this, il secondo è l'argomento passato.

1

Questo è stato chiesto alcune volte prima.

L'operatore + è binario. Se definito come funzione membro deve essere const.

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

E 'abbastanza spesso implementata in termini di operatori + =

Nota è stata attivata la proprietà commutativa ma funzionerà come + per int è commutativa.

Un operatore unario + come membro non accetta parametri e non modifica l'oggetto, pertanto dovrebbe essere const. L'implementazione dipende dal tuo oggetto. Potresti usarlo come "abs" per il tuo int. (Usarlo come no-op serve a poco).

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

Usarlo come abs, d'altra parte, sarebbe solo confuso. – UncleBens

+1

Sì, ma non vedo alcun motivo nel sovraccaricare un operatore per essere un non-operatore, anche se costringe una copia. – CashCow

+1

Quindi non sovraccaricare l'operatore +. Se si desidera il valore assoluto, utilizzare una funzione che significa valore assoluto. –

Problemi correlati