第38课 逻辑操作符的陷阱

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、通过专用成员函数替换逻辑操作符的重载









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值