运算符重载
运算符重载是一种在C++中非常强大的功能,它允许开发者为现有的运算符赋予新的含义。
基本原则
- 尽可能保持该运算符的常用直观含义;
- 尽可能保持运算符的原始行为。
然而,当重载&&(逻辑与)、||(逻辑或)和,(逗号)这三个运算符时,遵守这两个原则变得非常困难。
1. 重载&&(逻辑与)、||(逻辑或)时:
当我们重载这两个运算符时,我们无法保持C++对于“真假值表达式”采用的骤死式评估方式。
骤死式评估方式
即:当逻辑表达式的结果已经可以确定时,剩余的部分就不再计算了。
例如,在逻辑与(&&)运算中,如果左操作数为假,那么无论右操作数是真是假,整个表达式的结果都是假,因此我们不再计算右操作数。同样,在逻辑或(||)运算中,如果左操作数为真,那么无论右操作数是真是假,整个表达式的结果都是真,因此我们也不再计算右操作数。
- 在C++中,重载的运算符是通过函数来实现的,函数参数在函数调用前需被计算出来;
- 无论(逻辑表达式)是否满足“骤死式评估方式”,重载的&&和||运算符都会进行它们前后的两个操作数的计算操作,违反了第二个原则。
2. 重载,(逗号运算符)时:
当我们重载逗号运算符时,我们无法保证这个序列点的特性。
逗号运算符是一个顺序点,帮助避免一些关于顺序的未定义行为。
顺序点:
确保左边的所有操作都在它右边的操作之前完成。
- 在C++中,函数参数在函数调用前都需要被计算出来,而参数的计算顺序是不确定的;
- 重载(逗号运算符)将无法确定表达式的计算顺序,违反了原则。
总结
就算是可重载的操作符,也不可毫无理由地将其重载,C++运算符重载是是一种强大的工具,但我们很难有需求用到这一功能,很难超越原有行为特性且很难避免无误,总而言之,尽量避免重载它们。