2015-08-31 17 views
6

ich mit Überladen von Operatoren ich experimentieren und fand etwas, das ich nicht erklären kann:C++ Operator als Funktion aufgerufen Überlastung

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

Ausgang ist

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

Warum wird + (a, b) als unärer Operator + b ausgewertet? Ich habe es versäumt, dies zu erklären.

Link zum relevanten Thread Operator overloading. Ich verwende VisualStudio 2012.

Antwort

10

Mit Sie zufällig die ungeraden "comma" operator aufrufen, die erste a, dann b bewertet und schließlich b zurückgibt.

Sie könnten Ihren Operator anrufen, indem Sie ihn als operator+(a,b) ausschreiben. (Hier ist das Komma ein Trennzeichen für die Parameter und nicht der Komma-Operator).

+0

Da sowohl unäre als auch binäre + Operatoren eine höhere Priorität haben, würde ich erwarten, dass '+()' zuerst ausgewertet wird, wodurch das Komma als Trennzeichen anstelle des Kommaoperators interpretiert wird. Wie entscheidet der Compiler, dass '+ (a, b)' unary + ist? –

+1

@LorenzoBelli Klammern ändert die Reihenfolge der Auswertung: '+ (a, b)' wertet zuerst den Inhalt der Klammern aus und dann das unäre '+' während + a, b zuerst '+ a', dann das Komma und dann b auswertet . –

1

Bitte nehmen Sie sich einen Blick auf den Link http://en.cppreference.com/w/cpp/language/operator_arithmetic

einstellige plus, aka + ein

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

hinaus aka a + b

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

Mit Ihrem überladenen Operator + (a, b) Sie sollten mindestens diese Warnung erhalten: Warnung: linker Operand des Komma-Operators hat keine Auswirkung [-Wundemenü]