7. 千万不要重载&& ,|| 和,操作符
2012-04-16 17:38
375 查看
C/C++语言对于逻辑表达式具有“逻辑短路”的性质,即一旦确定了真假值,表达式中即使有尚未检查的部分,都将返回。如:
(1)中你不用担心p为NULL时,调用printf函数会出现错误,因为一旦p为NULL逻辑与的检测将返回FASLE,无需计算后面的部分。
(2)中检查下标值是否越界,你也不用担心如果index已经越下界还会与上界进行比较,因为前者正确之后即返回TRUE,无需计算后者。
当我们进行重载&&和||时,我们也希望具有上面的性质。但事与愿违,多数情况是无法达到这种要求。如我们将operator&&重载,当我们写出如下的表达式:
上面两种形式,都会将计算expression1和expression2的值,而且计算的顺序也不确定,这样就违背了之前谈论的“逻辑短路”现象。
逗号(,)操作符的含义,是从左到右依次计算每个表达式的值,最后返回的是最后一个表达式的值,如
expression1,expression2,...,expressionN;
将依次计算expression1,expression2,...的值,最后返回值为expressionN的值。
现在我们重载逗号(,)操作符,如果是以global-function形式给出,我们无法确保参数的计算顺序是从左到右的;如果以member-function形式给出,仍不能保证逗号操作符的左操作数先被计算。因此,不能确保完成逗号操作符所期望的功能。
现总结C++语言中不能重载的操作符有:
char*p; if((p!=NULL)&&printf("%c",*p))...//(1) intrangeCheck(intindex) { if((index<lowerBound)||(index>upperBound))...//(2) ... }
(1)中你不用担心p为NULL时,调用printf函数会出现错误,因为一旦p为NULL逻辑与的检测将返回FASLE,无需计算后面的部分。
(2)中检查下标值是否越界,你也不用担心如果index已经越下界还会与上界进行比较,因为前者正确之后即返回TRUE,无需计算后者。
当我们进行重载&&和||时,我们也希望具有上面的性质。但事与愿违,多数情况是无法达到这种要求。如我们将operator&&重载,当我们写出如下的表达式:
if(expression1&&expresssion2)... //编译器会视作: if(expression1.operator&&(expression2))...//operator&&是member-function //或者 if(operator&&(expression1,expression2))...//operator&&是global-function
上面两种形式,都会将计算expression1和expression2的值,而且计算的顺序也不确定,这样就违背了之前谈论的“逻辑短路”现象。
逗号(,)操作符的含义,是从左到右依次计算每个表达式的值,最后返回的是最后一个表达式的值,如
expression1,expression2,...,expressionN;
将依次计算expression1,expression2,...的值,最后返回值为expressionN的值。
现在我们重载逗号(,)操作符,如果是以global-function形式给出,我们无法确保参数的计算顺序是从左到右的;如果以member-function形式给出,仍不能保证逗号操作符的左操作数先被计算。因此,不能确保完成逗号操作符所期望的功能。
现总结C++语言中不能重载的操作符有:
..*::?:
newdeletesizeoftypeid
static_castdynamic_castconst_castreinterpret_cast
可以重载的操作符有:
operatornewoperatordelete
operatornew[]operatordelete[]
+-*/%^&|~
!=<>+=-=*=/=%=
^=&=|=<<>>>>=<<===!=
<=>=&&||++--,->*->
()[]
参考文献:《MoreEffectiveC++35个改善编程与设计的有效方法中文版》
相关文章推荐
- 7.千万不要重载&& | | 和“,”操作符
- 条款7:千万不要重载&&,||和,操作符
- More Effective C++ 条款7 千万不要重载&&,||和,操作符
- 7. 千万不要重载&& ,|| 和,操作符
- 《More Effective C++》Rule7:千万不要重载 &&, ||, 和 ,操作符
- More Effective C++(条款7:千万不要重载&&,||,和,操作符)
- 【M7】千万不要重载&&,||和,操作符
- 条款七:千万不要重载&&,||和,操作符
- 不要重载&& ||和,操作符
- 为什么不要重载&&和||操作符
- 为什么不要重载 && 和 || 操作符!!!
- 为什么不要重载 && 和 || 操作符!!!
- C++学习笔记:为什么不要重载逻辑与和逻辑或&& || 操作符
- 针对<<重载输出操作符的特化
- 为 vector 重载 << (输出操作符)
- C++中重载数组下标访问操作符[ ] 和 赋值操作符 = ,* 和 -> 操作符和取反 !以及转化操作符bool和void*
- 重载 >> 操作符【c++ primer 】
- 关于C++操作符重载之"->"和"*"
- 千万不要入错行--->立好人生的指向标
- C++语法基础--重载operator->箭头操作符