重载操作符

本文详细介绍了C++中如何重载算术操作符、元素操作符[ ]、关系操作符==、类型转换操作符()以及输入输出操作符<<。通过示例展示了如何为自定义类如Fraction和Text提供这些操作符的支持,以便实现类似内置类型的运算和操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重载操作符


1重载算术操作符±*/

引例
用一个类Fraction,用于表示2/3, 87/890这种分数。
class Fraction
{
public:
Fraction(int n ,int d): num(n), den(d)
{
}
int num; // 分子
int den; // 分母 };

引例
定义两个数
Fraction fa(2,3); // 2/3
Fraction fb(3,5); // 3/5
按理来说,两个数是可以进行算术运算的,例如
int a = 2;
int b = 3;
int c = a + b;
那么,对于我们的“分数”这种类型,最好也能够支持加减乘除的算术 运算。 目标效果:
Fraction fc = fa + fb;
(显然,默认情况下自己的class是不支持算术运算的)

重载算术运算符
使用重载运算符的语法,可以使得自己定义的类支持加减乘 除等算术运算符。
第一种方式: 类操作符
// 重载加号操作符
Fraction operator + (const Fraction& other)
{
Fraction result;
// 本对象和other运算,得出结果并返回
return result;
}

重载算术运算符
其中,
operator + 是要重载的操作符,形式上类似于成员函数
注意:
(1)重载操作符的形式上像一个函数,但它不是函数
(2)名称:operator + ,这个是固定不变的
(3)返回值:类型不变,总是为该对象的类型
(4)参数:基本上也不变
(5)受public/protected/private的限制
在 fc = fa + fb 语句中,operator+被调用

重载算术运算符
另一种写法:重载全局操作符
默认地, 操作符 + 已经支持了 double + double, int + int等等,现在要求重载一下,支持 Fraction + Fraction
即,已经存在
int operator + (int a, int b);
double operator + (double a, double b);
现在要写一种
Fraction operator+ (const Fraction&a , const Fraction& b);

重载算术运算符
// 重载全局操作符
Fraction operator + (const Fraction& a, const Fraction& b)
{
Fraction result;
result.den = a.den * b.den;
result.num = a.num * b.den + a.den * b.num;
return result;
}
通常,要将全局操作符的重载声明为类的朋友
(当num/den为private的时候,必须将此重载的操作符声明为friend)

注意
(1)当类操作符和全局操作符同时被重载时,类操作符被 优先调用。 (就近原则)
(2)各种重载操作符,其形式基本是固定的。(名称、参 数、返回值,基本上都是固定写法)

小结

  1. 介绍了算术运算符重载的方法,给出加号(+)的示例。其 他的操作符(-, * , / )留作练习。
  2. 重载操作符的形式基本上是固定的。
    (记忆为主,理解为辅,一般用不上)
2重载元素操作符 [ ]

重载操作符 [ ]
[] 用于访问一组元素中的一个元素。默认地,数组是支持 下标访问的。
例如,
int a[5] = {1,2,3,4,5};
a[0] = 111; // 写操作
int b = a[0]; // 读操作
[]中的下标称为:索引,key,唯一标志符 其作用是用来唯一的标识一个元素

重载操作符 [ ]
当一个对象设计用于包含多个元素时,可以重载操作符[]
比如,一个字符串Text,它包含了多个元素(每个元素是一 个字符)
Text txt(“hello world”);
char ch = txt[0]; // ‘h’
比如,在一个DataStore里存储多个Student数据
DataStore ds;
Student& st = ds[“shaofa”]; // 查找姓名为"shaofa"的记录

重载操作符 [ ]
当一个对象设计用于包含多个元素时,可以重载操作符[]
比如,一个字符串Text,它包含了多个元素(每个元素是一 个字符)
Text txt(“hello world”);
char ch = txt[0]; // ‘h’
比如,在一个DataStore里存储多个Student数据
DataStore ds;
Student& st = ds[“shaofa”]; // 查找姓名为"shaofa"的记录

重载操作符 [ ]
重载操作符的一般形式
Element& operator [] (Type index)
{
}
其中,
(1)名字: operator[],是固定不变的
(2)返回值:一般应该返回一个子元素的引用,表示返回值 是一个“左值”,可读可写
(3)参数:类型可以自己选择,用于指定元素的下标。不一 定要使用int,使用其他类型也可以。

示例一
Text类用于存储一串文本。
char& operator[] (int index)
{
return m_buf[index];
}

示例二
增强DataStore类

注意
(1) 操作符[]的返回值类型为引用,才算是符合使用惯例。 (即:应该返回一个左值)
(2) 元素下标的类型是不一定要用int,用char*也可以
(3) 操作符[]是可以重载的,参数类型不同
(4) 必须考虑元素不存在的情形

3重载关系操作符==

重载关系操作符
关系操作符: <, <=, >, >=, ==, !=
默认地,编译器不支持对自定义的类进行关系操作。例如, 我们想判断两个分数Fraction是否相等。
Fraction fa(2, 3);
Fraction fb(4, 6);
if(fa == fb) // 编译器报错!不支持==
{
}

重载关系操作符
本PPT介绍操作符==的重载方法。
一般有两种写法(对比27.1里加号的重载)
(1) 重载类操作符
class Object
{
public:
bool operator == (const Object& other){ }
};
(2) 重载全局操作符
bool operator == (const Object& a, const Object& b )
{}

重载关系操作符
以其中一种为例
bool operator == (const Fraction& other)
{
}
(1)名称 operator ==
(2)返回值: bool: true或false。(参考第3章)
(3)参数:可以重载。

例一
为Fraction类添加操作符==的支持,使其可以判断相等。
代码框架:
class Fraction
{
public:
///
bool operator == (const Fraction& other)
{
return true;
}
};

例二
为Text类添加操作符==的支持,使其可以判断相等。
代码框架:
class Text
{
public:
///
bool operator == (const Text & other)
{
return true;
}
};

4重载类型转换操作符()

类型转换操作符
C++中允许将一个类型转换为另一个类型,
例如,
int a = (int) 1.23; // 将double转成int
小括号: 类型转换操作符,括号里的是要转换的目标类型

类型转换操作符
比如,现在自己定义了一个类Fraction,表示分数。 那么怎么样才可以把Fraction类型直接转成一个double类型 呢?
Fraction fa(4, 5);
double value = (double)fa;

类型转换操作符
重载类型转换操作符 ()
一般形式
class Object
{
public:
operator Type() // Type为目标类型
{
Type result;
return result;
}
};

例一
为Fraction类重载一个类型转换操作符,使其可以被转换为 double类型。返回值表示该分数对应的小数的值。

例二
为Text类重载一个类型转换操作符,使其可以被转换为 const char*型字符串。

小结
类型转换操作符,形式比较简单,直接强记就可以。

5重载输入输出操作符 <<

输入输出操作符
C++中引入操作符 >> 表示输入, <<表示输出
(注意:位操作里它们承担的意思是:左移位、右移位)
在位操作中:
unsigned int a = 0xAA << 4;
(左操作数为整型时,表示移位)
Logger lg;
lg << “hello,world”;
(左操作数为自定义对象,表示输入输出)

输入输出操作符
这里仅演示输出操作符 << 的用法。
定义一个类: Logger,用于输出打印日志。
使用方法:
// 定义一个对象
Logger lg;
lg << 1;
lg << 2.0;
lg << “hello”;
// 或者串起来写
lg << 1 << ", " << 2.0 << “hello” ;

输入输出操作符
一般形式:
Logger& operator << (Type value)
{
return *this;
}
(1)名称: operator <<
(2)返回值:左值,一般返回对象自己
(3)参数:待输出的数据

输入输出操作符
在VC中的实现

输入输出操作符

  1. 注意:为什么返回左值? 因为,如果不返回左值,就没法串起来写。
  2. C++是借用了这两个操作符 当左操作数为整数时,表示“移位” 当为自定义类型class时,表示“输入、输出”

输入输出操作符
引入这一节的目的:
在有些教材里使用cin / cout来进行教学演示,本例的 目的是让大家看清cin / cout的本来面目。
看起来比较花哨,但实用性不大。在格式化输出方法不如 printf易用。

学习资源 《C语言/C++学习指南》语法篇(从入门到精通)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值