第三章函数.ppt

上传人:s****8 文档编号:82769409 上传时间:2023-03-26 格式:PPT 页数:103 大小:899KB
返回 下载 相关 举报
第三章函数.ppt_第1页
第1页 / 共103页
第三章函数.ppt_第2页
第2页 / 共103页
点击查看更多>>
资源描述

《第三章函数.ppt》由会员分享,可在线阅读,更多相关《第三章函数.ppt(103页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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,即即

26、求求N事事件件中中每每次次取取2、4、6、8的组合数。的组合数。v分析:这个问题需要反复利用两个公式:分析:这个问题需要反复利用两个公式:vN!vN!/X!/(N-X)!v设设 计计 两两 个个 函函 数数:一一 个个 求求 整整 数数 阶阶 乘乘 的的 函函 数数lJiecheng和和一一个个求求组组合合数数的的函函数数lComb。由由主主函函数数main调用调用lComb,lComb又调用又调用lJiecheng。C+程序设计程序设计程序代码如下:程序代码如下:v#includevlonglJiecheng(intn)vvlongrt=1;vinti;vfor(i=1;i=n;i+)vrt

27、=rt*i;vreturnrt;C+程序设计程序设计vvlonglComb(intN,intX)vvreturnlJiecheng(N)/lJiecheng(X)/lJiecheng(N-X);vvvoidmain()vvlonglJiecheng(intn);vlonglComb(intN,intX);C+程序设计程序设计vvintiNum,x;vdovvcoutiNum;vwhile(iNum10);vfor(x=2;x10;x+=2)coutC(iNum,x)=lComb(iNum,x)0)1 (n=0)v这是一个递归形式的公式这是一个递归形式的公式,应该用递归函数实现应该用递归函数实现

28、.3.3递递归归函函数数C+程序设计程序设计v源程序源程序:v#includevLongfac(intn)vvlongf;vif(n0)vcour“n0,dataerror!”endl;velseif(n=0)f=1;velsef=fac(n-1)*n;vreturnf;v3.3递递归归函函数数C+程序设计程序设计vvoidmain()vvlongfac(intn);vintn;vlongy;vcoutn;vy=fac(n);vcoutn!=yendl;vv运行结果:运行结果:vEnterapositiveinteger:8v8!=403203.3递递归归函函数数C+程序设计程序设计循环终止的

29、条件循环终止的条件一个递归调用语句(递推关系)一个递归调用语句(递推关系)递归的条件递归的条件3.3递递归归函函数数C+程序设计程序设计v作作业业2:有有5个个人人坐坐在在一一起起,问问第第1个个人人多多少少岁岁,他他说说比比第第2个个人人大大2岁岁。问问第第2个个人人多多少少岁岁,他他说说比比第第3个个人人大大2岁岁。问问第第3个个人人多多少少岁岁,他他说说比比第第4个个人人大大2岁岁。问问第第4个个人人多多少少岁岁,他他说说比比第第5个个人人大大2岁岁。最最后后问问第第5个个人人,他他说说是是12岁。请问第岁。请问第1个人多少岁?个人多少岁?v分分析析:这这是是一一个个递递归归问问题题。每

30、每一一个个人人的的年年龄都比其后那个人的年龄大龄都比其后那个人的年龄大2,即,即3.3递递归归函函数数C+程序设计程序设计vage(1)=age(2)+2vage(2)=age(3)+2vage(3)=age(4)+2vage(4)=age(5)+2vage(5)=12v可以用公式表示如下:可以用公式表示如下:v12(n=5)vage(n)=vage(n+1)+2(n5)3.3递递归归函函数数C+程序设计程序设计v程序代码如下:程序代码如下:v#includevintage(intn)vvintss;vif(n=5)ss=12;velsess=age(n+1)+2;vreturn(ss);vv

31、voidmain()3.3递递归归函函数数C+程序设计程序设计vvintage(intn);vcout第第 一一 个个 人人 的的 年年 龄龄 为为age(1)岁岁endl;vv程序运行结果为程序运行结果为v第一个人的年龄为第一个人的年龄为20岁岁3.3递递归归函函数数C+程序设计程序设计3.1函数的定义与使用函数的定义与使用3.2函数调用机制函数调用机制3.3递归函数递归函数3.4默认参数的函数默认参数的函数3.5函数重载函数重载3.6函数模板函数模板3.7变量作用域变量作用域C+程序设计程序设计3.4默认参数的函数默认参数的函数v在函数定义中通过赋值运算就可指定默认参数值。在函数定义中通过

32、赋值运算就可指定默认参数值。一旦程序在调用该函数时,如果给出一旦程序在调用该函数时,如果给出实参实参,则用,则用实参实参初始化形参初始化形参;如果;如果没有给出实参没有给出实参,则,则C+编译系统编译系统自自动以预先赋值的默认参数值作为传入数值动以预先赋值的默认参数值作为传入数值。一般情况。一般情况下都将调用该函数时经常用到的常数作为默认参数值,下都将调用该函数时经常用到的常数作为默认参数值,这样在调用时就无需每次都写出该值了。指定默认参这样在调用时就无需每次都写出该值了。指定默认参数值可以使函数的使用更为简单,同时也增强了函数数值可以使函数的使用更为简单,同时也增强了函数的可重用性。的可重用

33、性。C+程序设计程序设计v【例例7】带默认形参值的函数例题。带默认形参值的函数例题。v#includevintmult(intn,intk=2)/第二个形参具有默认值第二个形参具有默认值vvif(k=2)vreturn(n*n);velsevreturn(mult(n,k-1)*n);vvvoidmain()3.4默认参数的函数默认参数的函数C+程序设计程序设计vvcoutendlmult(5)endl;v/*形形参参n用用实实参参来来初初始始化化为为5,形形参参k采采用用默默认认值值2,实现,实现5*5*/vcoutmult(5,3)endl;v/*用用实实参参来来初初始始化化形形参参,n为

34、为5,k为为3,实实现现5*5*5*/vv程序运行结果为程序运行结果为v25v1253.4默认参数的函数默认参数的函数C+程序设计程序设计v默默认认形形参参值值必必须须按按从从右右向向左左的的顺顺序序定定义义。在在有有默默认认值值的的形形参参右右面面,不不能能出出现现无无默默认认值值的的形形参参。因因为为在在调调用时,实参初始化形参是按从左向右的顺序。例如:用时,实参初始化形参是按从左向右的顺序。例如:vvoidtry(intj=3,intk)vvoidtry(intj,intk=2,intm)vvoidtry(intj,intk=7)vvoidtry(intj,intk=2,intm=3)v

35、voidtry(intj=3,intk=2,intm=3)/非法非法/非法非法/合法合法/合法合法/合法合法3.4默认参数的函数默认参数的函数C+程序设计程序设计v默认形参值应该在函数原型中给出。默认形参值应该在函数原型中给出。例如:例如:vintmulti(intx=2,inty=5);/默默认认形形参参值值在函数原型中给出在函数原型中给出vvoidmain()vvmulti();/并并非非无无参参调调用用,而而是是采采用用默默认认值值,x取值取值2,y取值取值5vvintmulti(intx,inty)vreturn(x*y);3.4默认参数的函数默认参数的函数C+程序设计程序设计v在在相

36、相同同的的作作用用域域内内,默默认认形形参参值值的的说说明明应应保保持持唯唯一一。但但如如果果在在不不同同的的作作用用域域内内,允允许许说说明明不不同同的的默默认认形形参参。这这里里的的作作用用域域是是指指直直接接包包含含着着函函数数原原型型说说明明的的大大括括号号所所界定的范围界定的范围。例如:。例如:vintadd(intx=2,inty=5);/全全局局默默认认形形参值参值vvoidmain()vintadd(intx=1,inty=9);/局局部部默默认形参值认形参值3.4默认参数的函数默认参数的函数C+程序设计程序设计vadd();/此处调用时,采用局部默认形参值,此处调用时,采用局

37、部默认形参值,vx取值取值1,y取值取值9vvvoidfunc(void)vadd()/此此处处调调用用时时,采采用用全全局局默默认认形形参参值值,x取取值值2,y取值取值5v3.4默认参数的函数默认参数的函数C+程序设计程序设计3.1函数的定义与使用函数的定义与使用3.2函数调用机制函数调用机制3.3递归函数递归函数3.4默认参数的函数默认参数的函数3.5内联函数内联函数3.6函数模板函数模板3.7变量作用域变量作用域C+程序设计程序设计3.5内内联联函函数数v内联函数内联函数(也称也称在线函数在线函数)是在是在C+中为中为提高程序提高程序运行效率而引入运行效率而引入的。所有函数的。所有函数

38、调用时都会产生一些额调用时都会产生一些额外的开销,主要是系统栈的保护、代码的传递、系统外的开销,主要是系统栈的保护、代码的传递、系统栈的恢复以及参数传递等。栈的恢复以及参数传递等。对于一些对于一些函数体很小函数体很小但又但又经常使用的函数经常使用的函数,由于被,由于被调用的频率非常高调用的频率非常高,这种额,这种额外开销也就很可观,有时甚至会对运行效率产生本质外开销也就很可观,有时甚至会对运行效率产生本质的影响。的影响。C+程序设计程序设计v使用使用内联函数内联函数正是解决这一问题的手段。正是解决这一问题的手段。v内内联联函函数数不不是是在在调调用用时时发发生生转转移移,而而是是在在编编译译时

39、时将将函函数数体体嵌嵌入入在在每每一一个个调调用用语语句句处处。这这样样就就相相对对节节省省了了参数传递、系统栈的保护与恢复等的开销。参数传递、系统栈的保护与恢复等的开销。v内内联联函函数数在在定定义义时时使使用用关关键键字字inline区区别别于于一一般般函数,其语法形式如下:函数,其语法形式如下:v(含含类类型说明的形参表型说明的形参表)v函数体函数体3.5内内联联函函数数C+程序设计程序设计例如:例如:vinlineintmul(inta,intb)vreturna*b;v当当程程序序中中出出现现mul(2+3,4)的的函函数数调调用用时时,编编译译程程序序就就会会将将其其扩扩展展为为(

40、2+3)*4。关关键键字字inline是是一一个个编编译译命命令令,编编译译程程序序在在遇遇到到这这个个命命令令时时将将记记录录下下来来,在在处处理理内内联联函函数数的的调调用用时时,编编译译程程序序就就试试图图产产生生扩扩展展码码。这这样样从从使使用用者者的的角角度度来来看看,内内联联函函数数在在语语法法上上与与一一般般函函数数没没有有什什么么区区别别,只只是是在在编编译译程程序序生生成成目目标标代代码码时时才才区区别处理。别处理。3.5内内联联函函数数C+程序设计程序设计v注意:注意:v内内联联函函数数体体内内一一般般不不能能有有循循环环语语句句和和switch语句。语句。v内内联联函函数

41、数的的定定义义必必须须出出现现在在第第一一次次被被调调用用之之前。前。v如如果果违违背背了了上上述述注注意意事事项项中中的的任任一一项项,编编译译程程序序就就会会无无视视关关键键字字inline的的存存在在,像像处处理理一一般般函函数数一一样样处处理理,不不生生成成扩扩展展代代码码。因因此此,只只有有很很简简单单而而使使用用频频率率很很高高的的函函数数才才被被说说明明为为内内联联函函数数。内内联联函函数数会会扩扩大大目标代码,使用时要谨慎。目标代码,使用时要谨慎。3.5内内联联函函数数C+程序设计程序设计v【例例8】内联函数例题。内联函数例题。v#includev#includevinline

42、intmax(inta,intb)vvif(ab)vreturna;velsevreturnb;v3.5内内联联函函数数C+程序设计程序设计vvoidmain()vvinta,b,c,d;va=210;vb=150;vc=20;vd=max(a,b);vd=max(d,c);/编译时两个调用处均被编译时两个调用处均被v替换为替换为max函数体语句。函数体语句。3.5内内联联函函数数C+程序设计程序设计vcoutThebiggestofvsetw(5)avsetw(5)bvsetw(5)cisdendl;vv程序运行结果为程序运行结果为vThebiggestof21015020is2103.5内

43、内联联函函数数C+程序设计程序设计回顾回顾C+程序设计程序设计v默默认认形形参参值值必必须须按按从从右右向向左左的的顺顺序序定定义义。在在有有默默认认值值的的形形参参右右面面,不不能能出出现现无无默默认认值值的的形形参参。因因为为在在调调用时,实参初始化形参是按从左向右的顺序。例如:用时,实参初始化形参是按从左向右的顺序。例如:vvoidtry(intj=3,intk)vvoidtry(intj,intk=2,intm)vvoidtry(intj,intk=7)vvoidtry(intj,intk=2,intm=3)vvoidtry(intj=3,intk=2,intm=3)/非法非法/非法非

44、法/合法合法/合法合法/合法合法3.4默认参数的函数默认参数的函数C+程序设计程序设计v使用使用内联函数内联函数正是解决这一问题的手段。正是解决这一问题的手段。v内内联联函函数数不不是是在在调调用用时时发发生生转转移移,而而是是在在编编译译时时将将函函数数体体嵌嵌入入在在每每一一个个调调用用语语句句处处。这这样样就就相相对对节节省省了了参数传递、系统栈的保护与恢复等的开销。参数传递、系统栈的保护与恢复等的开销。v内内联联函函数数在在定定义义时时使使用用关关键键字字inline区区别别于于一一般般函数,其语法形式如下:函数,其语法形式如下:v(含含类类型说明的形参表型说明的形参表)v函数体函数体

45、3.5内内联联函函数数C+程序设计程序设计v注意:注意:v内内联联函函数数体体内内一一般般不不能能有有循循环环语语句句和和switch语句。语句。v内内联联函函数数的的定定义义必必须须出出现现在在第第一一次次被被调调用用之之前。前。v对内联函数不能进行异常接口声明。对内联函数不能进行异常接口声明。v如果违背了上述注意事项中的任一项,编译程如果违背了上述注意事项中的任一项,编译程序就会无视关键字序就会无视关键字inline的存在,像处理一般函数一的存在,像处理一般函数一样处理,不生成扩展代码。因此,样处理,不生成扩展代码。因此,只有很简单而使用只有很简单而使用频率很高的函数才被说明为内联函数频率

46、很高的函数才被说明为内联函数。内联函数会扩。内联函数会扩大目标代码,使用时要谨慎。大目标代码,使用时要谨慎。3.5内内联联函函数数C+程序设计程序设计3.1函数的定义与使用函数的定义与使用3.2函数调用机制函数调用机制3.3递归函数递归函数3.4默认参数的函数默认参数的函数3.5内联函数内联函数3.6函数重载函数重载3.7函数模板函数模板3.8变量作用域变量作用域C+程序设计程序设计【例例7-9】v#includevintadd(intx,inty)vvreturn(x+y);vvdoubleadd(doublex,doubley)vvreturn(x+y);v3.6函函数数重重载载C+程序设

47、计程序设计vintadd(intx,inty,intz)vvreturn(x+y+z);vvvoidmain()vinta,b,c;va=add(5,10);vb=add(5.7,10.3);vc=add(5,10,20);vcouta=ab=bendl;vv程序运行结果为程序运行结果为va=15b=16.0c=353.6函函数数重重载载C+程序设计程序设计3.6函函数数重重载载vC+允许功能相近的函数在相同的作用域内以相同允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。函数名声明,从而形成重载。函数重载是指一个函数名可函数重载是指一个函数名可以有多个函数实现。以有多个函数实

48、现。方便使用,便于记忆。方便使用,便于记忆。vC+编译器在进行函数调用时是根据函数名和函数编译器在进行函数调用时是根据函数名和函数的参数来决定调用哪一个函数的,的参数来决定调用哪一个函数的,因此对于函数名重载问因此对于函数名重载问题,要区分函数名相同的函数,只有从它们的题,要区分函数名相同的函数,只有从它们的参数参数上进行上进行区分。区分。v例:例:形参类型不同形参类型不同 int add(int x,int y);float add(float x,float y);形参个数不同形参个数不同int add(int x,int y);int add(int x,int y,int z);C+程

49、序设计程序设计3.6函函数数重重载载int add(int x,int y);int add(int a,int b);编译器不以形参名来区分编译器不以形参名来区分int add(int x,int y);void add(int x,int y);编译器不以返回值来区分编译器不以返回值来区分重载函数的形参必须不同重载函数的形参必须不同:个数不同个数不同或或类型不同。类型不同。编译程序将根据实参和形参的类型及个数的最佳匹配来选编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。择调用哪一个函数。注意:注意:C+程序设计程序设计3.6函函数数重重载载不要将不同功能的函数声明为重载

50、函数,以免出现调用不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:结果的误解、混淆。这样不好:int add(int x,int y)return x+y;float add(float x,float y)return x-y;注意:注意:C+程序设计程序设计3.6函函数数重重载载例子例子例例9:编写三个名为:编写三个名为addadd的重载函数,分的重载函数,分别实现两整数相加、两浮点数相加和三别实现两整数相加、两浮点数相加和三个整数相加的功能。个整数相加的功能。C+程序设计程序设计【例例9】v#includevintadd(intx,inty)vvreturn(

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

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁