当前课程知识点:面向对象程序设计(C++) > 第二讲 基础语法(1) > 2.4 函数参数的缺省值与追踪返回类型的函数 > 函数参数的缺省值与追踪返回类型的函数
好刚才我们讲了呢
是我们用两个不同的函数体的0:26
然后呢它们表达的意思是一样的
所以希望能够用同样的名字来表示它
这个可以用函数的重载来实现
那么有一个跟这个函数
类似的另外一个方面呢
就是当函数有多个参数的时候
其实你在使用这个函数
你肯定是要把参数值传给它
可是呢在你的某些情形之下
这个参数有的时候往往是
固定的一些值
那你希望说这些固定的值
我能不能这个不写出来
让编译器自动的替我去完成
这样的一个要求
在1:10 这个标准里头也是支持的
也就是下面我们看到的
函数参数的缺省值
就是你不提供的时候
由编译器替你去提供
所以你看这个东西就很方便对吧
而且呢不仅是写起来方便
更重要的是它表达了
你对于这个函数一种认识
就是说这个函数它大多数情况下
会用这种参数的值来进行调用
是你对于这个任务完成过程当中
的一种常见情形的一种理解
表达了这么个意思
所以不仅仅是敲代码方便
而是表达了一种设计的一种 理念
或者你对这个任务本身的一种认识
我们来看这个代码
这里头有个print函数然后呢我去cout
那这个时候你可以看到这个cout
它有个msg的这个参数
后面跟了一个等号hello
这样的一个字符串
等号然后一个字符串的值常量值
这个形式在函数定义的时候
给它的参数在这个参数列表里头
附了个值就被称为函数的参数
带了一个缺省值
这个例子里头msg这个参数
它的缺省值是hello这个字符串
也就是说如果你调用print
不提供参数
那么编译器就替你把hello这个字符串
传给msg这个函数参数
就像这个main函数这样写的
我们第一句话写的是print括号北京
这是个字符串传给它
那它当然输出出来就是这个
北京这个点点点#
第二句话大家看print空的
这个时候呢编译器一看
人家没给参数啊
编译器替你把hello这个单词
传给msg这个变量
于是打出来呢就变成了hello#
下面这个绿色的这个注释
就表示这个程序运行出来
屏幕上输出的这种结果
我们可以看到在这种情况下
这个函数的这个缺省值
使得我们在使用它的时候
有一些常见的这种参数的值
你可以通过默认值的形式
直接写在代码里头去
在你去调用函数的时候
就不必再给这些变量值
这些参数给它赋值了
这样的话写起来就比较方便
大家可以想象一下
当这个函数的参数很多的时候
得有七八个参数
因为这个函数完成的功能很复杂
那么它需要接受七八个参数
可是呢在很多时候这些参数
其实都是一些固定的值
但是你这些固定值又不能不提供
你不提供的话呢
这个参数又不能把它去掉
去掉之后这个函数的功能就减弱了
那怎么办呢你就可以通过
默认值这种形式
直接在函数定义的时候提供出来
这样它就大大的方便
用户在使用这个函数的这种工作量
也减少了它的这种记忆量
它就不用去想了
反正这是缺省值这就够用了吗
它直接调用就好了
就像我们下面这个例子看到的
这个print它带了好几个参数
第一个是一个char*name
第二个呢是一个int score
第三个呢是一个msg这种字符串
那一般情况下这个msg
就是写的pass
那我就可以把它
直接给它用一个等号
把这个值写在函数print
这种定义里头去
那么将来你在调用的时候
你最后一个参数就可以不写
当你不写的时候
它第三个参数它就
由编译器给它设置成了
这种pass这种字符串
这里头有一个要求就是
这些所有带有缺省值的这种参数
只能是放在最后一个参数里头去
那如果你有
多个带缺省值的参数怎么办呢
那就从右边依次从后面往前面
依次去出现
换言之呢就是这些带缺省值的函数参数
它只能连着从尾巴
从最后一个参数开始
依次来给它定义你不能跳着来
比方说像我们这个print这个函数里头
你不能把这个msg这个
带着缺省值的这个函数参数
放到第一个
跟我们这个name这个参数兑换
这是不行的
它必须放到最后一个
如果说这个score也是有缺省值
比如说等于六十
那么score和msg
必须是这个print函数的后面
最后的那两个
所以如果一个函数的参数有m个
其中呢n个是带缺省值的
那么这n个带缺省值的参数
必须是这m个参数的最后的n个
这是这个规定好吧
这是在参数的传给函数的时候
它可以带一些缺省值
然后呢由编译器替你完成一些工作
最后一个我们想讲的呢
就是这个对于这个
函数的返回类型进行追踪
这样的一个语法形式
这也是7:26 里头所提供的
那我们可以把这个函数的返回类型
用下面这个形式来提供
作为对比我们先给出一个
普通的函数的声明 形式
比方说有一个func函数
它有两个参数一个char*一个int
它的返回类型呢是一个int
那我们可以写成什么呢
可以写成是把这个int这个返回类型
用一个箭头这实际上是一个减号
加上一个大于号
我们称之为箭头
用这个操作符连接起来
后面跟上它的类型名字叫int
然后把原来本来应该写在左边的
这个地方写这个auto
就是写这个a u t o这个关键字
那么这样之后呢
就是我们定义了一个func函数
它的返回类型地方出现auto
那么编译器就会在
这个函数的头的右部
去找那个箭头
去用箭头后面的那个类型名字
来作为这个函数的返回类型
那么我们提一下
这样的一种形式到底有什么用处呢
其实有的时候啊
这个函数到底返回什么类型
有的时候编写这个代码的人
自己不知道
然后呢需要通过我们前面讲的
decltype这样的一个关键字
来从变量里头推导出来
那这个时候写在
这个func这个返回值的前面
是不行的
必须是把它写在后头
因为这个计算机去
编译你的代码的时候
是从左往右去扫描
所以它需要写在后面
然后呢去用这个已知的一些变量
来推导出那个类型
这个需求呢在我们
后面讲到模板的时候
可能就会出现这样一种特殊的要求
就是说我的参数是通过
我的返回的类型
是根据参数的类型
函数参数的类型来决定的
而函数参数呢
是在函数名后面才出现
返回值呢是在函数名的前面出现的
这不就矛盾了吗
所以为了让编译器
能够很好地处理这个
它需要有一种办法
能够把返回类型放到函数名的后头
这就是为什么要给出这样的一种办法
用auto和这个箭头来配合
然后给出一个函数func它的返回类型的
这样的一个原因
当然了这个目前大家看到的这个例子
其实看上去没什么特别的优势
对吧因为你写在前面也没有问题呀
但是我刚才解释的时候
所说的那种场景
你如果只允许返回类型在
函数的前面的话
它是没办法达到那个目的的
因为它的这个返回值是
根据它的参数来决定的
有的时候需要有这种灵活性
那么为了支持这个
我们在10:51 的这个标准里头
就引入了一个把函数的返回类型
后置放到后头放置在后面
这样的一种新的语法形式
将来我们在实际的
程序设计的这个例子里头
碰到这样一种情形
-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
-期末考试--作业