2015-08-31 17 views
6

sto sperimentando l'overloading degli operatori e ha scoperto qualcosa che non riesco a spiegare:C++ operatore sovraccarichi chiamato come funzione

WeekDays.h

using namespace std; 
enum DAYS 
{ 
    MON, 
    TUE, 
    WED, 
    THU, 
    FRY, 
    SAT, 
    SUN 
}; 

DAYS operator+(DAYS&a,DAYS &b) 
{ 
    printf("Binary+ called\n"); 
    return (DAYS)(((unsigned int)a+(unsigned int)b)%7); 
} 

//Increment 3 
DAYS operator+(DAYS&a) 
{ 
    printf("Unary+ called\n"); 
    return (DAYS)(((unsigned int)a+3)%7); 
} 

ostream& operator<<(ostream&o, DAYS &a) 
{ 
    switch(a){ 
    case MON: o<<"MON"; break; 
    case TUE: o<<"TUE"; break; 
    case WED: o<<"WED"; break; 
    case THU: o<<"THU"; break; 
    case FRY: o<<"FRY"; break; 
    case SAT: o<<"SAT"; break; 
    case SUN: o<<"SUN"; break; 
    } 
    return o; 
}; 

Main.cpp

#include <iostream> 
#include "WeekDays.h" 
using namespace std; 

void main() 
{ 
    DAYS a=MON; //=0 
    DAYS b=TUE; //=1 
    cout<< +a  <<endl; 
    cout<< +b  <<endl; 
    cout<< +(a,b) <<endl; 
    cout<< (a+b) <<endl; 
    cin.get(); 
} 

uscita è

Unary+ called 
3 
Unary+ called 
4 
Unary+ called 
4 
Binary+ called 
1 

Perché + (a, b) viene valutato come operatore unario + b? Non sono riuscito a spiegarlo.

Collegamento alla filettatura pertinente Operator overloading. Sto usando VisualStudio 2012.

risposta

10

Con (a,b) ti capita di invocare lo strano "comma" operator, che valuta prima a, quindi b, e infine restituisce b.

È possibile chiamare il proprio operatore digitandolo come operator+(a,b). (Qui la virgola è un separatore per i parametri e non l'operatore virgola).

+0

Poiché entrambi gli operatori unario e binario + hanno una precedenza più alta, mi aspetterei che sia valutato prima '+()', interpretando quindi la virgola come separatore anziché operatore virgola. Come fa il compilatore a decidere che '+ (a, b)' è unario +? –

+1

Le parentesi di @LorenzoBelli cambiano l'ordine di valutazione: '+ (a, b)' valuta prima il contenuto delle parentesi e poi l'unario '+' mentre + a, b prima valuta '+ a' poi la virgola e poi b . –

1

prega di dare un'occhiata al link http://en.cppreference.com/w/cpp/language/operator_arithmetic

unario più, alias + un'aggiunta

T::operator+() const; 
T operator+(const T &a); 

, aka a + b

T::operator+(const T2 &b) const;  
T T operator+(const T &a, const T2 &b); 

Con il vostro operatore di overload + (a, b) si dovrebbe ottenere almeno questo avviso: avviso : l'operando sinistro dell'operatore virgola non ha alcun effetto [-Valore invisibile]