为什么不要重载 和

理论知识:

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

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

简单说明一下短路规则。

demo1

#include <iostream>using namespace std;int main(){<span style="white-space:pre"></span>int a1 = 1;<span style="white-space:pre"></span>int a2 = 0;<span style="white-space:pre"></span>if (a1 || a2++) {<span style="white-space:pre"></span>cout << "||\n";<span style="white-space:pre"></span>}<span style="white-space:pre"></span>if (a2 && a1++) {<span style="white-space:pre"></span>cout << "&&\n";<span style="white-space:pre"></span>} // 只输出了|| 。并没有输出&&<span style="white-space:pre"></span>cout << a1; // a1还是等于1;<span style="white-space:pre"></span>return 0;}第一个if的判断条件中因为a1是真,所以整个逻辑或就是真,不再执行a2++的部分,所以第二个if 语句的判断条件中a2为假,并且导致了整个逻辑与为假,不执行a1++的部分,所以最后的输出a1还是1。这就是内置的短路机制。

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

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

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

demo2

#include <cstdlib>#include <iostream>using namespace std;class Test{int i;public:Test(int i){this->i = i;}Test operator+ (const Test& obj){Test ret(0);cout << "执行+号重载函数" << endl;ret.i = i + obj.i;return ret;}bool operator&& (const Test& obj){cout << "执行&&重载函数" << endl;return i && obj.i;}};// && 从左向右int main(){int a1 = 0;int a2 = 1;cout << "注意:&&操作符的结合顺序是从左向右" << endl;if (a1 && (a1 + a2)){cout << "有一个是假,则不在执行下一个表达式的计算" << endl;}Test t1 = 0;Test t2 = 1;//if( t1 && (t1 + t2) )//t1 && t1.operator+(t2)// t1.operator&&( t1.operator+(t2) )// && || 重载他们 不会产生短路效果if ((t1 + t2) && t1){//t1.operator+(t2) && t1;//(t1.operator+(t2)).operator&&(t1);cout << "两个函数都被执行了,而且是先执行了+" << endl;}return 0;}说明:比如考虑(t1 + t2) && t1

成员函数的调用本质是

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

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

同理:

t1 && (t1 + t2)它的调用本质的是t1.operator&&( t1.operator+(t2) )所以我们重载 && 和 || 都不能实现短路效果,所以一般重载的时候我们都不对这两个运算符进行重载。

,在乎的是看风景的心情,旅行不会因为美丽的风景终止。

为什么不要重载 和

相关文章:

你感兴趣的文章:

标签云: