外观
09.类中的函数重载、操作符重载的概念、C++ 中的字符串类、初探 C++ 标准库、完善的复数类
约 1973 字大约 7 分钟
C++函数重载操作符重载字符串类
2022-06-16
二十九、类中的函数重载
1、函数重载回顾
- 函数重载的本质为相互独立的不同函数
- C++中通过函数名和函数参数确定函数调用
- 无法直接通过函数名得到重载函数的入口地址
- 函数重载必然发生在同一个作用域中
2、类中的重载
- 类中的成员函数可以进行重载
- 构造函数的重载
- 普通成员函数的重载
- 静态成员函数的重载
问题:全局函数,普通成员函数以及静态成员函数之间是否可以构成重载?
3、万变不离其宗
- 重载函数的本质为多个不同的函数
- 函数名和参数列表是唯一的标识
- 函数重载必须发生在同—个作用域中
4、实例分析:类与重载全面分析

5、深度的意义
- 重载的意义
- 通过函数名对函数功能进行提示
- 通过参数列表对函数用法进行提示
- 扩展系统中已经存在的函数功能
6、编程实验:重载的意义分析

7、思考。。。
- 重载能够扩展系统中已经存在的函数功能!那么重载是否也能够扩展其它更多的功能?
- 下面的复数解决方案是否可行?

8、小结
- 类的成员函数之间可以进行重载
- 重载必须发生在同一个作用域中
- 全局函数和成员函数不能构成重载关系
- 重载的意义在于扩展已经存在的功能
三十、操作符重载的概念
1、需要解决的问题
- 下面的复数解决方案是否可行?

2、编程实验:复数的加法操作

3、思考。。。
Add函数可以解决Complex对象相加的问题,但是Complex是现实世界中确实存在的复数,并且复数在数学中的地位和普通的实数相同。
为什么不能让+操作符也支持复数相加呢?
4、操作符重载
C++中的重载能够扩展操作符的功能
操作符的重载以函数的方式进行
本质:
- 用特殊形式的函数扩展操作符的功能
通过operator关键字可以定义特殊的函数
operator的本质是通过函数重载操作符
语法:

- 编程实验:操作符重载初探

- 可以将操作符重载函数定义为类的成员函数
- 比全局操作符重载函数少一个参数(左操作数)(使用this充当左操作数)
- 不需要依赖友元就可以完成操作符重载
- 编译器优先在成员函数中寻找操作符重载函数(优于全局函数)

5、编程实验:成员函数重载操作符

6、小结
- 操作符重载是C++的强大特性之一
- 操作符重载的本质是通过函数扩展操作符的功能
- operator 关键字是实现操作符重载的关键
- 操作符重载遵循相同的函数重载规则
- 全局函数和成员函数都可以实现对操作符的重载
三十一、完善的复数类
1、完善的复数类
复数类应该具有的操作
- 运算:+ - * /
- 比较:== !=
- 赋值:=
- 求模:modulus
利用操作符重载
- 统一复数与实数的运算方式
- 统一复数与实数的比较方式

2、编程实验:复数类的实现



3、注意事项
- C++规定赋值操作符( = )只能重载为成员函数
- 操作符重载不能改变原操作符的优先级
- 操作符重载不能改变操作数的个数
- 操作符重载不应改变操作符的原有语义
4、小结
- 复数的概念可以通过自定义类实现
- 复数中的运算操作可以通过操作符重载实现
- 赋值操作符只能通过成员函数实现
- 操作符重载的本质为函数定义
三十二、初探 C++ 标准库
1、有趣的重载

2、编程实验:重载左移操作符

3、C++标准库
重复发明轮子并不是一件有创造性的事,站在巨人的肩膀上解决问题会更加有效!
C++标准库并不是C++语言的一部分
C++标准库是由类库和函数库组成的集合
C++标准库中定义的类和对象都位于std命名空间中
C++标准库的头文件都不带.h后缀
C++标准库涵盖了C库的功能
C++编译环境的组成

- C++标准库预定义了多数常用的数据结构

4、编程实验:C++标准库中的C库兼容

5、编程实验:C++中的输入输出


6、小结
- C++标准库是由类库和函数库组成的集合
- C++标准库包含经典算法和数据结构的实现
- C++标准库涵盖了C库的功能
- C++标准库位于std命名空间中
三十三、C++ 中的字符串类
1、历史遗留问题。。。
- C语言不支持真正意义上的字符串
- C语言用字符数组和一组函数实现字符串操作
- C语言不支持自定义类型,因此无法获得字符串类型
2、解决方案
- 从C到C++的进化过程引入了自定义类型
- 在C++中可以通过类完成字符串类型的定义
- 问题:
- C++中的原生类型系统是否包含字符串类型?
3、标准库中的字符串类
- C++语言直接支持C语言的所有概念
- C++语言中没有原生的字符串类型
- C++标准库提供了string类型
- string直接支持字符串连接
- string直接支持字符串的大小比较
- string直接支持子串查找和提取
- string直接支持字符串的插入和替换
4、编程实验:字符串类的使用


5、标准库中的字符串类
- 字符串与数字的转换
- 标准库中提供了相关的类对字符串和数字进行转换
- 字符串流类(sstream)用于string的转换

- 使用方法

- (iss >> num)有返回值为布尔类型
- (oss << 543.21)有返回值为oss本身
6、编程实验:字符串和数字的转换

7、面试题分析
- 字符串循环右移
- 示例:
- abcdefg循环右移3位后得到efgabcd
8、编程实验:用C++完成面试题

9、小结
- 应用开发中大多数的情况都在进行字符串处理
- C++中没有直接支持原生的字符串类型
- 标准库中通过string类支持字符串的概念
- string类支持字符串和数字的相互转换
- string类的应用使得问题的求解变得简单
