第三章函数.ppt
《第三章函数.ppt》由会员分享,可在线阅读,更多相关《第三章函数.ppt(103页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第第第3 3章章章章 函数函数函数函数C+程序设计本小节内容本小节内容3.1函数的定义与使用函数的定义与使用3.2函数调用机制函数调用机制3.3递归函数递归函数3.4默认参数的函数默认参数的函数3.5函数重载函数重载3.6函数模板函数模板C+程序设计程序设计3.1函数的定义函数的定义v在编辑一个大型程序时,即使各个函数的前在编辑一个大型程序时,即使各个函数的前后顺序不同,后顺序不同,程序执行的开始点永远是主函数。程序执行的开始点永远是主函数。主函数按照调用与被调用关系调用子函数。子函主函数按照调用与被调用关系调用子函数。子函数如果与其它子函数又存在调用与被调用关系,数如果与其它子函数又存在调
2、用与被调用关系,当然还可以再调用其它子函数。当然还可以再调用其它子函数。C+程序设计程序设计3.1函数的定义函数的定义v函数是面向对象程序设计中的基本抽象单元函数是面向对象程序设计中的基本抽象单元,v是对功能的抽象。是对功能的抽象。C+程序设计程序设计3.1函数的定义与使用函数的定义与使用3.2函数调用机制函数调用机制3.3递归函数递归函数3.4默认参数的函数默认参数的函数3.5函数重载函数重载3.6函数模板函数模板3.7变量作用域变量作用域C+程序设计程序设计3.1函数的定义函数的定义主函数主函数main()调用函数调用函数 func1调用函数调用函数 func2 函数函数func2()()
3、函数函数 func1()函数函数 func2()C+程序设计程序设计v在在一一对对调调用用与与被被调调用用关关系系中中,我我们们把把调调用用其其它它函函数数的的函函数数称称为为主主调调函函数数,被被其其它它函函数数调调用用的的函函数数称称为为被被调调函函数数。在在一一个个较较为为复复杂杂的的大大型型程程序序中中,一一个个函函数数很很可可能能同同时时扮扮演演两两种种不不同同的的角角色色主主调调函函数数与与被被调调函函数数,即即既既调调用用别别的的函函数数(被被调调函函数数)又又被被另另外外的的函函数数(主主调调函函数数)调调用用。函函数数一一般般应应遵遵守守先先定定义义后后调调用用的的原则,否则
4、应在调用函数中先进行原形说明。原则,否则应在调用函数中先进行原形说明。C+程序设计程序设计一、函数的定义一、函数的定义v一一个个完完整整的的函函数数定定义义由由两两部部分分组组成成,即即函数头与函数体。函数头与函数体。v1.函数定义的一般语法形式函数定义的一般语法形式v(形形式参数表式参数表)vv说明性语句序列;说明性语句序列;v实现函数功能的语句系列;实现函数功能的语句系列;v函数头函数体C+程序设计程序设计v函函数数头头是是指指上上述述格格式式中中的的(形形式式参参数数表表)。其其中中函函数数名名可可由由函函数数设设计计者者命命名名,可可以以是是任任何何一一个个不不重重复复的的合合法法的的
5、标标识识符符(唯唯一一的的例例外外是是,主主函函数数必必须命名为须命名为main)。)。v函函数数体体是是指指上上述述格格式式中中被被一一对对大大括括号号括括起起的的复复合合语语句句部部分分。该该函函数数所所应应实实现现的的功功能能由由相相应的复合语句完成。应的复合语句完成。C+程序设计程序设计2、形式参数表、形式参数表 name1,name2,.,namen3、函数的返回值、函数的返回值由由 return 语句语句给出,例如:给出,例如:return 0无返回值的函数(无返回值的函数(void类型类型),不),不必写必写return语句。语句。C+程序设计程序设计v函函数数在在没没有有被被调
6、调用用的的时时候候其其形形参参只只是是一一个个符符号号,它它标标志志着着在在形形参参出出现现的的位位置置应应该该有有一一个个什什么么类类型型的的数数据据。函函数数在在被被调调用用时时才才由由主主调调函函数数将将实实际际参参数数(简简称称实实参参)赋赋予予形形参参。从从这这一一点点上上说说,C+中中的的函函数数与与数数学学中中的的函函数数概概念念极极其其相相似似。例例如如,我我们们都都熟熟悉悉的的如如下下数数学学中中的的函数形式:函数形式:vf(x)=3x+5x-2v这这个个函函数数只只有有当当自自变变量量x被被赋赋以以确确定定的的值值以后,才能计算出函数的值。以后,才能计算出函数的值。C+程序
7、设计程序设计v二、二、函数的调用函数的调用v如如果果没没有有遵遵守守先先定定义义后后调调用用的的原原则则,调调用用函函数数之之前前先先要要在在主主调调函函数数中中声声明明函函数数原原型型。在在主主调调函函数数中中,或或所所有有函函数数之之前前,按按如如下下形形式式进进行行函函数数原型声明:原型声明:v(含类型说明的形参表含类型说明的形参表);函数原型声明C+程序设计程序设计v如如果果是是在在所所有有函函数数之之前前声声明明了了函函数数原原型型,那那么么该该函函数数原原型型在在本本程程序序文文件件中中任任何何地地方方都都有有效效,也也就就是是说说,在在本本程程序序文文件件中中任任何何地地方方都都
8、可可以以依依照照该该原原型型调调用用相相应应的的函函数数。如如果果是是在在某某个个主主调调函函数数内内部部声声明明了了被被调调函函数数原原型型,那那么么该该原原型型就就只只能能在在这这个个函函数数内内部部有有效。效。v声声明明了了函函数数原原型型之之后后,便便可可以以按如下形式调用子函数:按如下形式调用子函数:v(实实参参1,实实参参2,实参实参n)调用函数C+程序设计程序设计v实实参参列列表表中中应应给给出出与与函函数数原原型型中中形形参参个个数数相相同同、类类型型相相符符的的实实参参,每每个个实实参参都都可可以以是是常常量量、变变量量或或表表达达式式三三者者之之一一。实实参参与与实实参参之
9、之间间用用逗逗号号作作为为分分隔隔符符。注注意意,这这里里的的逗逗号号不不是是顺顺序序求求值值运运算算符符。函函数数调调用用可可以以作作为为一一条条语语句句,这这时时函函数数可可以以没没有有返返回回值值。函函数数调调用用也也可可以以出出现现在在表表达达式式中中,这这时时就就必必须须有有一一个个明明确确的的返返回回值。函数调用示例如下。值。函数调用示例如下。C+程序设计程序设计【例例1】编写一个编写一个n!的函数,并调用。!的函数,并调用。(1)n!的函数!的函数vlongfac(intn)vvinti,jc=1;vif(n0)vvcoutn不能小于不能小于0endl;vreturn-1;vvf
10、or(i=1;i=n;i+)vjc*=i;vreturnjc;vC+程序设计程序设计(2)函数调用)函数调用v#includevlongfac(intn);/原型说明语句原型说明语句vvoidmain()vvinta;vcout请输入请输入a的值:的值:a;vcouta!=fac(a)endl;vC+程序设计程序设计v【例例2】求任意两个数的最大值的函数及其调用。求任意两个数的最大值的函数及其调用。v#includevintmax(intx,inty);vvoidmain()vvvinta,b,c;vcout请输入请输入a、b、c的值:的值:abc;vcout“a、b、c最大值是最大值是max
11、(max(a,b),c)endl;vvintmax(intx,inty)vvif(xy)returny;velsereturnx;vC+程序设计程序设计v【例例3】编编写写一一个个函函数数,把把华华氏氏温温度度转转换换为为摄摄氏氏温温度度,公公式式为为C=(F-32)*5/9,公公式式中中F代代表表华华氏氏温温度度,C代代表表摄摄氏氏温温度度。在在主主函函数数中中提提示示用用户户输输入入一一个个华华氏氏温温度,并完成输入及输出,由函数完成转化功能。度,并完成输入及输出,由函数完成转化功能。v程序代码如下:程序代码如下:v#includevfloathstoss(floatfHuashi);/原
12、型说明原型说明vvoidmain()C+程序设计程序设计vfloatfHuashi;vcoutendlfHuashi;vcout华氏华氏fHuashiv度度对对应应摄摄氏氏温温度度hstoss(fHuashi)度度endl;v/函数调用作为一个表达式出现在输出语句中函数调用作为一个表达式出现在输出语句中vvfloathstoss(floatfHuashi)vvfloatfSheshi;vfSheshi=(fHuashi-32)*5/9;C+程序设计程序设计vreturn(fSheshi);vv程序运行结果为程序运行结果为v输入一个华氏温度值:输入一个华氏温度值:68v华氏华氏68度对应摄氏度对
13、应摄氏20度度C+程序设计程序设计函函数数的的参参数数用用于于在在调调用用函函数数与与被被调调用用函函数数之之间间进进行行数数据据传传递递。在在函函数数定定义义时时,函函数数名名后后面面括括号号内内的的参参数数称称为为形形式式参参数数(简简称称形形参参)。在在函函数数被被调调用用时时,函函数数名名后后面面括括号号内内的的参数称为实际参数参数称为实际参数(简称简称实参实参)。三、三、函数的参数传递函数的参数传递C+程序设计程序设计v当当函函数数未未被被调调用用时时,C+编编译译系系统统并并没没有有给给函函数数的的形形参参分分配配相相应应的的内内存存空空间间,函函数数的的形形参参更更不不会会有有实
14、实际际的的值值。只只有有在在函函数数被被调调用用时时,C+编编译译系系统统这这时时才才为为形形参参分分配配实实际际的的存存储储单单元元,并并将将实实参参与与形形参参结结合合。实实参参可可以以是是常常量量、变变量量或或表表达达式式,其其类类型型必必须须与与形形参参相相符符。函函数数的的参参数数传传递递,指指的的就就是是形形参参与与实实参参结结合合(简简称称形形实实结结合合)的的过过程程。形形实实结结合合的的方方式式有有值值调调用用和引用调用两种。和引用调用两种。三、三、函数的参数传递函数的参数传递C+程序设计程序设计v值值调调用用是是指指当当发发生生函函数数调调用用时时,编编译译系系统统为为形形
15、参参分分配配相相应应的的存存储储空空间间并并且且直直接接将将实实参参的的值值复复制制给给形形参参,这这样样形形参参和和实实参参就就各各自自拥拥有有不不同同的的存存储储单单元元,且且形形参参是是实实参参的的副副本本。因因此此,值值调调用用过过程程是是参参数数值值的的单单向向传传递递过过程程,一一旦旦形形参参获获得得了了与与实实参参相相同同的的值值就就与与实实参参脱脱离离关关系系,以以后后不不论论形形参参发发生生多多大大的的改改变变,都都决决不不会会反反过过来影响到实参。来影响到实参。1.值调用值调用C+程序设计程序设计v【例例4】从从键键盘盘输输入入两两个个整整数数,交交换换位位置置后后输输出出
16、(交换未成功)。(交换未成功)。v#includevvoidswap(inta,intb);vvoidmain()vvintx,y;vx=5;vy=10;1.值调用值调用C+程序设计程序设计vcoutx=xy=yendl;vswap(x,y);/交换交换x,y的值的值vcoutafterswapendl;vcoutx=xy=yendl;vvvoidswap(inta,intb)vvintt;vt=a;va=b;vb=t;v1.值调用值调用C+程序设计程序设计v程序运行结果为程序运行结果为vx=5y=10vafterswapvx=5y=10v分分析析:从从上上面面的的程程序序运运行行结结果果可可
17、以以看看出出,并并没没有有达达到到交交换换的的目目的的。这这是是因因为为采采用用的的传传递递方方式式不不合合乎乎问问题题的的要要求求。在在单单向向值值传传递递方方式式中中,形形参参值值虽虽确确实实进进行行了了交交换换,但但这这些些改改变变对实参不起任何作用。对实参不起任何作用。1.值调用值调用C+程序设计程序设计v执执行行主主调调函函数数中中的的函函数数调调用用语语句句swap(x、y)后后,编编译译系系统统将将实实参参x中中的的值值5传传递递给给虚虚参参a,将将实实参参y中中的的值值10传传递递给给虚虚参参b;在在swap函函数数中中,a、b中中的的值值完完成成互互换换;返返回回主主函函数数
18、时时,实实参参x、y中中的的值值不不受受虚虚参参a、b的的影影响响,并并未未进行交换。进行交换。1.值调用值调用C+程序设计程序设计v显显而而易易见见,值值调调用用时时参参数数的的传传递递方方式式是是实实参参单单向向复复制制其其值值给给虚虚参参,如如果果我我们们想想使使子子函函数数中中对对形形参参所所做做的的任任何何更更改改也也能能及及时时反反映映给给主主函函数数中中的的实实参参(即即希希望望形形参参与与实实参参的的影影响响是是互互相相的的或或称称是是双双向向的的),又又该该怎怎么么办办呢呢?这这就就需需要要改改变变调调用用方方式式,即即采采用用第第二二种种参参数数传递方式传递方式引用调用引用
19、调用。v引用是一种特殊类型的变量,可以被认为是某一引用是一种特殊类型的变量,可以被认为是某一个变量的别名个变量的别名。通过引用名与通过被引用的变量名访。通过引用名与通过被引用的变量名访问变量的效果是一样的。这就是说,对形参的任何操问变量的效果是一样的。这就是说,对形参的任何操作也就直接作用于实参。作也就直接作用于实参。2.引用调用引用调用C+程序设计程序设计v例如:例如:vinta,b;vint&ra=a;/建建立立一一个个int型的引用型的引用ra,并将其初始化为变量并将其初始化为变量a的一个别名的一个别名vb=10;vra=b;/相相 当当 于于a=b;v注意:注意:v声声明明一一个个引引
20、用用时时,必必须须同同时时对对它它进进行行初初始化,使它与一个已存在的对象关联。始化,使它与一个已存在的对象关联。2.引用调用引用调用C+程序设计程序设计v一一旦旦一一个个引引用用被被初初始始化化后后,就就不不能能改改变变关关联联对对象象。换换言言之之,一一个个引引用用从从它它被被声声明明之之后后,就就必必须须确确定定是是哪哪个个变变量量的的别别名名,而而且且自自始始至至终终只只能能作作为为这这一一个个变变量量的的别别名名,不不能能另另作作他他用用。v形参也可以引用的方式出现在形参表中。形参也可以引用的方式出现在形参表中。引用作为形参的情况与变量的引用稍有不同。引用作为形参的情况与变量的引用稍
21、有不同。这是因为,形参的初始化不在类型说明时进行,这是因为,形参的初始化不在类型说明时进行,而是在执行主调函数中的调用语句时,才为形而是在执行主调函数中的调用语句时,才为形参分配内存空间,同时用参分配内存空间,同时用实参来初始化形参。实参来初始化形参。2.引用调用引用调用C+程序设计程序设计【例例5】使用引用调用改写例使用引用调用改写例7-5的程序,的程序,使两实参中的数真正进行互换。使两实参中的数真正进行互换。v#includevvoidswap(int&a,int&b);vvoidmain()vvintx,y;vx=5;vy=10;vcoutx=xy=yendl;2.引用调用引用调用C+程
22、序设计程序设计vswap(x,y);/交换交换x,y的值的值vcoutafterswapendl;vcoutx=xy=yendl;vvvoidswap(int&a,int&b)vvintt;vt=a;va=b;vb=t;v2.引用调用引用调用C+程序设计程序设计v程序运行结果为程序运行结果为vx=5y=10vafterswapvx=10y=5vv分分析析:子子函函数数swap的的两两个个参参数数都都是是引引用用,当当被被调调用用时时,它它们们分分别别被被初初始始化化成成为为a和和b的的别别名名。因因此此,在在子子函函数数swap中中将将两两个个参参数数的的值值进进行行交交换换后,交换结果可以返
23、回主函数后,交换结果可以返回主函数main。2.引用调用引用调用C+程序设计程序设计3.1函数的定义与使用函数的定义与使用3.2函数调用机制函数调用机制3.3递归函数递归函数3.4默认参数的函数默认参数的函数3.5函数重载函数重载3.6函数模板函数模板3.7变量作用域变量作用域C+程序设计程序设计3.2函数调用机制函数调用机制v一个一个C+的的源程序源程序经过编译以后形成与经过编译以后形成与源程序主源程序主名相同但后缀为名相同但后缀为.exe的可执行文件的可执行文件,且存放在外存储,且存放在外存储器中。当该器中。当该.exe的可执行程序被运行时,首先从外存的可执行程序被运行时,首先从外存将程序
24、代码装载到内存的代码区,然后从将程序代码装载到内存的代码区,然后从main函数函数的的起始处开始执行起始处开始执行。程序在执行过程中,如果遇到了对。程序在执行过程中,如果遇到了对其它函数的调用,则暂停当前函数的执行,其它函数的调用,则暂停当前函数的执行,C+程序设计程序设计v保保存存下下一一条条指指令令的的地地址址(即即返返回回地地址址,作作为为从从子子函函数数返返回回后后继继续续执执行行的的入入口口点点),并并保保存存现现场场(主主要要是是一一些些寄寄存存器器的的内内容容),然然后后转转到到子子函函数数的的入入口口地地址址,执执行行子子函函数数。当当遇遇到到return语语句句或或者者子子函
25、函数数结结束束时时,则则恢恢复复先先前前保保存存的的现现场场,并并从从先先前前保保存存的的返返回回地地址址开开始始继继续续执执行行。图图2说说明明了了函函数数调调用用和和返返回回的的过过程程,图中标号标明了执行顺序。图中标号标明了执行顺序。3.2函数调用机制函数调用机制C+程序设计程序设计图图2函数调用和返回的示意图函数调用和返回的示意图Main()func()调用调用func()结束结束返回返回保存:保存:返回地址返回地址 当前现场当前现场恢复:恢复:主调函数现场主调函数现场 返回地址返回地址3.2函数调用机制函数调用机制C+程序设计程序设计作作业业1:设设N=10,X=2、4、6、8,即即
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三章 函数 第三
限制150内