7 千万不要重载 与,或 还有 逗号 操作符

和C一样,C++对于“真假表达式”采用的是“骤死式”(短路求值法)评估模式。一旦该表达式的真假值确定,即时表达式还有部分尚未检验,整个评估工作仍结束。
例如:
char* p;
...
if((p != 0) && (strlen(p) > 10))
你无须担心调用strlen时p是否为null指针,因为如果“p是否为0”的测试结果是否定的,strlen绝不会被调用。同样的道理,以下代码:
int rangeCheck(int index)
{
	if((index < lowerBound) || (index > upperBound))
		...
}	
如果index小于lowerBound,它就绝不会拿来和upperBound比较。

C++允许你为“用户定制类型”量身定做 && 和 || 操作法。做法是对operator&& 和operator||进行重载。
例如:
if(expression1 && expression2) ...
会被编译器视为一下两种之一:
if(expression1.operator&&(expression2)) ... //成员函数形式

if(operator &&(expression1,expression2)) ... //全局函数形式

但是“函数调用”语意和所谓的“骤死式”语意有重大区别:首先没有采用短路求值法则,第二C++语意没有定义函数参数的求值顺序,所以没办法知道表达式1和表达式2哪个先计算。

因此如果你重载&&货||,就没有办法提供给程序员他们所期望的行为特性,所以不要重载&&或||
同样道理适合逗号操作符:
例如针对字符串逆序:
void reverse(char s[])
{
	for(int i = 0,j = strlen(s)-1; i < j; ++i,--j)
	{
		int c = s[i];
		s[i] = s[j];
		s[j] = c;
	}
}
逗号表达式首先计算逗号左边的表达式,然后计算逗号右边的表达式;整个表达式的结果是逗号右边表达式的值。
如果你写一个非成员函数operator,你不能保证左边的表达式优于右边的表达式计算,你不能控制函数的参数的调用顺序。
成员函数的operator也不能依靠逗号左边的表达式优先被计算。

操作符重载的目的使程序更容易被阅读,书写和理解,而不是用知识去迷惑别人。如果你没有一个好理由去重载操作符,就不要重载。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值