当前课程知识点:面向对象程序设计(C++) > 第二讲 基础语法(1) > 2.3 函数重载 > 函数重载
那么大家可能都听说过这样的一个说法
叫顾名思义望文生义对吧
那就是说我们有的时候一个名字
你一看它就知道它代表了什么意思
其实这样的一个现象其实也是我们在
程序设计里头给这个变量给函数
命名的时候所要遵循的一种原则
因为这样比较符合人的思维的习惯
特别是在我们函数的命名的时候
因为它往往是代表了一个
处理的这种算法一种功能
所以这个函数的名字的选择
显得非常的关键
但是呢好名字总是有限的
根据你这个内容恰如其分的名字
有的时候也是屈指可数的
有的时候甚至是惟一的
可是呢有的时候这个事情的做法
也许有很多种
那么到底我这个不同的这种做法
可是呢它们想表达的意思又是一样的
或者说类似的
这个时候它们的名字该怎么取呢
在我们以前学编程的时候
通常还没有涉及到这样的一个问题
但是我们知道在我们这门课程里头
其实是往往要去解决
更复杂更大型的这种软件设计
那么就会碰到
刚才我们所提出来的这样的一个问题
就是有两种不同的2:01
那么呢它们所表达的意思
是相近甚至是相同的
按照我们望文生义顾名思义
这样一种追求的话
这两个处理的方法所定义的那个函数
应该用同一个名字
在这种情况下我们把两个函数
取了同一个名字
就被称为函数的重载
也就是说这一个名称
它有多个不同的函数体
具体的我们来看这个代码
下面我们是一个print
它的参数是char*你给我一字符串
名字叫做message我把它cout出来
那么呢这是打印字符串
或者我们有的时候称为输出字符串
那我可以输出整数啊
我有的时候也想输出啊
那你前面已经把print这个用到
这个字符串的输入上去了
那我现在想输出整数怎么办呢
那有的同学说那你用3:10
那可是有的时候我会觉得
还是print好啊没关系
我们3:18 是支持你这两个函数
用同一个名字的
也就是大家在这个例子的
下半部分所看到的
又一个函数也叫print
但是它的参数不同int score
然后呢我可以cout这个score
这个整数的内容
那么在这样子的一个代码里头
出现了两个函数
它的函数所完成的任务是不一样的
一个输出字符串一个输出整数
但是它们取了同样的名字
这个就被称为函数重载
它要求这个被重载的这个函数
它们的参数一定得不一样
因为函数名已经一样了
如果参数也一样这就麻烦了
所以呢要求参数不一样
那比如说那我的返回值不一样呢
这个在4:14 里头
对于仅仅只是返回值不同的
这种函数的重载是不允许的
所以呢你每一次的这种函数重载
必须要保证它们函数的参数是不一样的
至于说函数体呢当然是不一样的
对不对这是不言而喻的
所以在我们这个例子里头
1和2这两个注释所代表的这两个print
它们的4:41 是不同的
那么编译器将会根据
函数调用的时候的那个语句
来决定到底调用哪一个函数
比方说下面我们这代码里头
大家可以看到int main
第一句话调用了Hello print Hello
给它的是一个字符串第二个呢
我们是print 94给它的是一个整数
那么呢编译器会自动的
根据你所传输的这个实参的类型来决定
比如说第一个你是字符串
所以调的是1那个地方的这个函数
所以后面那个int print94
这是一个整数因此呢它会去调用那个
整数那个地方的函数
所以会根据实际参数的情况
来决定调用哪一个函数
那么这些同名的函数
它的5:48 之间务必必须至少保证
有一个参数它的这个类型是有区别的
至于说返回值这个参数的名字
这些统统的都不能作为区分的标准
所以这个必须要满足要求
这个我想关于这个函数重载说一下就是
为什么我们特别的需要有这样的一个东西
其实就像我们最开始说的那段话一样
我们要的就是这个代码
能够让人读起来能够望文生义
能够顾名思义一看print昂这是打印输出
对不对至于说打印输出是个字符串
还是输出一个整数那不是我关心 的
因为无论是整数也好字符串也好
反正最后是输出出来
我希望能够用一个名字
来表示这种对不同的变量的内容的输出
这样的话呢在程序的编写和阅读上面
就会带来很大的便利这是一个方面
从6:50 来讲又方便又便利对吧
再一个呢就是从我们用程序这种语言
去表达我们的算法表达我们的思路的时候
甚至表达我们对这个世界的认识的时候
在同一个名字其实就包含着
你认为输出一个字符串
和输出一个整数在某种级别上面
你认为它们没区别
其实是表达了你或者说程序员
对于这个字符串和整数输出
这两个事情的共性的一种表达
或者你认为它们是有共性的
是有相同地方的所以呢
你希望能够用一个词
来把它们的共同点表达出来
所以从涉及的层面
从表达你对于这个事物的认识的角度
我们需要有同名的函数这样的一种支持
这就是函数存在它的一种用途
-1.0 课程定位、教学内容
-1.0 课程定位、教学内容--作业
-1.1 编程环境与工具
--源程序拆分
-1.2 main函数的命令行参数
-作业一--作业
-2.1 变量定义
--变量定义
-2.2 变量的初始化、类型推导与基于范围的循环
-2.3 函数重载
--函数重载
-2.4 函数参数的缺省值与追踪返回类型的函数
-2.5 类的定义
--类的定义
-2.6 类成员的访问权限与友元
-第二讲 基础语法(1)--作业二
-3.1 构造函数析构函数
--构造函数析构函数
-3.2 赋值运算符重载
--赋值运算符重载
-3.3 流运算符重载
--流运算符重载
-3.4 函数运算符重载
--函数运算符重载
-3.5 下标运算符与自增减运算符重载
-3.6 静态成员与常量成员
-3.7 对象组合
--对象组合
-3.8 移动构造函数
--Video
--Video
-3.9 default修饰符
--Video
-第三讲 基础语法(2)--作业三
-4.1 继承
--Video
-4.2 函数重写
--Video
-4.3 虚函数
--Video
--Video
-4.4 自动类型转换
--Video
-4.5 禁止自动类型转换
--Video
-4.6 强制类型转换
--Video
-4.7 函数模板
--Video
-4.8 类模板
--Video
-4.9 成员函数模板
--Video
-4.10 模板特化
--Video
-作业四--作业
-5.0 引言
--Video
-5.1 从FOP到OOP
--Video
-5.2 对象在哪里
--Video
-5.3 接口在哪儿
--Video
-5.4 实现接口
--Video
-5.5 变与不变:多态的威力
--Video
-6.0 引言
--讨论
-6.1 从负载监视器的设计开始
-6.2 接口的分离与单一责任原则
-6.3 委托与接口的进一步分解
-6.4 分离不同层面的可变性
-7.0 引言
--Video
-7.1 迭代器
--Video
-7.2 迭代器的实现
--Video
-7.3 迭代器与模板
--Video
-7.4 算法与数据的解耦
--Video
-7.5 抽象结构与类模板
--Video
-7.6 函数对象与算法分解
--Video
-7.7 基于模板的策略模式
--Video
-8.0 引言
--Video
-8.1 已有资源的组合
--Video
-8.2 适当引入接口
--Video
-8.3 接口不变时的功能变化
--Video
-8.4 装饰
--Video
-8.5 责任的传递与责任链
--Video
-8.X 小结
--Video
-9.0 引言
--Video
-9.1 通过封装增加隔离、应对变化
--Video
--Video
-9.2 增加抽象层,应对变化
--Video
--Video
-9.3 相互关联对象的创建
--Video
-9.4 示例:自动组卷系统设计
--Video
-9.5 设计思路(上)
--Video
-9.6 设计思路(中)
--Video
-9.7 设计思路(下)
--Video
-9.X 小结
--Video
-课程总结
--Video
-期末考试--作业