理论知识:
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) )
所以我们重载 && 和 || 都不能实现短路效果,所以一般重载的时候我们都不对这两个运算符进行重载。