05-7 运算符重载-逻辑运算符
逻辑运算符包括:逻辑与(&&
/and
)、逻辑或(||
/or
)、逻辑否(!
)。
可以重载的逻辑运算符是:逻辑与(&&
/and
)、逻辑或(||
/or
)。
逻辑运算符重载的作用:利用逻辑运算符,可以让两个自定义类型的对象进行对比。
- 提示:
- 尽量不要使用逻辑运算符重载。
- 操作符重载本质是函数重载,函数的参数都会进行求值运算,改变了原来逻辑运算符的特性。
完成逻辑运算符重载有两种方法:
- 在成员函数里面实现重载。
- 在全局函数里面实现重载。
事实上逻辑运算符非常简单,和关系运算符([05-5 运算符重载-关系运算符](./05-5 运算符重载-关系运算符.md))基本一样。所以我们简单过一下。
-
在成员函数里面实现重载。
class test { public: int m_A; int m_B; bool operator&&(class test& p) { if ((m_A == p.m_A) && (m_B == p.m_B)) { return true; } else { return false; } } };
提示:在 c++中,
&&
表示的是and
(与),||
表示的是or
(或)。因为一般的关系运算符只有是或者否两种表达形式,在 c++中就是布尔类型(
bool
),所以我们使用布尔(bool
)作为返回值。提示:在 c++中,布尔类型:
0
表示false
(否),1
(或者其他数字)表示true
(是)。 -
在全局函数里面实现重载。
bool operator&&(class test& p1, class test& p2) { if ((p1.m_A == p2.m_A) && (p1.m_B == p2.m_B)) { return true; } else { return false; } }
-
其他的关系运算符(以全局函数重载为例)
-
逻辑与(
&&
/and
)bool operator&&(class test& p1, class test& p2) { if ((p1.m_A == p2.m_A) && (p1.m_B == p2.m_B)) { return true; } else { return false; } }
-
逻辑或(
||
/or
)bool operator||(class test& p1, class test& p2) { if ((p1.m_A == p2.m_A) || (p1.m_B == p2.m_B)) { return true; } else { return false; } }
-
-
为什么尽可能不要使用逻辑运算符重载?
我们先来看一段代码:
int main() { int A = 10; int B = 3; int C = 7; cout << A && (B + C); cout << endl; cout << (A && (B + C)) << endl; return 0; }
运行结果:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
10 1
在这一段代码里面,
cout << A && (B + C);
的运行结果是10
,这是执行了(B + C)
的结果。而cout << (A && (B + C)) << endl;
的运行结果是1
,表示的是真。但是逻辑运算符本质是函数的重载,会改变逻辑运算符本身的性质。
-
总结:
- 尽量不要使用逻辑运算符重载。
- 操作符重载本质是函数重载,函数的参数都会进行求值运算,改变了原来逻辑运算符的特性。
:-)