理论知识:

1)&&和 || 是C++中非常特殊的操作符

2)&&和 || 内置实现了短路规则

简单说明一下短路规则。

demo1

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6. <span style="white-space:pre"> </span>int a1 = 1;
  7. <span style="white-space:pre"> </span>int a2 = 0;
  8. <span style="white-space:pre"> </span>if (a1 || a2++) {
  9. <span style="white-space:pre"> </span>cout << "||\n";
  10. <span style="white-space:pre"> </span>}
  11.  
  12. <span style="white-space:pre"> </span>if (a2 && a1++) {
  13. <span style="white-space:pre"> </span>cout << "&&\n";
  14. <span style="white-space:pre"> </span>} // 只输出了|| 。并没有输出&&
  15. <span style="white-space:pre"> </span>cout << a1; // a1还是等于1
  16. <span style="white-space:pre"> </span>return 0;
  17. }

第一个if的判断条件中因为a1是真,所以整个逻辑或就是真,不再执行a2++的部分,所以第二个if 语句的判断条件中a2为假,并且导致了整个逻辑与为假,不执行a1++的部分,所以最后的输出a1还是1。这就是内置的短路机制。

3)操作符重载是靠函数重载来完成的

4)操作数作为函数参数传递

5)C++的函数参数都会被求值,无法实现短路规则

demo2

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. class Test
  7. {
  8. int i;
  9. public:
  10. Test(int i)
  11. {
  12. this->i = i;
  13. }
  14.  
  15. Test operator+ (const Test& obj)
  16. {
  17. Test ret(0);
  18.  
  19. cout << "执行+号重载函数" << endl;
  20. ret.i = i + obj.i;
  21. return ret;
  22. }
  23.  
  24. bool operator&& (const Test& obj)
  25. {
  26. cout << "执行&&重载函数" << endl;
  27.  
  28. return i && obj.i;
  29. }
  30. };
  31.  
  32. // && 从左向右
  33. int main()
  34. {
  35. int a1 = 0;
  36. int a2 = 1;
  37.  
  38. cout << "注意:&&操作符的结合顺序是从左向右" << endl;
  39.  
  40. if (a1 && (a1 + a2))
  41. {
  42. cout << "有一个是假,则不在执行下一个表达式的计算" << endl;
  43. }
  44.  
  45. Test t1 = 0;
  46. Test t2 = 1;
  47.  
  48. //if( t1 && (t1 + t2) )
  49. //t1 && t1.operator+(t2)
  50. // t1.operator&&( t1.operator+(t2) )
  51.  
  52. // && || 重载他们 不会产生短路效果
  53. if ((t1 + t2) && t1)
  54. {
  55. //t1.operator+(t2) && t1;
  56. //(t1.operator+(t2)).operator&&(t1);
  57.  
  58. cout << "两个函数都被执行了,而且是先执行了+" << endl;
  59. }
  60.  
  61. return 0;
  62. }

说明:比如考虑

  1. (t1 + t2) && t1

成员函数的调用本质是

  1. (t1.operator+(t2)).operator&&(t1);

这样的结果是不可能产生短路效果的。

同理:

  1. t1 && (t1 + t2)

它的调用本质的是

  1. t1.operator&&( t1.operator+(t2) )

所以我们重载 && 和 || 都不能实现短路效果,所以一般重载的时候我们都不对这两个运算符进行重载。

为什么不要重载 && 和 || 操作符!!!的更多相关文章

  1. C++ 之 重载赋值操作符

    Widget 类中,定义了一个 Bitmap 类型的私有数据成员 -- pb 指针 class Bitmap { ... }; class Widget { private: Bitmap *pb; ...

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

    前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义: 2.复制构造函数和重载赋值操作符的调用时机: 3.复制构造函数和重载赋值操作符 ...

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

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

  4. 5.9 C++重载转型操作符

    参考:http://www.weixueyuan.net/view/6387.html 注意: 转型构造函数可以将其它类型的参数转换为类类型,如果我们要进行相反的转换过程,将类类型转换为其它数据类型, ...

  5. 5.6 C++重载下标操作符

    参考:http://www.weixueyuan.net/view/6384.html 总结: 下标操作符是必须要以类的成员函数的形式进行重载的.其在类中的声明格式如下:    返回类型 & ...

  6. 5.5 C++重载赋值操作符

    参考:http://www.weixueyuan.net/view/6383.html 总结: 重载赋值操作符同重载类的是拷贝构造函数的原因是一样,将一个对象拷贝给另一个对象,同时当类中存在指针类型的 ...

  7. 【c++】c++中重载输出操作符,为什么要返回引用

    针对:ostream & operator <<(ostream & os, const ClassType &object) 说明几点: 1.第一个形参为对ost ...

  8. Effective C++(10) 重载赋值操作符时,返回该对象的引用(retrun *this)

    问题聚焦: 这个准则比较简短,但是往往就是这种细节的地方,可以提高你的代码质量. 细节决定成败,让我们一起学习这条重载赋值操作符时需要遵守的准则吧. 还是以一个例子开始: Demo // 连锁赋值 x ...

  9. C++ 重载操作符- 02 重载输入输出操作符

    重载输入输出操作符 本篇博客主要介绍两个操作符重载.一个是 <<(输出操作符).一个是 >> (输入操作符) 现在就使用实例来学习:如何重载输入和输出操作符. #include ...

  10. C++重载赋值操作符

    1.C++中重载赋值操作函数应该返回什么? 类重载赋值操作符一般都是作为成员函数而存在的,那函数应该返回什么类型呢?参考内置类型的赋值操作,例如 int x,y,z; x=y=z=15; 赋值行为相当 ...

随机推荐

  1. DS4700磁盘阵列的控制器微码升级操作记录(收录百度文库)

    DS4700磁盘阵列的控制器微码升级操作记录   项目介绍: 于10年3月,XX地市区/州XX分公司相继反映生产读取数据速度较之前变得非常慢,表现在:日常报表抽取数据速度明显变慢,客户打开前台页面速度 ...

  2. React Suite v3.0 正式版发布

    React Suite v3.0 正式版发布 相信很多人会好奇,React Suite 是什么? React Suite 是 HYPERS 前端团队和 UX 团队开源的一套基于 React 的 UI ...

  3. 树莓派3B(2)- 配置多个wifi,自动寻找可用网络

    一.背景 在上篇<Raspberry Pi 3B 安装系统并联网>中,树莓派使用wifi连接,但是把树莓派带到公司,树莓派就连不了公司的wifi,要是支持连接多个wifi就好了,在此整理分 ...

  4. jquery easyui datagrid设置可编辑行的某个列不可编辑

    function onClickRowd(index1, field1) { if (editIndexd != index1) { if (endEditing()) { $('#dg').data ...

  5. Ajax相关——get请求和post请求的区别

    一.完整的URL由以下几部分组成: scheme:通信协议,常用的有:http/ftp. host:主机,服务器(计算机)域名或IP地址 port:端口,整数,可选,省略时使用默认端口,http的默认 ...

  6. 打印n阶菱形

    #打印n阶菱形 def print_rhombus(n): #打印正三角 for i in range(1,n+1): x_num = 2*i-1 #每一层的*数量 space_num = n - i ...

  7. 什么是 Docker

    Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 ...

  8. Swift基础之如何使用iOS 9的Core Spotlight框架

    本文由CocoaChina译者KingOfOnePiece(博客)翻译 作者:GABRIEL THEODOROPOULOS?校对:hyhSuper 原文:How To Use Core Spotlig ...

  9. Android开发技巧——使用Drawable实现小红点

    在产品的设计中,总难免需要我们开发去实现各种各样的小红点,小红点,小红点. 通常,我们可能会这样做: 用一个View实现小红点,放在相对布局里,设置好内边距或外边距,让它位于图片的右上角. 或者是给图 ...

  10. Git之(五)远程管理

    开篇就提到过,Git是一个分布式版本管理系统.但是到现在为止,我们所有的演练都是在本地Git仓库.如果想与他人合作,还需要一个远程的 Git 仓库.尽管技术上可以从个人的仓库里推送和拉取修改内容,但我 ...