1、逻辑运算符的原生语义(又叫短路运算符)
1.1、
操作数只有两种值(true和false)
1.2、
逻辑表达式不用完全计算就能确定最终值
1.3、
最终结果只能是true或false
/*************** 逻辑表达式(又叫短路表达式) *************/
#include <iostream>
using namespace std;
int func(int i)
{
cout << "int func(int i): i = "<< i << endl;
return i;
}
int main()
{
//&&的短路:只有一个为0就短路
if(func(0) && func(1))
{
cout << "Result: true" << endl;
}
else
{
cout << "Result: false" << endl;
}
cout << endl;
//||的短路:只要一个为1,就短路
if(func(0) || func(1))
{
cout << "Result: true" << endl;
}
else
{
cout << "Result: false" << endl;
}
return 0;
}
2、重载逻辑操作符
2.1、
重载出现的问题及分析
(重载任意操作符都不能改变他的原生语义)
2.1.1、C++通过函数调用扩展操作符的功能
2.1.2、进入函数体前必须完成所有参数的计算
2.1.3、函数参数的计算次序是不定的
2.1.4、短路法则完全失效
2.2、逻辑操作符重载后无法完全实现原生的意义
2.3、一些有用的建议
2.3.1、实际工程开发中避免重载逻辑操作符
2.3.2、通过重载比较操作符代替逻辑操作符重载
2.3.3、直接使用成员函数代替逻辑操作符重载
2.3.4、使用全局函数对逻辑操作符进行重载
/*************** 操作逻辑运算符 *************/
#include <iostream>
using namespace std;
class Test
{
private:
int mValue;
public:
Test(int v)
{
mValue = v;
}
int value() const //const修饰的函数,const对象才能调用,调用const成员,变量
{
return mValue;
}
};
//利用全局函数重载&&操作符
bool operator && (const Test& lp, const Test& rp)
{
return lp.value() && rp.value(); //const对象的引用调用const方法
}
//利用全局函数重载||操作符
bool operator || (const Test& lp, const Test& rp)
{
return lp.value() || rp.value(); //const对象的引用调用const方法
}
//经过测试::普通对象也能调用const对象。
Test func(Test i)//这个函数的作用就是打印一下对象的值,返回的还是类的对象
{//返回的对象,直接复制一份临时对象过去,按理说应该有拷贝构造函数的,可能是直接赋值的吧 = ,调用赋值操作符。
cout << "int func(Test i): i.value() =" << i.value() << endl;
return i;
}
int main()
{
Test t0(0);//调用带参构造函数进行初始化
Test t1(1);
//函数的参数计算顺序是从右到左的???<-
//相当于函数调用,进入函数体,参数的值必须被计算出来,两个参数计算出来,才能进入operator函数体。
//短路法则完全失效,重载改变了&&原来短路的语义。
if(func(t0) && func(t1))//operator &&(func(t0), func(t1))
{
cout << "Result : true" << endl;
}
else
{
cout << "Result : false" << endl;
}
cout << endl;
//相当于函数调用,进入函数体,参数的值必须被计算出来,两个参数计算出来,才能进入operator函数体。
//短路法则完全失效,重载改变了||原来短路的语义。
if(func(t1) || func(t0))//operator ||(func(t0), func(t1))
{
cout << "Result : true" << endl;
}
else
{
cout << "Result : false" << endl;
}
return 0;
}
3、小结
3.1、C++从语法上支持逻辑操作符重载
3.2、重载后的逻辑操作符不满足短路法则
3.3、工程开发中不要重载逻辑操作符
3.4、通过重载比较操作符替换逻辑操作符重载 ???
3.5、通过专用成员函数替换逻辑操作符的重载