大家好
欢迎继续学习C++语言程序设计
接下来呢
我们来学习第三章函数
首先
我将第三章的内容
给大家作一个概要性的介绍
使大家在学习过程中
能够了解这一章的全貌
那么第一个问题就是
大家会问
为什么在程序中有一个函数呢
函数不是数学中的术语吗
那实际上呢
最早的程序就是用来解数学题的
就是用来作科学计算的
所以
可能从那个时候
我们就把程序中的一个功能模块
就叫做一个函数
很多高级语言里面
都将功能模块定义为一个函数
那么一个函数呢
最早就是用来计算
一个数学公式
并且有一个计算结果
现在虽然计算机软件的应用
越来越广泛
它的用途远远不仅仅是
科学计算了
但是在C++中
我们仍然将一个功能模块
实现为一个函数
那么在这一章呢
就要给大家介绍
怎么样定义一个函数
怎么样调用一个函数
所谓定义一个函数
就是要把这个函数所描述的
解决问题方法写出来
那么调用呢
就是将这个函数
用在其他的地方
定义一次准备好了
在其他的地方就可以用
现成的定义好的这个函数了
这就是
这一章要讲的第一个问题
函数的定义与调用
接下来呢
还会给大家介绍内联函数
因为有些函数
它的计算公式非常简单
而按照函数这种机制呢
当调用函数的时候
它是要有一定开销的
这个后面课程中会给大家讲
到底开销在什么地方
开销会在保存
当前这个函数执行的现场
然后去转子函数
中间要传递参数
然后子函数执行完了以后
再返回来
要传递返回值
这些过程
都要付出时间与空间的开销
那么对于特别简单的函数来讲
可能你执行这个函数
所规定的操作花的时间
还不如转子函数
返回花的时间多
那这个时候
我们可以在C++中
用内联函数来解决这个问题
来平衡程序逻辑结构上
需要定义单独函数
而执行过程中
希望它不要去当函数调用
来转子函数返回
来平衡这一对矛盾用什么呢
用内联函数这种机制
那么在新版的C++标准中
还有一种修饰函数的关键字
constexpr
那么这个constexpr函数
是干什么的呢
它是常量表达式函数
那么这个函数很有意思
它的函数体中的可执行语句
只能有一句
就是return语句
那么规定
当给它的参数
参数是什么
参数是往往我们用来
传递计算所需要的必要条件
给函数所用的东西
就像数学函数那个括号里面
自变量一样
在程序中也会有函数的参数
后面会给大家介绍的
那么constexpr函数呢
当它的参数是常量的时候
它的返回值就一定是常量
那么这样的函数
是可以用来初始化符号常量的
我们在讲变量的定义
常量的定义的时候讲过
你如果定义一个量
前面加了const
它就是一个常量
用来初始化常量的呢
只能是已经
被初始化过的其他常量
或者是一个字面值的常量
和常量表达式
总而言之
应该是在编译期间
可以计算得到的这个量
在现实中做很多事情
大家可能都有一个约定
有一个默契
如果我不特殊指定的话
你就按照这种方式给我做事情
这种思维逻辑
我们都很习惯了
那么在程序中呢
我们定义一个函数的时候
也可以给函数的参数
定义一个默认值
这个就是带默认形参值的函数
这个机制非常有用
使得你定义一个函数以后
调用的方式可以多样
你可以给它全部的参数
也可以只给一部分参数
或者不给参数
所以说带默认形参值的函数
是让我们的函数更通用
更好用的一种有效的机制
我们知道
每一个函数应该有函数名
在数学中是这样的
在程序中也是这样的
比如说
我们平常习惯的作加法
那么你可以作整数的加法
可以作实数的加法
我们说话的时候
用数学语言表达的时候
都用的这个+号
说话的时候
都用了加法这个术语
并没有特殊去指定
说这是一个整数加法的方法
那是一个实数加法的方法
在程序中
我们也希望能这样
比如写一个函数去实现加法
让它既能处理整数
又能处理实数
可不可以呢
那么如果
不是面向对象的程序的话
它是不支持同一个函数名
对应于不同功能的
而在C++程序中
我们就可以这样做
因为这是面向对象的程序
它支持函数的重载
函数的重载就是说
我定义同一个函数名
但是可以有多种
不同的算法跟它对应
哪种算法
当然我们要用一个函数体来实现
那么如何去区分它呢
当你去调用这个函数的时候
怎么知道你到哪儿去找它
应有的函数体呢
这个时候就要看
你给函数的参数列表
定义的是什么样子的
如果你给的实参
去找你定义过的这些函数的形参去匹配
跟哪个函数的形参匹配上了
就去调用那个函数的函数体
就是一个函数调用表达式
对应到一个函数体这个过程
叫做绑定
在编译时完成的绑定叫做早绑定
也叫做编译时的绑定
那后面章节呢
我们肯定还会学到有晚绑定
也就是越形式绑定的
另外呢
在这一章我还要给大家介绍
C++的系统函数
在C++标准库中
有大量已经预先定义好的
这些系统函数
非常好用
常用的这些功能都在里面了
我们就不用再自己定义了
如果你发现
系统函数库里已经有这个函数了
那么你直接调用就可以了
这样使得我们编程序的效率
会更高
这就是第三章
我们要学习的一些主要内容
大家有一个概要性的了解
在整个学习过程中
就会能够有机地把所有内容
融会贯通地理解
这一章学习完了
大家应该能够去在
一种你选择的编译环境中
用调试工具
去跟踪单步执行跟踪到
函数的内部
去观察函数的调用和返回
以及参数传递过程
所以课后呢
希望大家把这些例题
都在编译环境中自己调试一下
还有
这一章的实验
也是需要大家课后去完成的
当然还会给大家提供
更多的练习题
让大家去做练习
这就是这一章要讲的主要内容