C++ 深度解析教程(九)类中的函数重载、操作符重载的概念、C++ 中的字符串类、初探 C++ 标准库、完善的复数类

二十九、类中的函数重载

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、编程实验:重载左移操作符

3C++标准库

重复发明轮子并不是一件有创造性的事,站在巨人的肩膀上解决问题会更加有效!

  • 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类的应用使得问题的求解变得简单
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值