逻辑与和逻辑或的重载

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/dxd_123456/article/details/78066870

&&和||是C++中非常特殊的操作符 ,&&和||内置实现了短路规则 ,操作符重载是靠函数重载来完成的 ,操作数作为函数参数传递 ,C++的函数参数都会被求值,无法实现短路规则 。所以一般情况下不会重载逻辑与和逻辑或。
下面就用一个案例来分析为什么不要重载逻辑或和逻辑与。

#include <stdio.h>
class Test8
{
public:
    Test8(int a)
    {
        m_a = a;
    }

    bool operator&&(Test8 &obj)
    {
        return (m_a && obj.m_a);
    }
private:
    int m_a;
};

int main()
{
    Test8 a(10), b(0), c(30);
    b && (a = c);
    printf("a = %d, b = %d, c = %d\n", a, b, c);
    return 0;
}

重载的函数可以进行逻辑与的操作,对结果没有什么影响,但是我们却无法模拟出逻辑与真正执行的过程,上面程序中,如果不是使用重载的&&,而是单纯进行数字计算,即定义整形数据a = 10,b = 0, c = 30;然后进行b&&(a = c)的操作,此时的结果是b = 0, a = 10, c = 30;很明显后面的赋值操作a = c 是没有执行的,这就是内置逻辑与的短路原则,当&&前的是为0时,就结束了不再执行后面的操作了;
而如果使用重载的函数,对对象进行&&操作,此时的结果就是a = 30, b = 0, c = 30,可以发现后面的赋值操作是执行了的,为什么呢?
我们知道,&&的重载是通过函数重载来完成的,操作数作为函数参数传递,那么上面的b&&(a = c)操作就可以改写为b.operator&&(a = c)
很显然这个过程不会有短路原则。所以重载的&& 操作符并不是真正意义上的&&操作,同样的||操作符也是这样的,所一般情况下不要重载&&和||操作符。

猜你喜欢

转载自blog.csdn.net/dxd_123456/article/details/78066870
今日推荐