C++ 深度解析教程(十)数组操作符的重载、函数对象分析、关于string的疑问、关于赋值的疑问

三十四、数组操作符的重载

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 语言中惯用的编程思想
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值