一、逻辑与 && 和 逻辑或 || 运算符重载
1、逻辑与 && 和 逻辑或 || 运算符 要求
逻辑与 && 和 逻辑或 || 运算符 是 可以重载的 , 这两个操作符是 特殊操作符 ;
短路规则 : 其 内部 内置了 短路 规则 , 也就是
- 前面的 逻辑与 && 运算 , 只要得到 false 结果 , 那么后续的逻辑与运算也没要运行 , 整个表达式的结果都是 false ;
- 前面的 逻辑或 || 运算 , 只要得到 true 结果 , 那么后续的逻辑或运算也没要运行 , 整个表达式的结果都是 true ;
C 函数实现 , 无法实现短路规则 ; 因此 一般情况下 , 不实现 逻辑与 和 逻辑或 的运算符重载 ;
连续运算规则 : 逻辑与 && 和 逻辑或 || 运算符 重载的函数 , 需要 连续执行 , 比如 3个对象进行连续的 逻辑与 && 和 逻辑或 || 运算 ; 返回值需要满足上述要求 , 一般为 bool ;
2、逻辑与 && 运算符重载
使用 成员函数 实现 逻辑与 && 运算符重载 :
- 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
- 2 个对象
Student s1, s2
之间进行 逻辑与 && 运算符 运算 , - 使用时用法为
s1 && s2
; - 函数名是
operator&&
;
- 2 个对象
operator&&
- 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
- 括号运算符 使用时用法为
s1 && s2
; - 左操作数 : 其中 左操作数 是 s , 这里通过 this 指针调用 , 不需要声明在参数中 ;
- 若干右操作数 : 右操作数 也是 Student 对象 ; 该操作数需要声明在参数中 , 注意 普通数据类型 直接声明 , 对象数据类型 需要声明 为 引用类型 ;
- 上述两个是对象类型 , 对象一般传入 指针 或 引用 , 由于是基础数据类型 , 这里传入基础数据类型 ; 如果是 对象类型 , 则传入引用 ;
- 括号运算符 使用时用法为
operator&&(Student& s)
- 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
- 此处返回值根据需求即可 ; 返回 bool ;
bool operator&&(Student& s)
- 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
// 使用 成员函数 实现 逻辑与 && 运算符重载
bool operator&&(const Student& s)
{
// 函数体省略
return true;
};
3、逻辑或 || 运算符重载
使用 成员函数 实现 逻辑或 || 运算符重载 :
- 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
- 2 个对象
Student s1, s2
之间进行 逻辑或 || 运算符 运算 , - 使用时用法为
s1 || s2
; - 函数名是
operator||
;
- 2 个对象
operator||
- 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
- 括号运算符 使用时用法为
s1 || s2
; - 左操作数 : 其中 左操作数 是 s , 这里通过 this 指针调用 , 不需要声明在参数中 ;
- 若干右操作数 : 右操作数 也是 Student 对象 ; 该操作数需要声明在参数中 , 注意 普通数据类型 直接声明 , 对象数据类型 需要声明 为 引用类型 ;
- 上述两个是对象类型 , 对象一般传入 指针 或 引用 , 由于是基础数据类型 , 这里传入基础数据类型 ; 如果是 对象类型 , 则传入引用 ;
- 括号运算符 使用时用法为
operator||(Student& s)
- 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
- 此处返回值根据需求即可 ; 返回 bool ;
bool operator||(Student& s)
- 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
// 使用 成员函数 实现 逻辑或 || 运算符重载
bool operator||(const Student& s)
{
// 函数体省略
return false;
};
二、完整代码示例
代码语言:javascript复制#include "iostream"
using namespace std;
class Student
{
public:
// 使用 成员函数 实现 括号() 运算符重载
int operator()(int a, int b)
{
return a b;
};
// 使用 成员函数 实现 逻辑与 && 运算符重载
bool operator&&(const Student& s)
{
// 函数体省略
return true;
};
// 使用 成员函数 实现 逻辑或 || 运算符重载
bool operator||(const Student& s)
{
// 函数体省略
return false;
};
};
int main() {
Student s1, s2;
// 调用 括号 运算符
cout << "s1(1, 2) = " << s1(1, 2) << endl;
// 调用 逻辑与 运算符
cout << "s1 && s2 = " << (s1 && s2) << endl;
// 调用 逻辑或 运算符
cout << "s1 || s2 = " << (s1 || s2) << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
代码语言:javascript复制s1(1, 2) = 3
s1 && s2 = 1
s1 || s2 = 0
Press any key to continue . . .