Cpp_操作符重载

一、双目操作符的重载

1.计算类双目操作符
形如L#R的表达式会被编译器处理为形如L.operator#(R)的成员函数的调用,该函数的返回值即为表达式的值。
形如L#R的表达式也可以被编译器处理为形如::operator#(L,R)的全局函数的调用,该函数的返回值即为表达式的值。
2.赋值类双目操作符
表达式的值是一个左值,而且它就是左操作数本身。
左操作数不能是常量,右操作数可以是常量。

二、单目操作符的重载

1.计算类单目操作符
形如#O的表达式会被编译器处理为形如O.operator#()的成员函数的调用,该函数的返回值即为表达式的值。
形如#O的表达式也可以被编译器处理为形如::operator(O)的全局函数的调用,该函数的返回值即为表达式的值。
2.自增减单目操作符
1)前缀自增减:#O -> O.operator#() / ::operator# (O)
操作数不能是右值,返回值是操作数的引用。
2)后缀自增减:O# -> O.operator#(0) / ::operator# (O, 0)
操作数不能是右值,返回值是操作数自增减之前的副本。

三、其它操作符的重载

1.插入/提取操作符:<

四、操作符重载的限制

1.不是所有的操作符都能重载,下列操作符不能重载:

1)作用域限定操作符(::)
2)直接成员访问操作符(.)
3)直接成员指针解引用操作符(.*)
4)条件操作符(?:)
5)字节长度操作符(sizeof)
6)类型信息操作符(typeid)

2.如果一个操作符所有的操作数都是基本类型,则该操作符无法被重载。

int operator+ (int a, int b) { return a - b; }
int x = 1 + 1;
cout << x << endl; // 0

3.操作符重载不会改变编译器预定义的优先级。

class Integer { ... };
Integer const operator^ (Integer const& x, int y) {
    Integer z (1);
    for (int i = 0; i < y; ++i)
        z.m_i *= x.m_i;
    return z;
}
d = a + b ^ c; // d = (a + b) ^ c;

4.操作符重载无法改变操作数的个数。
double operator% (Integer const& opd) {
return opd.m_i / 100.0;
}
double x = 50%; // x : 0.5

5.无法通过操作符重载发明新的操作符。
Double const operator@ (Double const& a, Double const& b) {
return Double (sqrt (a.m_d * a.m_d + b.m_d * b.m_d));
}
Double c = 3.0 @ 4.0; // c : 5.0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值