C++编程规范之30:避免重载&&,||或,(逗号)
2013-12-21 22:28
281 查看
摘要:
明智就是知道合适适可而止:内置的&&,||和,(逗号)得到了编译器的特殊照顾。如果重载它们,它们就会变成普通函数,具有完全不同的语义(这将违反地26条:保持重载操作符的自然语义和第31条:不要编写依赖函数参数求值顺序的代码),这肯定会引入微妙的错误和缺陷。不要轻率地重载这些操作符。
不能重载operator&&、operator||或者operator,的主要原因是,无法在三种情况下实现内置操作符的完整语义,而程序员通常都会需要这些语义。说的更具体一些,就是内置版本的特殊之处在于它是从左到右求职,而且&&和||还使用短路求值。
内置版本的&&和||首先计算左边表达式的值,如果这个值能够决定结果,就不会计算第二个表达式的值,但是如果重载&&和||,这些函数在调用在执行执行总是对所有的参数进行求值,同时函数参数的求值顺序是不确定的。
逗号操作符也存在同样的脆弱性。与&&和||一样,内置逗号保证其表达式是从左到右按顺序求值的。用户自定义的逗号操作符无法保证是从左到右求值。
明智就是知道合适适可而止:内置的&&,||和,(逗号)得到了编译器的特殊照顾。如果重载它们,它们就会变成普通函数,具有完全不同的语义(这将违反地26条:保持重载操作符的自然语义和第31条:不要编写依赖函数参数求值顺序的代码),这肯定会引入微妙的错误和缺陷。不要轻率地重载这些操作符。
不能重载operator&&、operator||或者operator,的主要原因是,无法在三种情况下实现内置操作符的完整语义,而程序员通常都会需要这些语义。说的更具体一些,就是内置版本的特殊之处在于它是从左到右求职,而且&&和||还使用短路求值。
内置版本的&&和||首先计算左边表达式的值,如果这个值能够决定结果,就不会计算第二个表达式的值,但是如果重载&&和||,这些函数在调用在执行执行总是对所有的参数进行求值,同时函数参数的求值顺序是不确定的。
逗号操作符也存在同样的脆弱性。与&&和||一样,内置逗号保证其表达式是从左到右按顺序求值的。用户自定义的逗号操作符无法保证是从左到右求值。
相关文章推荐
- 避免重载&&(逻辑与)、||(逻辑或)或,(逗号)操作符
- HTML&CSS——选择器中间加空格和逗号的区别?
- 避免使用vector<bool>
- 总是报Unterminated &lt;html:link tag 都是逗号惹的祸
- 利用<include />标签来避免重复渲染
- 如何利用Python和win32编程避免重复性体力劳动(二)——菜单操作:GetMenu,GetSubMenu,GetMenuItemID以及wParam的HIWORD&LOWORD
- 模板类中重载<<和>>操作符 常见问题
- 重载<<和>>
- 在CTime类中重载<<和>>
- 避免’sudo echo x >’(sudo 重定向) 时’Permission denied’
- 在SQL中参数值超过8000(TEXT类型)的处理方法,以"逗号"分隔的字符串
- flask 如何传参数到 js中,避免& # 39等转义
- 锁相关知识 & mutex怎么实现的 & spinlock怎么用的 & 怎样避免死锁 & 内核同步机制 & 读写锁
- ECMAScript运算符_关系运算符&等性运算符&条件运算符&赋值运算符&逗号运算符
- MVC url 中多参数 传值 避免amp;
- 在Ant的javac中指定源文件编码方式,以避免"警告: 编码 GBK 的不可映射字符"的错误
- 如何避免硕士论文被学术不端? 不…
- Mac技巧之找到 Mac OS X 系统更新升级包下载后的存储位置,避免多台苹果电脑重复下载&&&&苹果OS X 10.7.4发布,升级包下载
- 转:模板类中重载<<和>>操作符
- 重载<<