C++函数详解与应用实例.ppt
《C++函数详解与应用实例.ppt》由会员分享,可在线阅读,更多相关《C++函数详解与应用实例.ppt(99页珍藏版)》请在咨信网上搜索。
1、 在结构化程序设计中,函数是将任务进行模块划分的基本单位。一个函数实现一项功能。在面向对象程序设计中,函数是对数据的一项操作,也是实现一项功能。第三章第三章 函数函数 要掌握函数的使用,必须理解函数调用时的内部实现机制,以及与此相关的内存分配机制、变量生命期和作用域。本章还将介绍关于函数重载的概念,介绍递归算法、内联函数、默认参数函数以及多文件组织、编译预处理、工程文件的概念和运行库函数。第三章第三章 函数函数 3.1 函数的定义与调用 3.5 作用域与标识符的可见性 3.4 函数调用机制 3.3 全局变量和局部变量 3.2 函数的参数传递,返回值及函数声明 3.10 编译预处理 3.9 头文
2、件与多文件结构 3.6 存储类型与标识符的生命期 3.8 函数的一些高级议题 3.7 函数的递归调用 3.1 函数的定义与调用函数的定义与调用3.1.1 函数概述3.1.2 函数的定义3.1.3 函数的调用 3.1.1 函数概述函数概述函数是C+程序的基本组成模块。通过函数,可以把一个复杂任务分解成为若干个易于解决的小任务。充分体现逐步细化的设计思想。组 成 C+程 序 的 若 干 函 数 中,有 一 个 称 为main()(Winmain())函数,是程序执行的入口,它可以调用其他函数,但不可以被调用。而其他一般函数既可以调用也可以被调用。函数概念的引入:入口函数:3.1.1 函数概述函数概
3、述main()fun2()fun1()fun3()funa()funb()func()图3.1 函数调用层次关系3.1.1 函数概述3.1.1结束库函数和自定义函数:库函数或标准函数,是由编译系统预定义的,如一些常用的数学计算函数、字符串处理函数、图形处理函数、标准输入输出函数等。库函数都按功能分类,集中说明在不同的头文件中。用户只需在自己的程序中包含某个头文件,就可直接使用该文件中定义的函数。用户根据需要将某个具有相对独立功能的程序定义为函数,称自定义函数。3.1.2 函数的定义函数的定义无参函数定义格式为:数据类型函数名(void)函数体说明:数据类型指函数返回值类型,可以是任一种数据类型
4、,默认为返回整型值(但新标准要求写明,不用默认方式)。没有返回值应将返回值类型定义为void。函数名采用合法标识符表示。对无参函数,参数括号中的void通常省略,但括号不能省略。函数体由一系列语句组成。函数体可以为空,称为空函数。1 无参函数3.1.2 函数的定义函数的定义/打印一个表头void TableHead()cout*endl;cout*example *endl;cout*endl;int input()/输入满足要求的数据int n;cout输入一个大于5的整数:n;while(n=b?a:b);有参函数的参数表中列出所有形式参数的类型和参数名称。各参数即使类型相同也必须分别加以
5、说明。形式参数简称形参,只能是变量名,不允许是常量或表达式。void delay(long n)int i;for(i=0;ichoice;while(choice=4);switch(choice)case 1:account_report();break;case 2:engineering_report();break;case 3:marketing_report();break;return 0;void menu_print()cout”系统功能:”endl;cout”1财务报表”endl;cout”2工程报表”endl;cout”3市场报表”endl;cout”选择业务序号:”;
6、void account_report()/生成财务报表void engineering_report()/生成工程报表 void marketing_report()/生成市场报表;3.2.3 函数声明函数声明【例3.4】输出所有满足下列条件的正整数m:10m1000且m、m2、m3均为回文数。分析:回文指左右对称的序列。如121、353等就是回文数。判断整数是否回文数用函数实现,其思想是将该数各位拆开后反向组成新的整数,如果该整数与原数相等则为回文数。m m*m m*m*m11 121 1331101 10201 1030301111 12321 1367631 运行结果:3.3 全局变量
7、和局部变量全局变量和局部变量3 33 31 1 变量的存储机制与变量的存储机制与C+C+的内存布局的内存布局 3 33 32 2 全局变量全局变量 3 33 33 3 局部变量局部变量 3.3.1 变量的存储机制与变量的存储机制与C+的内存布局的内存布局自由存储区(动态数据)操作系统为一个C+程序的运行所分配的内存分为四个区域,如图3.3 所示:栈区(函数局部数据)全局数据区(全局、静态)代码区(程序代码)(main()函数局部数据)自由存储区(动态数据)存储区域说明:(1)代码区(Code area):存放程序代码,即程序中各个函数的代码块;(2)全局数据区(Data area):存放全局数
8、据和静态数据;分配该区时内存全部清零,结果变量的所有字节等效初始化为全。(3)栈区(Stack area):存放局部变量,如函数中的变量等;分配栈区时不处理内存,即变量取随机值。(4)自由存储区(Free store area):存放与指针相关的动态数据。分配自由存储区时不处理内存。参见第七章。3.3.1 变量的存储机制与C+的内存布局 3.3.2 全局变量全局变量 在所有函数之外定义的变量称为全局变量。全局变量存放在全局数据区,因编译器自动将该区清为全0,如果用户在定义时不显式给出初始化值,则等效初始化为全0。全局变量可定义在程序开头,也可定义在中间位置,该全局变量在定义处之后的任何位置都是
9、可以访问的,称为可见的。【例3.5】多个函数使用全局变量的例子。全局变量引入:3.3.3 局部变量 定义在函数内或块内的变量称为局部变量。程序中使用的绝大多数变量都是局部变量。局部变量在程序运行到它所在的块时建立在栈中,该块执行完毕局部变量占有的空间即被释放。故亦称为自动变量。局部变量在定义时可加修饰词auto,但通常省略。局部变量在定义时若未初始化,其值为随机数。局部变量引入:【例3.6】使用局部变量的例子。3.4 函数调用机制 局部变量占用的内存是在程序执行过程中“动态”地建立和释放的。这种“动态”是通过栈由系统自动管理进行的。(1)建立栈空间;(6)恢复现场:取主调函数运行状态及返回地址
10、,释放栈空间;(7)继续主调函数后续语句。(5)释放被调函数中局部变量占用的栈空间;(4)执行被调函数函数体;(3)为被调函数中的局部变量分配空间,完成参数传递;(2)保护现场:主调函数运行状态和返回地址入栈;调用过程:3.4 函数调用机制函数调用机制 void fun1(int,int);void fun2(float);int main()int x=1;y=2;fun1(x,y);return o;void fun1(int a,int b)float x=3;fun2(x);void fun2(float y)int x;x栈顶栈顶栈底栈底y3fun2()fun1()运行状态及返回地址
11、运行状态及返回地址x3b2a1fun1()main()运行状态及返回地址运行状态及返回地址y2x1main()操作系统运行状态及返回地址操作系统运行状态及返回地址此图例说明在程序执行过程中怎样通过栈“动态”地建立和释放局部变量占用的内存的 3.5 作用域与标识符的可见性作用域与标识符的可见性3 文件域 2 函数声明域 作用域:指标识符能够被使用的范围。只有在作用域内标识符才可以被访问(称为可见)。本节重点讨论局部域和文件域(全局域),其中局部域包括块域和函数声明域。任何标识符作用域的起始点均为标识符说明处。下面分别介绍:1 块域 函数中定义的标识符,包括形参和函数体中定义的局部变量,作用域都在
12、该函数内,也称作函数域。1.块域块指一对大括号括起来的程序段。块中定义的标识符,作用域在块内。复合语句是一个块。函数也是一个块。复合语句中定义的标识符,作用域仅在该复合语句中。【例3.7】输入两数,按从大到小的顺序保存。块的引入:1.块域块域由VC+运行,结果如下:输入两整数:3 5调用前:实参a=3,b=5调用中交换前:形参a=3,b=5交换后:形参a=5,b=3调用后:实参a=3,b=5 交换失败局部变量具有局部作用域使得程序在不同块中可以使用同名变量。这些同名变量各自在自己的作用域中可见,在其它地方不可见。【例3.8】设计函数完成两数交换,用主函数进行测试。操作系统运行状态及返回地址ma
13、in()3a5bmain()运行状态及返回地址swap()3a5b3t351.块域块域 对于块中嵌套其它块的情况,如果嵌套块中有同名局部变量,服从局部优先原则,即在内层块中屏蔽外层块中的同名变量,换句话说,内层块中局部变量的作用域为内层块;外层块中局部变量的作用域为外层除去包含同名变量的内层块部分。如果块内定义的局部变量与全局变量同名,块内仍然局部变量优先,但与块作用域不同的是,在块内可以通过域运算符“:”访问同名的全局变量。【例3.9】显示同名变量可见性。2函数声明域函数声明域 函数声明不是定义函数,在作函数声明时,其中的形参作用域只在声明中,即作用域结束于右括号。正是由于形参不能被程序的其
14、他地方引用,所以通常只要声明形参个数和类型,形参名可省略。3 3 文件域文件域 文件域也称全局域。定义在所有函数之外的标识符作用域为从定义处到整个源文件结束,即文件域。文件中定义的全局变量和函数的作用域为文件域。如果某个文件中说明了作用域为文件域的标识符,该文件又被另一个文件包含,则该标识符的作用域延伸到新的文件中。如cin和cout是在头文件iostream中说明的具有文件作用域的标识符,它们的作用域也延伸到嵌入iostream的文件中。存储类型(storage class)决定标识符的存储区域,即编译系统在不同区域为不同存储类型的标识符分配空间。由于存储区域不同,标识符的生命期也不同。所谓
15、生命期,指的是标识符从获得空间到空间释放之间的期间,标识符只有在生存期中、并且在其自己的作用域中才能被访问。3.6 存储类型与标识符的生命期 3.6.1 3.6.1 存储类型存储类型 3.3.3.2 3.2 生命期生命期 自动变量为用auto说明的变量,通常auto缺省。局部变量都是自动变量,生命期开始于块的执行,结束于块的结束,其原因是自动变量的空间分配在栈中,块开始执行时系统自动分配空间,块执行结束时系统自动释放空间。故自动变量的生命期和作用域是一致的。3.6.1 存储类型 为提高程序运行效率,可以将某些变量保存在寄存器中,即用register说明为寄存器变量,但不提倡使用。C+中关于存储
16、类型的说明符(storage class specifier)有四个:auto、register、static和extern。其中用auto和register修饰的称为自动存储类型,用static修饰的称为静态存储类型,用extern修饰的称为外部存储类型。1 自动存储类型static说明的变量称为静态变量。根据定义的位置不同,还分为局部静态变量和全局静态变量,也称内部静态变量和外部静态变量。静态变量均存储在全局数据区,如果程序未显式给出初始化值,则等效初始化为全0;静态变量占有的空间要到整个程序执行结束才释放,故静态变量具有整个程序执行期间的生命期。3.6.1 存储类型局部静态变量是定义在块
17、中的静态变量,编译系统在全局数据区为其开辟空间并保存数据,该空间一直到整个程序结束才释放。局部静态变量具有局部作用域,但却具有整个程序执行期间的生命期。如果显式给出初始化值,则在该块第一次执行时完成,且只进行一次。2 2 静态存储类型静态存储类型【例3.10】自动变量与局部静态变量的区别3.6.1 存储类型存储类型3 3 外部存储类型外部存储类型一个C+程序可以由多个源程序文件组成。多文件程序系统可以通过外部存储类型的变量和函数来共享某些数据和操作。在一个程序文件中定义的全局变量和函数缺省为外部的,即其作用域可以延伸到程序的其他文件中。其他文件如果要使用这个文件中定义的全局变量和函数,应该在使
18、用前用“extern”作外部声明。外部声明通常放在文件的开头(函数总是省略extern)。外部变量声明不同于全局变量定义,变量定义时编译器为其分配存储空间,而变量声明则表示该全局变量已在其他地方定义过,编译系统不再分配存储空间。外部的全局变量或函数加上static修饰,就成为静态全局变量或静态函数。静态的全局变量和函数作用域限制在本文件,其他文件即使使用外部声明也无法使用该全局变量或函数。【例3.11】外部存储类型的例子3.6.2 生命期生命期1.静态生命期 静态生命期(Static extent或Static storage duration)指的是标识符从程序开始运行时就存在,具有存储空间
19、,到程序运行结束时消亡,释放存储空间。具有静态生命期的标识符存放在全局数据区,如全局变量、静态全局变量、静态局部变量。具有静态生命期的标识符在未被用户初始化的情况下,系统会等效将其初始化为全0。函数驻留在代码区,也具有静态生命期。所有具有文件作用域的标识符都具有静态生命期。3.6.2 生命期生命期2.2.局部生命期局部生命期 在函数内部或块中定义的标识符具有局部生命期(Automatic extent或Automatic storage duration),其生命期开始于执行到该函数或块的标识符定义处,结束于该函数或块的结束处。具有局部生命期的标识符存放在栈区。具有局部生命期的标识符如果未被初
20、始化,其内容是随机的,不可引用。具有局部生命期的标识符必定具有局部作用域;但反之不然,静态局部变量具有局部作用域,但却具有静态生命期。3.6.2 生命期生命期具有动态生命期(dynamic extent或dynamic storage duration)的标识符存放在自由存储区,由特定的函数调用或运算来创建和释放,如用new运算符(或调用malloc()函数)为变量分配存储空间时,变量的生命期开始,而用delete运算符(或调用free()函数)释放空间或程序结束时,变量生命期结束。关于new运算符和delete运算符将在第七章中介绍。3.动态生命期3.7 函数的递归调用函数的递归调用 递归是
21、一种描述问题的方法,或称算法。递归的思想可以简单地描述为“自己调用自己”。例如用如下方法定义阶乘:可以看出是用阶乘定义阶乘,这种自己定义自己的方法称为递归定义。递归的引入:递归的分类在函数调用中,有这样两种情况,一种是在函数A的定义中有调用函数A的语句,即自己调用自己;另一种是函数A的定义中出现调用函数B的语句,而函数B的定义中也出现调用函数A的语句,即相互调用。前者称直接递归,后者称间接递归。本节只介绍直接递归。递归定义的阶乘函数:fac(int n)int y;if(n=0|n=1)y=1;else y=n*fac(n-1);return y;只要设计主函数调用阶乘函数,即可实现计算阶乘。
22、递归函数必须定义递归终止条件(Stopping condition),避免无穷递归(Infinite Recursion)。3.7 函数的递归调用【例3.12】求4!运行结果:4 3 2 1 1 2 6 244!=243.7 函数的递归调用函数的递归调用探讨:探讨:计算是先右后左。请看下一条输出语句:计算是先右后左。请看下一条输出语句:coutn4!=fac(4)n3!=fac(3)endl;先算先算fac(3),后算后算fac(4),先右后左。但输出还是从左到右:先右后左。但输出还是从左到右:3 211264321126244!=243!=6说明:coutn4!=fac(4)endl;执行时
23、是先算函数值,然后再从左到右输出各表达式的值。所以有两行输出,而不是第一行插在第二行赋值号与24之间。3.7 函数的递归调用递归过程的分析:递归函数的执行分为“递推”和“回归”两个过程,这两个过程由递归终止条件控制,即逐层递推,直至递归终止条件,然后逐层回归。每次调用发生时都首先判断递归终止条件。递归调用同普通的函数调用一样,每当调用发生时,在栈中分配单元保存返回地址以及参数和局部变量;而与普通的函数调用不同的是,由于递推的过程是一个逐层调用的过程,因此存在一个逐层连续的参数入栈过程,直至遇到递归终止条件时,才开始回归,这时才逐层释放栈空间,返回到上一层,直至最后返回到主调函数。3.7 函数的
24、递归调用现场与返回地址第一层fac(4)域4n4*624y现场与返回地址第二层fac(3)域3n3*26y现场与返回地址第三层fac(2)域2n2*12y现场与返回地址第四层fac(1)域ny11126fac(4)返回值=24main()域注意:右图中存“fac(1)返回值”等的存储单元是无名临时局部变量,其生命期在表达式y=n*fac(n-1)中。因为被调函数的返回语句格式为:return 表达式;为返回表达式的值,必须有一个无名临时局部变量来承载这个值。然后由主调函数中包含调用的表达式语句从该临时变量中取得值,表达式语句执行后该临时变量撤销。243.7 函数的递归调用函数的递归调用从以上几
25、例可以看出,递归算法一般不需要借助循环,但通过不断递推和回归的过程实现了其他算法用循环完成的功能。因此,递归的终止条件非常重要,否则将会无休止地递归下去,陷入死循环状态。【例3.14】输入一个整数,用递归算法将整数倒序输出【例3.13】汉诺塔问题3.7 函数的递归调用函数的递归调用【例例3.13】【例3.13】汉诺塔问题。有A、B、C三根柱子,A柱上有n个大小不等的盘子,大盘在下,小盘在上。要求将所有盘子由A柱搬动到C柱上,每次只能搬动一个盘子,搬动过程中可以借助任何一根柱子,但必须满足大盘在下,小盘在上。打印出搬动的步骤。A柱B柱C柱分析:1 A柱只有一个盘子的情况:A柱C柱;2 A柱有两个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 函数 详解 应用 实例
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【胜****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【胜****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。