c++操作符重载作为函数调用

C++ operator overloading called as function

本文关键字:函数调用 重载 操作符 c++      更新时间:2023-10-16

我正在尝试操作符重载,发现了一些我无法解释的东西:

WeekDays.h

using namespace std;
enum DAYS
{
    MON,
    TUE,
    WED,
    THU,
    FRY,
    SAT,
    SUN
};
DAYS operator+(DAYS&a,DAYS &b)
{
    printf("Binary+ calledn");
    return (DAYS)(((unsigned int)a+(unsigned int)b)%7);
}
//Increment 3
DAYS operator+(DAYS&a)
{
    printf("Unary+ calledn");
    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();
}

输出
Unary+ called
3
Unary+ called
4
Unary+ called
4
Binary+ called
1

为什么+(a,b)计算为一元运算符+b ?我没能解释清楚。

链接到相关线程操作符重载。我用的是VisualStudio 2012。

对于(a,b),您恰好调用奇数"逗号"操作符,它首先求值a,然后求值b,最后返回b。

您可以通过将其拼写为operator+(a,b)来调用操作符。(这里逗号是参数的分隔符,不是逗号操作符)。

请查看链接http://en.cppreference.com/w/cpp/language/operator_arithmetic

一元加号,又名+a

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

加法,即a + b

T::operator+(const T2 &b) const;    
T T operator+(const T &a, const T2 &b);
对于你的重载操作符+(a,b),你应该至少得到这样的警告:警告:逗号操作符的左操作数无效[- unused-value]