一、重载 大于号 / 小于号 运算符 - 使用成员函数重载
1、重载 大于 > 运算符
使用 成员函数 实现 等于判断 == 运算符重载 :
- 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
- 要对 String a , b 对象对比操作 , 使用 大于 > 运算符 , 使用时用法为 a > b ;
- 函数名是
operate>
;
operate>
- 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
- 要对 String a , b 对象对比操作 , 使用 大于 > 运算符 , 使用时用法为 a > b ;
- 左操作数 : 其中 左操作数 是 String a , 这里通过 this 指针调用 , 不需要声明在参数中 ;
- 右操作数 : 右操作数 是 String b ; 该操作数需要声明在参数中 , 注意需要声明 引用类型 ;
- 上述两个是对象类型 , 对象一般传入 指针 或 引用 , 这里传入引用类型 ;
operator>(String& s)
- 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
- 此处返回值是 bool 类型 , 返回 true 或者 false 布尔值即可 ;
bool operator>(String& s)
- 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
- 将 String 类比较转为 字符串比较 ;
- 使用 strcmp 函数进行 字符串比较 ;
// 重载 大于 > 运算符
bool String::operator>(String& s)
{
// 将 String 类比较转为 字符串比较
// 大于 和 小于 区别是 参数顺序不同的区别
return strcmp(this->m_p, s.m_p);
}
2、重载 小于 < 运算符
使用 成员函数 实现 小于 < 运算符重载 :
- 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
- 要对 String a , b 对象对比操作 , 使用 小于 < 运算符 , 使用时用法为 a < b ;
- 函数名是
operate<
;
operate<
- 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
- 要对 String a , b 对象对比操作 , 使用 小于 < 运算符 , 使用时用法为 a < b ;
- 左操作数 : 其中 左操作数 是 String a , 这里通过 this 指针调用 , 不需要声明在参数中 ;
- 右操作数 : 右操作数 是 String b ; 该操作数需要声明在参数中 , 注意需要声明 引用类型 ;
- 上述两个是对象类型 , 对象一般传入 指针 或 引用 , 这里传入引用类型 ;
operator<(String& s)
- 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
- 此处返回值是 bool 类型 , 返回 true 或者 false 布尔值即可 ;
bool operator<(String& s)
- 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
- 将 String 类比较转为 字符串比较 ;
- 使用 strcmp 函数进行 字符串比较 ;
// 重载 小于 < 运算符
bool String::operator<(String& s)
{
// 将 String 类比较转为 字符串比较
// 大于 和 小于 区别是 参数顺序不同的区别
return strcmp(s.m_p, this->m_p);
}
二、重载 右移 >> 运算符 - 使用全局函数重载
左移 << 操作符 cout << s << endl , 是将 s 对象输出到 cout 标准输出流中 ;
右移 >> 操作符 cin << s , 是将 标准输入流 cin 中的内容输入到 s 对象中 ;
使用 成员函数 实现 右移 >> 运算符 重载 :
- 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
- 要对 String a , b 对象对比操作 , 使用 右移 >> 运算符 , 使用时用法为 a >> b ;
- 函数名是
operate>>
;
operate>>
- 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
- 要对 String a , b 对象对比操作 , 使用 右移 >> 运算符 , 使用时用法为 a >> b ;
- 左操作数 : 其中 左操作数 是 String a , 这里通过 this 指针调用 , 不需要声明在参数中 ;
- 右操作数 : 右操作数 是 String b ; 该操作数需要声明在参数中 , 注意需要声明 引用类型 ;
- 上述两个是对象类型 , 对象一般传入 指针 或 引用 , 这里传入引用类型 ;
operator>>(String& s)
- 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
- 此处返回值是 istream& , 返回引用类型 , 可以进行链式调用 ;
istream& operator>>(String& s)
- 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
// 全局函数 中实现 String 右移运算符重载
// 返回 istream& 引用类型 , 是为了支持链式调用 cin >> s1 >> endl;
istream& operator>>(istream& in, String& s)
{
cin >> s.m_p;
return in;
}
在 String 内部类中 , 将 上述 全局函数 声明为 String 的 友元函数 ;
代码语言:javascript复制 // 使用 全局函数 实现 右移运算符 >> 重载
// 将全局函数 声明为 String 的友元函数
friend istream& operator>>(istream& in, String& s);
三、完整代码示例
1、String.h 类头文件
代码语言:javascript复制#pragma once
#include "iostream"
using namespace std;
class String
{
public:
// 默认的无参构造函数
String();
// 有参构造函数 , 接收一个 char* 类型字符串指针
String(const char* p);
// 有参构造函数 , 接收 int 类型值 , 表示字符串大小
String(int len);
// 拷贝构造函数 , 使用 String 对象初始化 对象值
String(const String& s);
// 析构函数
~String();
public:
// 重载等号 = 操作符 , 右操作数是 String 对象的情况
String& operator=(const String& s);
// 重载等号 = 操作符 , 右操作数是 字符串常量值 的情况
String& operator=(const char* p);
// 重载 数组下标 [] 操作符
char& operator[](int i);
// 重载 双等号 == 运算符
bool operator==(String& s);
// 重载 不等号 != 运算符
bool operator!=(String& s);
// 重载 大于 > 运算符
bool operator>(String& s);
// 重载 小于 < 运算符
bool operator<(String& s);
// 使用 全局函数 实现 左移运算符 << 重载
// 将全局函数 声明为 String 的友元函数
friend ostream& operator<<(ostream& out, String& s);
// 使用 全局函数 实现 右移运算符 >> 重载
// 将全局函数 声明为 String 的友元函数
friend istream& operator>>(istream& in, String& s);
public:
// 获取私有成员 char* m_p
char* str();
// 获取私有成员 int m_len
int len();
private:
// 字符串长度 , 不包括 '