c++操作符重载作为函数调用
C++ operator overloading called as function
我正在尝试操作符重载,发现了一些我无法解释的东西:
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]
相关文章:
- C++ 如何重载 [] 运算符并进行函数调用
- 检查类是否具有可能重载的函数调用运算符
- 避免在人为的重载函数调用中拼写出类型
- 为什么使用不匹配的参数调用重载函数仍然有效
- C++ 类的构造函数和函数调用运算符 () 重载之间的歧义
- C++编译时检查是否可以用某种类型的参数调用重载函数
- 在 if 语句中调用重载构造函数失败
- 重载运算符主体仅包含一个函数调用
- 为什么在析构函数中引发异常时不调用重载删除
- 重载<<运算符的函数调用 (C++)
- 从派生类调用重载函数
- 传递 const int* 和 int* 时调用重载函数的不同版本(const int* const&/&&)
- 将函数调用替换为重载运算符 C++
- C++ - 在 std::thread 中调用重载函数时编译失败
- 调用非静态函数的重载括号运算符
- 为什么为单个赋值操作调用复制构造函数和重载赋值运算符
- 使用重载运算符在函数调用时执行操作
- 重载的函数调用double不明确
- 从成员函数调用重载操作符(静态)
- 从默认构造函数调用重载构造函数时,维护对象状态信息