文章内容发布于 635 天前;最后修改于 635 日前。其中的信息可能发生变化或产生更改,敬请留意。
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,表示的是真。但是逻辑运算符本质是函数的重载,会改变逻辑运算符本身的性质。
-
总结:
- 尽量不要使用逻辑运算符重载。
- 操作符重载本质是函数重载,函数的参数都会进行求值运算,改变了原来逻辑运算符的特性。