当前课程知识点:面向对象程序设计(C++) >  第二讲 基础语法(1) >  2.4 函数参数的缺省值与追踪返回类型的函数 >  函数参数的缺省值与追踪返回类型的函数

返回《面向对象程序设计(C++)》慕课在线视频课程列表

函数参数的缺省值与追踪返回类型的函数在线视频

函数参数的缺省值与追踪返回类型的函数

下一节:类的定义

返回《面向对象程序设计(C++)》慕课在线视频列表

函数参数的缺省值与追踪返回类型的函数课程教案、知识点、字幕

好刚才我们讲了呢

是我们用两个不同的函数体的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 的这个标准里头

就引入了一个把函数的返回类型

后置放到后头放置在后面

这样的一种新的语法形式

将来我们在实际的

程序设计的这个例子里头

碰到这样一种情形

面向对象程序设计(C++)课程列表:

第一讲 课程简介与编程环境

-1.0 课程定位、教学内容

--课程定位与教学内容

-1.0 课程定位、教学内容--作业

-1.1 编程环境与工具

--程序结构与编译链接

--源程序拆分

--多文件编译链接的方法

-1.2 main函数的命令行参数

--main函数的命令行参数

-作业一--作业

第二讲 基础语法(1)

-2.1 变量定义

--变量定义

-2.2 变量的初始化、类型推导与基于范围的循环

--变量的初始化、类型推导与基于范围的循环

-2.3 函数重载

--函数重载

-2.4 函数参数的缺省值与追踪返回类型的函数

--函数参数的缺省值与追踪返回类型的函数

-2.5 类的定义

--类的定义

-2.6 类成员的访问权限与友元

--类成员的访问权限与友元

-第二讲 基础语法(1)--作业二

第三讲 基础语法(2)

-3.1 构造函数析构函数

--构造函数析构函数

-3.2 赋值运算符重载

--赋值运算符重载

-3.3 流运算符重载

--流运算符重载

-3.4 函数运算符重载

--函数运算符重载

-3.5 下标运算符与自增减运算符重载

--下标运算符与自增减运算符重载

-3.6 静态成员与常量成员

--静态成员与常量成员

-3.7 对象组合

--对象组合

-3.8 移动构造函数

--Video

--Video

-3.9 default修饰符

--Video

-第三讲 基础语法(2)--作业三

第四讲 基础语法(3)

-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

期末考试

-期末考试--作业

函数参数的缺省值与追踪返回类型的函数笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。