C++程序设计(第3版)第4章 利用函数实现指定的功能谭浩强 编著_第1页
C++程序设计(第3版)第4章 利用函数实现指定的功能谭浩强 编著_第2页
C++程序设计(第3版)第4章 利用函数实现指定的功能谭浩强 编著_第3页
C++程序设计(第3版)第4章 利用函数实现指定的功能谭浩强 编著_第4页
C++程序设计(第3版)第4章 利用函数实现指定的功能谭浩强 编著_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+ 程序设计程序设计第2篇 基于过程的程序设计第4章 利用函数实现指定的功能铜陵学院 汪永生目录4.1 什么是函数4.2 定义函数的一般形式4.3 函数参数和函数的值4.4 函数的调用4.5 函数的嵌套调用4.6 函数的递归调用4.7 内置函数4.8 函数的重载4.9 函数模板4.10 有默认参数的函数4.11 局部变量和全局变量4.12 变量的存储类别4.13 变量属性小结4.14 关于变量的声明和定义4.15 内部函数和外部函数4.16 头文件第4章 利用函数实现指定的功能 4.1什么是函数4.1.1 为什么需要函数4.1.2 函数调用举例一个过程化的程序中函数调用的示意图。mainad

2、cbfeghchgi第4章 利用函数实现指定的功能 4.1什么是函数4.1.2 函数调用举例例例4.1 4.1 编写程序输出如下结果。* Welcome to C+!*第4章 利用函数实现指定的功能 4.1什么是函数4.1.3 函数的分类函数系统函数(库函数)自定义函数无参数函数有参数函数第4章 利用函数实现指定的功能 4.2 定义函数的一般形式4.2.1 定义无参函数的一般形式类型名 函数名(void) 声明部分 执行语句例如:void printstar()4.2.2 定义有参函数的一般形式类型名 函数名(形式参数表列) 声明部分 执行语句例如:第4章 利用函数实现指定的功能 4.3 函数

3、参数和函数的值4.3.1 形式参数和实际参数形式参数:在定义函数时函数名后面括号中的变量名称。实际参数:在主调函数中调用一个函数时,函数名后面括号中的参数(或是一个表达式)例例4.2 4.2 求两个整数中的大者,用函数调用实现。第4章 利用函数实现指定的功能 4.3 函数参数和函数的值4.3.1 形式参数和实际参有关形参与实参的说明:有关形参与实参的说明:(1)形式未调用之前不占内存,调用时分配内存单元,调用结束释放所占内存单元;(2)实参可以是常量、变量或表达式;(3)定义函数时,必须在函数首部指定形参的类型;(4)实参与形参的类型应相同或赋值兼容;(5)实参变量对形参变量的数据传递是“值传

4、递”,即单向传递,实参传给形参,形参不能传回实参。第4章 利用函数实现指定的功能 4.3 函数参数和函数的值4.3.2 函数的返回值函数返回值:通过函数的调用使主调函数能得到一个确定的函数值。说说明:明:(1)函数的返回值是通过函数中的return语句获得的;(2)函数值的类型;如:(3)如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准,即函数类型判定返回值的类型;第4章 利用函数实现指定的功能 4.4 函数的调用4.4.1 函数调用的一般形式函数名(实参表列4.4.2 函数调用的方式函数调用方式函数语句如:printstar()函数表达式如:c=2*max(a,b)函数

5、参数如:=(,()第4章 利用函数实现指定的功能 4.4 函数的调用4.4.3 对被调用函数的声明和函数原型一个函数中调用另一函数具备条件:(1)被调函数必须已经存在的函数(库函数或者用户自定义函数)(2)库函数(#include )(3)自定义函数调用之前必须先声明函数声明: 在函数尚未定义的情况下,事先将该函数的有关信息通知编译系统,以便编译能正常进行。例例4.3 4.3 向计算机输入两个整数,用一个函数求出两数之和。第4章 利用函数实现指定的功能 4.4 函数的调用4.4.3 对被调用函数的声明和函数原型注注:对函数的定义和声明是有区别的。函数原型作用函数原型作用:根据函数原型在程序编译

6、阶段对调函数的合法性进行全面检查。函数原型一般形式函数原型一般形式:(1)函数类型 函数名(参数类型1,参数类型2);(2)函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2);说明:第4章 利用函数实现指定的功能 4.5 函数的嵌套调用C+不允许函数作嵌套定义,即一个函数中不能完整地包含另一个函数,在一个程序程序中每一个函数的定义都是平行和独立的。第4章 利用函数实现指定的功能 4.5 函数的嵌套调用图4.5表示的两层嵌套(加上main函数共3层)的执行过程:第4章 利用函数实现指定的功能 4.5 函数的嵌套调用例4.4 输入4个整数,找出其中最大的数。用一个函数来实现。第4章 利

7、用函数实现指定的功能 4.6 函数的递归调用函数的递归(recursive)调用: 在调用一个函数的过程中又出现直接或间接调用该函数本身。递归函数:包含递归调用的函数。例如:f()调用f()f2()f1()调用f2()调用f1()直接调用直接调用间间接调用接调用第4章 利用函数实现指定的功能 4.6 函数的递归调用例4.5第4章 利用函数实现指定的功能 4.6 函数的递归调用例4.5第4章 利用函数实现指定的功能 4.6 函数的递归调用例4.5第4章 利用函数实现指定的功能第4章 利用函数实现指定的功能 4.7 内置函数函数调用过程:函数调用过程:(1)程序先执行函数调用之前的语句;(2)流程

8、的控制转移到被调用函数的入口处,同时进行参数传递;(3)执行被调用函数中函数体的语句;(4)流程返回调用函数的下一条指令处,将函数返回值带回;(5)接着执行主调函数中未执行的语句。a函数函数调调用用a函数函数结束结束main函数函数12345a函数体语句函数体语句第4章 利用函数实现指定的功能 4.7 内置函数内置函数(inline fuction):C+系统编译时将所调用的代码直接嵌入到主调函数中,而不是将流程转出。指定内置函数方法:在函数首行的左端加inline例例4.7 4.7 函数指定为内置函数第4章 利用函数实现指定的功能 4.8 函数的重载函数重载(fuction overload

9、ing):C+允许用同一函数名定义多个函数,而这些函数的参数个数和参数类型可以不相同。例例4.8 4.8 求3个数中最大的数(分别考虑整数、长精度数、长整数的情况), 用函数重载的方法。第4章 利用函数实现指定的功能 4.8 函数的重载例例4.9 4.9 编写一个程序,用来求两个整数或3个整数中的最大者。如果输入两个整数,程序就输出这两个整数中的最大者,如果输入3个整数,程序则输出这3个整数中的最大者。注:注:函数重载时,参数个数、参数类型或参数顺序三者必须至少有一种不同。int f(int); 错误错误long f(int); 错误void f(int); 错误第4章 利用函数实现指定的功能

10、 4.9 函数模板函数模板(函数模板(function templatefunction template): :一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。例例4.10 4.10 将例4.9程序改为通过函数模板来实现。定义函数模板一般形式:template 通通用函数定义用函数定义或:template 通用函数定义通用函数定义适用于1.函数体相同;函数体相同;2.函数参数个数相同函数参数个数相同3.参数类型不同参数类型不同第4章 利用函数实现指定的功能 4.10 有默认参数的函数指定默认值的参数必须放在形参表列中的最右端,如:例4.11 求两个或3个正整数中的最大数

11、,用 带有默认参数的函数实现。 void f1(float a, int b=0,int c, char d=a);不正确不正确 void f2(float a, int c, int b=0,char d=a);正确注:注:(1)如果函数的定义在函数调用之前,则应在函数定义中给出默认值。(2)一个函数不能既作为重载函数,又作为有默认参数的函数。第4章 利用函数实现指定的功能 4.11 局部变量和全局变量4.11.1 局部变量 局部变量局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。第4章 利用函数实现指定的功能 4.11 局部

12、变量和全局变量4.11.2 全局变量 局部变量:局部变量:也在函数之外定义的变量。全局变量有效范围为从定义变量的位置开始到本源文件结束。如:变量作用域文件作用域函数作用域块作用域函数原型作用域全局局部第4章 利用函数实现指定的功能 4.12 变量的存储类别4.12.1 动态存储方式与静态存储方式 变量存储期:是指变量在内存中的存在周期。分为静态存储期静态存储期和动态存储期动态存储期。 静态存储方式:是指在程序运行期间,系统对变量分配固定的存储空间。 动态存储方式:在程序运行期间,系统对变量动态地分配存储空间。 变量存储类别:自动的(auto)、静态的(static)、寄存器的(register

13、)、外部的(extern)。变量存储方式静态存储方式全局变量动态存储方式函数形式参数函数中定义的变量(未加static)函数调用现场保护和返回地址等第4章 利用函数实现指定的功能 4.12 变量的存储类别4.12.2 自动变量 在函数内部用关键字auto对定义变量作存储类别的声明,系统默认声明变量为自动变量,关键字auto可不写。4.12.3 用static声明静态局部变量 静态局部变量:函数中的局部变量的值在函数调用结束后不消失而保留原来值,即其所占用的存储空间单元不释放,在下一次该函数调用时,该变量保留上一次调用结束时的值。说明:说明:(1)静态局部变量在静态存储区内分配存储单元。(2)对

14、静态局部变量在编译时赋初值。(3)不赋值时,编译时自动对静态局部变量赋初值0或空字符。(4)对其他函数是“不可见”。第4章 利用函数实现指定的功能 4.12 变量的存储类别4.12.4 用register声明寄存器变量 C+允许将局部变量的值放在CPU的寄存器中,需要时直接从寄存器取出参与运算,不必再到内存中去存取。用关键字register作声明。4.12.5 用extern声明外部变量1.在一个文件内声明全局变量 如果外部变量不在文件的开头定义,其有效作用范围只限于定义的位置起到文件终了的位置止。例例4.14 4.14 用extern对外部变量作提前引用声明,以扩展程序文件中的作用域。第4章

15、 利用函数实现指定的功能 4.12 变量的存储类别4.12.5 用extern声明外部变量2.在多文件的程序中声明外部变量 使用方法:在任一文件中定义外部变量,而在其他文件中用extern作外部变量声明。4.12.6 用static声明静态外部变量作用:外部变量只限于被本文件引用,而不能被其他文件引用。第4章 利用函数实现指定的功能 4.13 变量属性小结变量属性存储类别autostaticregisterextern作用域局部变量自动变量局部变量寄存器变量形式参数全局变量静态外部变量外部变量存储期动态存储自动变量寄存器变量形式参数静态存储静态局部变量静态外部变量外部变量第4章 利用函数实现指

16、定的功能 4.13 变量属性小结变量可见性:如果一个变量在某个文件或函数范围内是有效的,则称该文件或函数为该变量的作用域,在此作用域内可以引用该变量,所以又称变量在此作用域“可见”。变量存在性:如果一个变量值在某一时刻是存在的,则认为这一时刻属于变量的存储期,或称该变量在此时刻“存在”。变量存储类别变量存储类别函数内函数内函数外函数外作用域(可见性)作用域(可见性)存在性存在性作用域(可见性)作用域(可见性)存在性存在性自动变量和寄存器变量静态局部变量静态外部变量(只限本文件)外部变量表4.2 变量的作用域和存在性第4章 利用函数实现指定的功能 4.14 关于变量的声明和定义(1)函数的声明是

17、函数的原型,函数的定义是函数功能的确立。(2)建立存储空间的声明称为定义;不需要建立存储空间的声明称为声明。(3)外部变量定义只能定义一次,它的位置在所有函数之,而同一文件中的外部变量的声明可以有多次,位置函数里或函数外。(4)用static来声明一个变量的作用:对局部变量用static声明,使该变量在本函数调用结束后不释放,整个程序执行期间始终存在,使其存储期为程序的全过程;全局变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)(5)用auto,register,static声明变量时,是在定义变量的基础上加上这些关键字,而不能单独使用。第4章 利用函数实现指定的功能 4.15 内部函数和外部函数4.15.1 内部函数 内部函数内部函数:又称静态函数,即一个函数只能被本文件中其他函数所调用的函数。 内部函数一般格式为: static 类型标识符 函数名(形参表)4.15.2 外部函数(1)外部函数外部函数:在定义函数时,如果在函数首部的最左端以关键字extern,则表示此函数是外部函数,可供其他文件调用。(2)在需要调用此函数的文件中,用extern声明所用的函数是外部函数。例例 4.15 4.15 输入两个整数,要求输出其中的大者。用外部函数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论