三十四、数组操作符的重载
1、问题:string类对象还具备C方式字符串的灵活性吗?还能直接访问单个字符吗?
2、字符串类的兼容性
- string类最大限度的考虑了C字符串的兼容性
- 可以按照使用C字符串的方式使用string对象
3、编程实验:用C方式使用string类
4、问题:类的对象怎么支持数组的下标访问?
5、重载数组访问操作符
- 被忽略的事实。。。
- 数组访问符是C/C++中的内置操作符
- 数组访问符的原生意义是数组访问和指针运算
- 实例分析:指针与数组的复习
- 数组访问操作符([])
- 只能通过类的成员函数重载
- 重载函数能且仅能使用一个参数
- 可以定义不同参数的多个重载函数
6、编程实验:重载数组访问操作符
7、编程实验:数组类的完善
8、小结
- string类最大程度的兼容了C字符串的用法
- 数组访问符的重载能够使得对象模拟数组的行为
- 只能通过类的成员函数重载数组访问符
- 重载函数能且仅能使用一个参数
三十五、函数对象分析
1、客户需求
- 编写一个函数
- 函数可以获得斐波那契数列每项的值
- 每调用一次返回一个值
- 函数可根据需要重复使用
2、编程实验:第一个解决方案
3、存在的问题
- 函数一旦开始调用就无法重来
- 静态局部变量处于函数内部,外界无法改变
- 函数为全局函数,是唯一的,无法多次独立使用
- 无法指定某个具体的数列项作为初始值
4、解决方案
- 函数对象
- 使用具体的类对象取代函数
- 该类的对象具备函数调用的行为
- 构造函数指定具体数列项的起始位置
- 多个对象相互独立的求解数列项
5、函数对象
- 函数调用操作符 ( )
- 只能通过类的成员函数重载
- 可以定义不同参数的多个重载函数
6、编程实验:最终解决方案
7、小结
- 函数调用操作符( ( ) )是可重载的
- 函数调用操作符只能通过类的成员函数重载
- 函数调用操作符可以定义不同参数的多个重载函数
- 函数对象用于在工程中取代函数指针
三十六、经典问题解析三
1、关于赋值的疑问
什么时候需要重载赋值操作符?编译器是否提供默认的赋值操作?
- 编译器为每个类默认重载了赋值操作符
- 默认的赋值操作符仅完成浅拷贝
- 当需要进行深拷贝时必须重载赋值操作符
- 赋值操作符与拷贝构造函数有相同的存在意义
- 编程实验:默认赋值操作符重载
- 问题分析
- 一般性原则
- 重载复制操作符,必然需要实现深拷贝!!!
- 编程实验:数组类的优化
2、不积硅步无以至千里
- 编译器默认提供的函数
3、关于string的疑问
- 下面的代码输出什么?为什么?
- 编程实验:字符串问题1
- 问题分析
- 下面的程序输出什么?为什么?
- 编程实验:字符串问题2
- 问题分析
4、小结
- 在需要进行深拷贝的时候必须重载赋值操作符
- 赋值操作符和拷贝构造函数有同等重要的意义
- string类通过一个数据空间保存字符数据
- string类通过一个成员变量保存当前字符串的长度
- C++开发时尽量避开 C 语言中惯用的编程思想