C++语言程序设计教程 普通高等教育“十一五”国家级规划教材 教学课件 PPT 作者 吕凤翥 第5章 函数

上传人:E**** 文档编号:89343027 上传时间:2019-05-23 格式:PPT 页数:34 大小:135KB
返回 下载 相关 举报
C++语言程序设计教程 普通高等教育“十一五”国家级规划教材 教学课件 PPT 作者 吕凤翥 第5章 函数_第1页
第1页 / 共34页
C++语言程序设计教程 普通高等教育“十一五”国家级规划教材 教学课件 PPT 作者 吕凤翥 第5章 函数_第2页
第2页 / 共34页
C++语言程序设计教程 普通高等教育“十一五”国家级规划教材 教学课件 PPT 作者 吕凤翥 第5章 函数_第3页
第3页 / 共34页
C++语言程序设计教程 普通高等教育“十一五”国家级规划教材 教学课件 PPT 作者 吕凤翥 第5章 函数_第4页
第4页 / 共34页
C++语言程序设计教程 普通高等教育“十一五”国家级规划教材 教学课件 PPT 作者 吕凤翥 第5章 函数_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《C++语言程序设计教程 普通高等教育“十一五”国家级规划教材 教学课件 PPT 作者 吕凤翥 第5章 函数》由会员分享,可在线阅读,更多相关《C++语言程序设计教程 普通高等教育“十一五”国家级规划教材 教学课件 PPT 作者 吕凤翥 第5章 函数(34页珍藏版)》请在金锄头文库上搜索。

1、第5章 函 数,5.1 函数的定义和说明,1函数的定义格式,5.1.1 函数的定义,C+语言中,函数的定义格式如下: () ,其中,包含存储类和数据类型。存储类对函数来讲有两种:一种是外部函数,存储类说明符为extern,通常被缺省;另一种是内部函数,存储类说明符为static,该说明符不可省略。,下面列举几个简单函数的定义。 void nothing () 又例如, void fun1() cont “ok!“ endl; 又例如, double add (double d1, double d2) double sum; sum=d1+d2; return sum; ,C+程序中,可以定义

2、多个函数,其中有一个主函数main(),其余函数都是被调用的函数。 C+语言中不允许在函数体内再定义函数。, 在定义函数时,C语言允许省略函数的数据类型,但C+语言中不允许省略任何的数据类型。 C语言规定:函数体内或分程序内,说明语句一定要放在执行语句的前面。在C+语言中取消了这条限制,即在函数体或分程序内说明语句可根据需要出现在程序的任何位置。,2在函数定义方面C+语言与C语言的不同,1函数的说明方法,5.1.2 函数的说明方法,在C+语言中,对函数的说明要求使用原型说明。函数的原型说明包括不仅要说明函数名和函数类型,还要说明该函数的参数个数及参数类型,参数名可以说明也可以不说明。,在函数说

3、明方面C语言要求使用简单说明或原型说明都可以,通常使用简单说明。而C+语言中,对函数的说明要求用原型说明不能用简单说明。,2在函数说明方面C+语言与C语言的不同,5.2 函数的参数和返回值,函数的实参指的是调用的参数,它可以是表达式,也可以是地址值,实参的特征是该参数具有一个确定的值。 函数的形参指的是被定义函数的参数,它可以是变量名、指针或引用,形参的特征是该参数在函数未被调用时是没有被分配内存单元的。,5.2.1 函数的参数,1函数的实参和形参,当一个函数具有多个实参时,允许不同编译系统在计算函数实参时有不同的计算顺序。在多个参数中出现了具有副作用的运算符时,不同的求值顺序可能造成不同的计

4、算结果。于是便可能出现二义性。为了避免这种二义性,应该避免函数实参中出现的带副作用的运算符。 见书中例5.1。,2函数实参的求值顺序,C+语言允许设置函数参数的默认值。 关于设置函数参数默认值的规则如下。 一个函数有多个参数时,可以给该函数的部分参数或全部参数设置默认值。 在给函数的部分参数设置默认值时,应该从参数表的右端开始,在设置了默认值的参数的右端不允许出现没有设置默认值的参数。,5.2.2 设置函数参数的默认值, 如果一个函数需要说明时,默认的参数值应设置在函数的说明语句中,而不是函数的定义中。 在函数调用时,对应参数如果有实参值,则将用该实参值取代设置的默认值;如果没有给定实参值时,

5、则用参数的默认值。 在给函数参数设置默认值时,可以用相同类型的常量、变量以及同类型表达式,也可以是函数,通常应使用全局量。 见书中例5.2,例5.3。,C+语言中,如果一个函数具有返回值,则需要在该函数体内有如下形式的返回语句: return ; 函数返回值的具体实现过程描述如下。 执行带有返回值的return语句时,先计算return关键字后边的的值。,5.2.3 函数返回值的实现, 根据函数的类型来确定表达式的类型。如果表达式类型与函数类型不一致时,强行将表达式类型转换为函数类型。 将表达式的值作为函数的返回值传递给调用函数,作为调用函数的值,通常调用函数将其值赋给某个同类型的变量,或者输

6、出显示。 将程序的执行顺序转回到调用函数的语句,接着执行调用函数下面的语句。 见书中例5.4。,5.3 函数的调用,5.3.1 函数的传值调用,1传值调用方式,这种调用方式的数据传递机制如下: 实参用表达式,形参用变量名,在函数调用时,用实参值对形参变量进行初始化。这种传递数据的特点是实参将拷贝一个副本给形参。,这种调用方式的特点如下: 由于传值调用的机制是实参拷贝副本给形参,于是在被调用函数中通过形参只能改变副本中实参传递过来的值,而无法改变实参变量的值。,这种调用方式的数据传递机制如下: 这种调用要求实参用地址值,形参用同类型的指针。在函数调用时,将用实参的地址值初始化形参的指针,即使形参

7、的指针指向实参的变量。,2传址调用方式,这种调用方式的特点如下: 由于传址调用的机制是用形参指针指向实参变量,因此很容易在被调用函数中通过指针来改变调用函数的实参值。 见书中例5.5。,引用调用方式数据传递的机制如下: 引用调用要求函数的实参用变量名或对象名,形参是引用名,用变量名对形参引用进行初始化。在引用调用中,不拷贝实参的副本。实际上只传递地址,使形参变成了实参的引用。 引用调用具有如下特点: 引用调用可以在被调用函数中通过改变 形参引用的值来改变调用函数中的实参值。 见书中例5.6。,5.3.2 函数的引用调用,函数的嵌套调用是指当一个函数调用另一个函数时,被调用函数又再调用其他函数。

8、 见书中例5.7,例5.8。,5.3.3 函数的嵌套调用,5.4 指针和引用作函数参数和返回值,5.4.1 指针作函数参数和返回值,1指针作函数参数,指针作函数参数实现传址调用,实参用地址值,形参用指针,具有较高的传递效率。 见书中例5.9。,指针作函数的返回值,该函数被称为指针函数。 见书中例5.10。,2指针可以作函数的返回值,1引用作函数参数,5.4.2 引用作函数参数和返回值,引用作函数参数称为引用调用,它具有与传址调用相同的特点。 见书中例5.11。,引用作函数的类型时,该函数返回的是某个变量或对象的引用,而不是数据值。 见书中例5.12。,2引用可以作函数的返回值,5.5 重载函数

9、和内联函数,在C+语言中,引进了重载函数,允许同一个函数名对应着不同的实现。以求绝对值为例, 3个求绝对值的函数起一个名字abs。 int abs(int); long abs(long); double abs (double);,1重载函数的概念,5.5.1 重载函数,编译选择原则如下。 重载函数至少要在函数的参数类型、参数个数和参数顺序上有所不同。根据重载函数的参数类型、参数个数和参数顺序的不同进行选择。 重载函数选择是按下述先后顺序查找的,将实参类型与所有被调用的重载函数的形参类型一一比较。,2重载函数的选择规则,先查找的是严格匹配的; 再查找通过类型转换可以匹配的; 最后是通过用户的

10、强制类型转换达到匹配的。,使用重载函数时应注意以下事项。 不允许使用typedef语句定义的类型名来区分重载函数的参数。 定义重载函数时,要注意同名函数应具有相同的功能。 重载函数中的形参如果设置了默认值,则会影响重载函数的选择。 见书中例5.13,例5.14。,1内联函数的概念,5.5.2 内联函数,在程序编译时,系统将程序中出现的内联函数调用表达式用该内联函数的函数体进行替换。这样处理虽然会增加目标代码,但是避免了因函数调用而产生的额外开销。,定义内联函数的方法很简单,即在函数头前面加关键字inline,其他与一般函数相同。 使用内联函数应注意如下事项。 内联函数的函数体内不允许出现循环语

11、句和开关语句等大语句。如果内联函数的函数体内含有这些语句时,系统将它按普通函数处理。,2内联函数的定义方法, 内联函数的函数体不宜过大,通常以15行为宜。过大会增加源程序的代码量。 在类结构中,在类体内定义的成员函数都是内联函数。 见书中例5.15。,5.6 函数的存储类,外部函数的作用域是整个程序,包含该程序的所有文件。 外部函数的定义格式如下: extern () 见书中例5.16。,5.6.1 外部函数,内部函数的作用域是定义在该函数的文件内。在程序的一个文件中定义的内部函数只能在该文件中调用,在该程序的其他文件中是不能调用的。,5.6.2 内部函数,内部函数的定义格式如下: static () 见书中例5.17。,作业题和上机练习题,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号