【C++】运算符重载 ⑭ ( 逻辑与 && 运算符重载 | 逻辑或 || 运算符重载 | 完整代码示例 )

2023-10-15 17:31:11 浏览数 (1)

一、逻辑与 && 和 逻辑或 || 运算符重载

1、逻辑与 && 和 逻辑或 || 运算符 要求

逻辑与 && 和 逻辑或 || 运算符 是 可以重载的 , 这两个操作符是 特殊操作符 ;

短路规则 : 其 内部 内置了 短路 规则 , 也就是

  • 前面的 逻辑与 && 运算 , 只要得到 false 结果 , 那么后续的逻辑与运算也没要运行 , 整个表达式的结果都是 false ;
  • 前面的 逻辑或 || 运算 , 只要得到 true 结果 , 那么后续的逻辑或运算也没要运行 , 整个表达式的结果都是 true ;

C 函数实现 , 无法实现短路规则 ; 因此 一般情况下 , 不实现 逻辑与 和 逻辑或 的运算符重载 ;

连续运算规则 : 逻辑与 && 和 逻辑或 || 运算符 重载的函数 , 需要 连续执行 , 比如 3个对象进行连续的 逻辑与 && 和 逻辑或 || 运算 ; 返回值需要满足上述要求 , 一般为 bool ;

2、逻辑与 && 运算符重载

使用 成员函数 实现 逻辑与 && 运算符重载 :

  • 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
    • 2 个对象 Student s1, s2 之间进行 逻辑与 && 运算符 运算 ,
    • 使用时用法为 s1 && s2 ;
    • 函数名是 operator&& ;
代码语言:javascript复制
operator&&
  • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
    • 括号运算符 使用时用法为 s1 && s2 ;
    • 左操作数 : 其中 左操作数 是 s , 这里通过 this 指针调用 , 不需要声明在参数中 ;
    • 若干右操作数 : 右操作数 也是 Student 对象 ; 该操作数需要声明在参数中 , 注意 普通数据类型 直接声明 , 对象数据类型 需要声明 为 引用类型 ;
    • 上述两个是对象类型 , 对象一般传入 指针 或 引用 , 由于是基础数据类型 , 这里传入基础数据类型 ; 如果是 对象类型 , 则传入引用 ;
代码语言:javascript复制
operator&&(Student& s)
  • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
    • 此处返回值根据需求即可 ; 返回 bool ;
代码语言:javascript复制
bool operator&&(Student& s)
  • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
代码语言:javascript复制
	// 使用 成员函数 实现 逻辑与 && 运算符重载
	bool operator&&(const Student& s)
	{
		// 函数体省略
		return true;
	};

3、逻辑或 || 运算符重载

使用 成员函数 实现 逻辑或 || 运算符重载 :

  • 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
    • 2 个对象 Student s1, s2 之间进行 逻辑或 || 运算符 运算 ,
    • 使用时用法为 s1 || s2 ;
    • 函数名是 operator|| ;
代码语言:javascript复制
operator||
  • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
    • 括号运算符 使用时用法为 s1 || s2 ;
    • 左操作数 : 其中 左操作数 是 s , 这里通过 this 指针调用 , 不需要声明在参数中 ;
    • 若干右操作数 : 右操作数 也是 Student 对象 ; 该操作数需要声明在参数中 , 注意 普通数据类型 直接声明 , 对象数据类型 需要声明 为 引用类型 ;
    • 上述两个是对象类型 , 对象一般传入 指针 或 引用 , 由于是基础数据类型 , 这里传入基础数据类型 ; 如果是 对象类型 , 则传入引用 ;
代码语言:javascript复制
operator||(Student& s)
  • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
    • 此处返回值根据需求即可 ; 返回 bool ;
代码语言:javascript复制
bool operator||(Student& s)
  • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
代码语言:javascript复制
	// 使用 成员函数 实现 逻辑或 || 运算符重载
	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 . . .

0 人点赞