为什么不能重载&&、||
对于&&和||操作符,存在"骤死式"评估方式
例如if (expression1 && expression2),如果expression1为false,不会计算expression2。
对于if (expression1 || expression2),如果expression1 为true,不会计算expression2。

重载&&和||操作符,将从根本上改变这个规则,因此从此"函数调用"会取代"骤死式语义"。
对于式子:
if (expression1 && expression2) …会被编译器视为 if (expression1.operator && (expression2)).… // 成员函数版本
或者
if (operator && (expression1, expression2) … // 全局函数版本

这种函数调用语义骤死式语义截然不同。
首先,当函数调用动作被执行时,所有参数都必须评估我拿出,所以当我们调用operator&&和operator||时,两个参数都已评估完成,也就是没有了骤死式语义。
其次,C++语言规定并未明确定义函数调用中各参数的评估顺序,所以没办法直到expression1和expression2那个先被评估。
这与骤死式评估行程一个明确的对比,后者总是由左向右评估器自变量。

所以,如果将&&或者||重载,就没有办法提供预期的某种行为模式。

为什么不能重载逗号表达式
对于逗号表达式,逗号左侧会先被评估,然后逗号的右侧再被评估;最后,这个表达式的结果以逗号右侧的值为代表。
如果重载了逗号表达式,无法保证左侧表达式会比右侧表达式先被评估,编译器无法做出保证。

哪些不能被重载:
.、.*::?:newdeletesizeoftypeif
static_castdynamic_castconst_castreinterpret_cast

哪些操作符可以被重载:
其他的都行

总结:
允许重载的操作符,就可以进行重载,但是不能忘记重载的目的,是为了让程序更容器被阅读、被撰写、被理解。
如果没有好的理由重载某个操作符,就不要重载。

07. 千万不要重载、||和, 操作符相关推荐

  1. C++中复制构造函数与重载赋值操作符

    我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数.例如以下类:     class C ...

  2. 【Groovy】map 集合 ( map 集合操作符重载 | *. 展开操作符 | 代码示例 )

    文章目录 一.map 集合 " *. " 展开操作符 二.代码示例 一.map 集合 " *. " 展开操作符 对 map 集合使用 " *. &qu ...

  3. C++重载下标操作符[](二)

    #include <iostream> using namespace std;class Array{public:Array(int length=0);//构造函数~Array(); ...

  4. C++重载IO操作符

    操作符的重载有一定的规则,而IO操作符必须重载为普通函数,且应该声明为类的友元函数.我试了,非友元也可以,但是必须提供访问成员变量的函数,所以,出于效率的考虑还是应该定义为友元. 规则如下: 1.  ...

  5. C++——如何重载*(指针)操作符

    在学习boost库的4.3.3节时,看到了在类中重载了*(指针)操作符,就自己写了个测试程序~ #include <iostream> using namespace std;class ...

  6. python中小于号的重载_Python操作符重载

    可以根据所使用的操作数更改Python中运算符的含义.这种做法被称为运算符重载. Python操作系统适用于内置类. 但同一运算符的行为在不同的类型有所不同. 例如,+运算符将对两个数字执行算术加法, ...

  7. More Effective C++——2. 操作符

    操作符 条款5:对定制的 "类型转换函数" 保持警觉 c++允许编译器在不同类型之间执行隐式转换.但是部分隐式转换存在安全性问题,例如 int–>short, double– ...

  8. 《More Effective C++》读书笔记

    一.基础议题(Basics) 1.仔细区别 pointers 和 references 当一定会指向某个对象,且不会改变指向时,就应该选择 references,其它任何时候,应该选择 pointer ...

  9. 操作符重载——C/C++学习笔记

    此篇文章来自于网上,作为自己学习中的笔记,若有侵权行为,请告之,24小时之内必删除!下面就转入正题吧! 一.什么是操作符重载? 一看到重载,很容易就让人联想到成员函数重载,函数重载可以使名称相同的函数 ...

  10. C++拾趣——有趣的操作符重载

    操作符重载是C++语言中一个非常有用的特性.它可以让我们比较优雅的简化代码,从而更加方便的编写逻辑. 为什么要使用操作符重载 一种常见的用法是重载<<运算符,让标准输出可以输出自定义的类型 ...

最新文章

  1. [转] Java中public,private,final,static等概念的解读
  2. 2017 年最流行的 15 个数据科学 Python 库
  3. java okhttp https_OkHttp是否支持接受自签名SSL证书?
  4. Windows 95被做成了一款软件,可玩扫雷和纸牌
  5. 【早报】这届程序员要做好会Python的准备了!
  6. win7下jdk+eclipse android应用开发环境建立
  7. vs2010使用svn--浅谈AnkhSvn
  8. python 数据挖掘 简书_Python数据挖掘与分析----Pandas常用知识
  9. 研祥计算机U盘启动,研华工控机U盘启动设置
  10. 做软件测试三,四年后的感想
  11. 功能安全专题之功能安全概念阶段
  12. 手机图片转换成文字怎么办
  13. ElasticSearch聚合基础使用《玩转ElasticSearch 4》
  14. 无线手柄在ROS上的使用
  15. 小案例:基于python的动态时钟,带十二时辰和经络养身
  16. Vue之Axios AJAX封装
  17. 计算机网络原理学习资源——相关书籍推荐
  18. java快速排序的时间复杂度_程序猿必备排序算法及其时间复杂度分析
  19. 王者荣耀服务器ip地址配置文件,王者荣耀,关于设置的一些小技巧,知道以后你也是大神...
  20. Linux增加四个用户分别并命名,16、Linux用户和组管理命令演练和实战应用,,150R...

热门文章

  1. 美图拟收购乐游科技附属公司约30%股份 后者为Warframe开发商
  2. virtualenv -p python3 venv报错
  3. 如何修改Myeclipse的JSP模板
  4. 安装MySQL-python时发生错误:error: command 'gcc' failed with exit status 1
  5. 1.Docket 安装简介
  6. 25.卷1(套接字联网API)--- 信号驱动式IO
  7. 49. NAT 服务器
  8. 7. Decorator pattern(装饰器模式)
  9. 《数学之美》—有限状态机和动态规划
  10. JVM调优总结(转载)