第三章函数省公共课一等奖全国赛课获奖课件.pptx
《第三章函数省公共课一等奖全国赛课获奖课件.pptx》由会员分享,可在线阅读,更多相关《第三章函数省公共课一等奖全国赛课获奖课件.pptx(103页珍藏版)》请在咨信网上搜索。
第第第第3 3章章章章 函数函数函数函数C+程序设计第1页本小节内容本小节内容3.1函数定义与使用函数定义与使用3.2函数调用机制函数调用机制3.3递归函数递归函数3.4默认参数函数默认参数函数3.5函数重载函数重载3.6函数模板函数模板C+程序设计程序设计第2页3.1函数定义函数定义v在编辑一个大型程序时,即使各个函数前后在编辑一个大型程序时,即使各个函数前后次序不一样,次序不一样,程序执行开始点永远是主函数。程序执行开始点永远是主函数。主主函数按照调用与被调用关系调用子函数。子函数函数按照调用与被调用关系调用子函数。子函数假如与其它子函数又存在调用与被调用关系,当假如与其它子函数又存在调用与被调用关系,当然还能够再调用其它子函数。然还能够再调用其它子函数。C+程序设计程序设计第3页3.1函数定义函数定义v函数是面向对象程序设计中基本抽象单元函数是面向对象程序设计中基本抽象单元,v是对功效抽象。是对功效抽象。C+程序设计程序设计第4页3.1函数定义与使用函数定义与使用3.2函数调用机制函数调用机制3.3递归函数递归函数3.4默认参数函数默认参数函数3.5函数重载函数重载3.6函数模板函数模板3.7变量作用域变量作用域C+程序设计程序设计第5页3.1函数定义函数定义主函数主函数main()调用函数调用函数 func1调用函数调用函数 func2 函数函数func2()()函数函数 func1()函数函数 func2()C+程序设计程序设计第6页v在在一一对对调调用用与与被被调调用用关关系系中中,我我们们把把调调用用其其它它函函数数函函数数称称为为主主调调函函数数,被被其其它它函函数数调调用用函函数数称称为为被被调调函函数数。在在一一个个较较为为复复杂杂大大型型程程序序中中,一一个个函函数数很很可可能能同同时时饰饰演演两两种种不不一一样样角角色色主主调调函函数数与与被被调调函函数数,即即既既调调用用别别函函数数(被被调调函函数数)又又被被另另外外函函数数(主主调调函函数数)调调用用。函函数数普普通通应应恪恪守守先先定定义义后后调调用用标标准准,不不然然应应在在调用函数中先进行原形说明。调用函数中先进行原形说明。C+程序设计程序设计第7页一、函数定义一、函数定义v一一个个完完整整函函数数定定义义由由两两部部分分组组成成,即即函数头与函数体。函数头与函数体。v1.函数定义普通语法形式函数定义普通语法形式v(形形式参数表式参数表)vv说明性语句序列;说明性语句序列;v实现函数功效语句系列;实现函数功效语句系列;v函数头函数体C+程序设计程序设计第8页v函函数数头头是是指指上上述述格格式式中中(形形式式参参数数表表)。其其中中函函数数名名可可由由函函数数设设计计者者命命名名,能能够够是是任任何何一一个个不不重重复复正正当当标标识识符符(唯唯一一例例外外是是,主主函函数数必必须须命命名名为为main)。)。v函函数数体体是是指指上上述述格格式式中中被被一一对对大大括括号号括括起起复复合合语语句句部部分分。该该函函数数所所应应实实现现功功效效由由对对应应复复合语句完成。合语句完成。C+程序设计程序设计第9页2、形式参数表、形式参数表 name1,name2,.,namen3、函数返回值、函数返回值由由 return 语句给出,比如:语句给出,比如:return 0无返回值函数(无返回值函数(void类型),无须类型),无须写写return语句。语句。C+程序设计程序设计第10页v函函数数在在没没有有被被调调用用时时候候其其形形参参只只是是一一个个符符号号,它它标标志志着着在在形形参参出出现现位位置置应应该该有有一一个个什什么么类类型型数数据据。函函数数在在被被调调用用时时才才由由主主调调函函数数将将实实际际参参数数(简简称称实实参参)赋赋予予形形参参。从从这这一一点点上上说说,C+中中函函数数与与数数学学中中函函数数概概念念极极其其相相同同。比比如,我们都熟悉以下数学中函数形式:如,我们都熟悉以下数学中函数形式:vf(x)=3x+5x-2v这这个个函函数数只只有有当当自自变变量量x被被赋赋以以确确定定值值以以后,才能计算出函数值。后,才能计算出函数值。C+程序设计程序设计第11页v二、二、函数调用函数调用v假假如如没没有有恪恪守守先先定定义义后后调调用用标标准准,调调用用函函数数之之前前先先要要在在主主调调函函数数中中申申明明函函数数原原型型。在在主主调调函函数数中中,或或全全部部函函数数之之前前,按按以以下下形形式式进进行行函函数数原原型申明:型申明:v(含类型说明形参表含类型说明形参表);函数原型申明C+程序设计程序设计第12页v假假如如是是在在全全部部函函数数之之前前申申明明了了函函数数原原型型,那那么么该该函函数数原原型型在在本本程程序序文文件件中中任任何何地地方方都都有有效效,也也就就是是说说,在在本本程程序序文文件件中中任任何何地地方方都都能能够够依依照照该该原原型型调调用用对对应应函函数数。假假如如是是在在某某个个主主调调函函数数内内部部申申明明了了被被调调函函数数原原型型,那那么么该该原原型型就就只只能能在在这这个个函函数数内内部部有有效。效。v申申明明了了函函数数原原型型之之后后,便便能能够够按以下形式调用子函数:按以下形式调用子函数:v(实实参参1,实实参参2,实参实参n)调用函数C+程序设计程序设计第13页v实实参列表中参列表中应给应给出与函数原型中形参个数出与函数原型中形参个数相同、相同、类类型相符型相符实实参,每个参,每个实实参都能参都能够够是常量、是常量、变变量或表示式三者之一。量或表示式三者之一。实实参加参加实实参之参之间间用逗用逗号作号作为为分隔符。注意,分隔符。注意,这这里逗号不是次序求里逗号不是次序求值值运算符。函数运算符。函数调调用能用能够够作作为为一条一条语语句,句,这时这时函函数能数能够够没有返回没有返回值值。函数。函数调调用也能用也能够够出出现现在表在表示式中,示式中,这时这时就必就必须须有一个明确返回有一个明确返回值值。函数。函数调调用示比如下。用示比如下。C+程序设计程序设计第14页【例例1】编写一个编写一个n!函数,并调用。!函数,并调用。(1)n!函数!函数vlongfac(intn)vvinti,jc=1;vif(n0)vvcoutn不能小于不能小于0endl;vreturn-1;vvfor(i=1;i=n;i+)vjc*=i;vreturnjc;vC+程序设计程序设计第15页(2)函数调用)函数调用v#includevlongfac(intn);/原型说明语句原型说明语句vvoidmain()vvinta;vcout请输入请输入a值:值:a;vcouta!=fac(a)endl;vC+程序设计程序设计第16页v【例例2】求任意两个数最大值函数及其调用。求任意两个数最大值函数及其调用。v#includevintmax(intx,inty);vvoidmain()vvvinta,b,c;vcout请输入请输入a、b、c值:值:abc;vcout“a、b、c最大值是最大值是max(max(a,b),c)endl;vvintmax(intx,inty)vvif(xy)returny;velsereturnx;vC+程序设计程序设计第17页v【例例3】编编写写一一个个函函数数,把把华华氏氏温温度度转转换换为为摄摄氏氏温温度度,公公式式为为C=(F-32)*5/9,公公式式中中F代代表表华华氏氏温温度度,C代代表表摄摄氏氏温温度度。在在主主函函数数中中提提醒醒用用户户输输入入一一个个华华氏氏温温度,并完成输入及输出,由函数完成转化功效。度,并完成输入及输出,由函数完成转化功效。v程序代码以下:程序代码以下:v#includevfloathstoss(floatfHuashi);/原型说明原型说明vvoidmain()C+程序设计程序设计第18页vfloatfHuashi;vcoutendlfHuashi;vcout华氏华氏fHuashiv度度对对应应摄摄氏氏温温度度hstoss(fHuashi)度度endl;v/函数调用作为一个表示式出现在输出语句中函数调用作为一个表示式出现在输出语句中vvfloathstoss(floatfHuashi)vvfloatfSheshi;vfSheshi=(fHuashi-32)*5/9;C+程序设计程序设计第19页vreturn(fSheshi);vv程序运行结果为程序运行结果为v输入一个华氏温度值:输入一个华氏温度值:68v华氏华氏68度对应摄氏度对应摄氏20度度C+程序设计程序设计第20页函函数数参参数数用用于于在在调调用用函函数数与与被被调调用用函函数数之之间间进进行行数数据据传传递递。在在函函数数定定义义时时,函函数数名名后后面面括括号号内内参参数数称称为为形形式式参参数数(简简称称形形参参)。在在函函数数被被调调用用时时,函函数数名名后后面面括括号号内内参参数数称称为实际参数为实际参数(简称简称实参实参)。三、三、函数参数传递函数参数传递C+程序设计程序设计第21页v当当函函数数未未被被调调用用时时,C+编编译译系系统统并并没没有有给给函函数数形形参参分分配配对对应应内内存存空空间间,函函数数形形参参更更不不会会有有实实际际值值。只只有有在在函函数数被被调调用用时时,C+编编译译系系统统这这时时才才为为形形参参分分配配实实际际存存放放单单元元,并并将将实实参参加加形形参参结结合合。实实参参能能够够是是常常量量、变变量量或或表表示示式式,其其类类型型必必须须与与形形参参相相符符。函函数数参参数数传传递递,指指就就是是形形参参加加实实参参结结合合(简简称称形形实实结结合合)过过程。程。形实结合方式有值调用和引用调用两种。形实结合方式有值调用和引用调用两种。三、三、函数参数传递函数参数传递C+程序设计程序设计第22页v值值调调用用是是指指当当发发生生函函数数调调用用时时,编编译译系系统统为为形形参参分分配配对对应应存存放放空空间间而而且且直直接接将将实实参参值值复复制制给给形形参参,这这么么形形参参和和实实参参就就各各自自拥拥有有不不一一样样存存放放单单元元,且且形形参参是是实实参参副副本本。所所以以,值值调调用用过过程程是是参参数数值值单单向向传传递递过过程程,一一旦旦形形参参取取得得了了与与实实参参相相同同值值就就与与实实参参脱脱离离关关系系,以以后后不不论论形形参发生多大改变,都决不会反过来影响到实参。参发生多大改变,都决不会反过来影响到实参。1.值调用值调用C+程序设计程序设计第23页v【例例4】从从键键盘盘输输入入两两个个整整数数,交交换换位位置置后后输输出出(交换未成功)。(交换未成功)。v#includevvoidswap(inta,intb);vvoidmain()vvintx,y;vx=5;vy=10;1.值调用值调用C+程序设计程序设计第24页vcoutx=xy=yendl;vswap(x,y);/交换交换x,y值值vcoutafterswapendl;vcoutx=xy=yendl;vvvoidswap(inta,intb)vvintt;vt=a;va=b;vb=t;v1.值调用值调用C+程序设计程序设计第25页v程序运行结果为程序运行结果为vx=5y=10vafterswapvx=5y=10v分分析析:从从上上面面程程序序运运行行结结果果能能够够看看出出,并并没没有有到到达达交交换换目目标标。这这是是因因为为采采取取传传递递方方式式不不合合乎乎问问题题要要求求。在在单单向向值值传传递递方方式式中中,形形参参值值虽虽确确实实进进行行了了交交换换,但但这这些些改改变变对对实实参参不不起起任何作用。任何作用。1.值调用值调用C+程序设计程序设计第26页v执执行行主主调调函函数数中中函函数数调调用用语语句句swap(x、y)后后,编编译译系系统统将将实实参参x中中值值5传传递递给给虚虚参参a,将将实实参参y中中值值10传传递递给给虚虚参参b;在在swap函函数数中中,a、b中中值值完完成成交交换换;返返回回主主函函数数时时,实实参参x、y中值不受虚参中值不受虚参a、b影响,并未进行交换。影响,并未进行交换。1.值调用值调用C+程序设计程序设计第27页v显显而而易易见见,值值调调用用时时参参数数传传递递方方式式是是实实参参单单向向复复制制其其值值给给虚虚参参,假假如如我我们们想想使使子子函函数数中中对对形形参参所所做做任任何何更更改改也也能能及及时时反反应应给给主主函函数数中中实实参参(即即希希望望形形参参加加实实参参影影响响是是相相互互或或称称是是双双向向),又又该该怎怎么么办办呢呢?这这就就需需要要改改变变调调用用方方式式,即即采采取取第第二二种种参参数数传传递递方方式式引用调用引用调用。v引用是一个特殊类型变量,能够被认为是某一个引用是一个特殊类型变量,能够被认为是某一个变量别名变量别名。经过引用名与经过被引用变量名访问变量。经过引用名与经过被引用变量名访问变量效果是一样。这就是说,对形参任何操作也就直接作效果是一样。这就是说,对形参任何操作也就直接作用于实参。用于实参。2.引用调用引用调用C+程序设计程序设计第28页v比如:比如:vinta,b;vint&ra=a;/建建立立一一个个int型引用型引用ra,并将其初始化为变量,并将其初始化为变量a一个别名一个别名vb=10;vra=b;/相相当当于于a=b;v注意:注意:v申申明明一一个个引引用用时时,必必须须同同时时对对它它进进行行初初始化,使它与一个已存在对象关联。始化,使它与一个已存在对象关联。2.引用调用引用调用C+程序设计程序设计第29页v一一旦旦一一个个引引用用被被初初始始化化后后,就就不不能能改改变变关关联联对对象象。换换言言之之,一一个个引引用用从从它它被被申申明明之之后后,就就必必须须确确定定是是哪哪个个变变量量别别名名,而而且且自自始始至至终只能作为这一个变量别名,不能另作他用终只能作为这一个变量别名,不能另作他用。v形参也能够引用方式出现在形参表中。形参也能够引用方式出现在形参表中。引引用作为形参情况与变量引用稍有不一样。这是用作为形参情况与变量引用稍有不一样。这是因为,形参初始化不在类型说明时进行,而是因为,形参初始化不在类型说明时进行,而是在执行主调函数中调用语句时,才为形参分配在执行主调函数中调用语句时,才为形参分配内存空间,同时用内存空间,同时用实参来初始化形参。实参来初始化形参。2.引用调用引用调用C+程序设计程序设计第30页【例例5】使用引用调用改写例使用引用调用改写例7-5程序,程序,使两实参中数真正进行交换。使两实参中数真正进行交换。v#includevvoidswap(int&a,int&b);vvoidmain()vvintx,y;vx=5;vy=10;vcoutx=xy=yendl;2.引用调用引用调用C+程序设计程序设计第31页vswap(x,y);/交换交换x,y值值vcoutafterswapendl;vcoutx=xy=yendl;vvvoidswap(int&a,int&b)vvintt;vt=a;va=b;vb=t;v2.引用调用引用调用C+程序设计程序设计第32页v程序运行结果为程序运行结果为vx=5y=10vafterswapvx=10y=5vv分分析析:子子函函数数swap两两个个参参数数都都是是引引用用,当当被被调调用用时时,它它们们分分别别被被初初始始化化成成为为a和和b别别名名。所所以以,在在子子函函数数swap中中将将两两个个参参数数值值进进行行交交换换后后,交交换换结果能够返回主函数结果能够返回主函数main。2.引用调用引用调用C+程序设计程序设计第33页3.1函数定义与使用函数定义与使用3.2函数调用机制函数调用机制3.3递归函数递归函数3.4默认参数函数默认参数函数3.5函数重载函数重载3.6函数模板函数模板3.7变量作用域变量作用域C+程序设计程序设计第34页3.2函数调用机制函数调用机制v一个一个C+源程序源程序经过编译以后形成与经过编译以后形成与源程序主名源程序主名相同但后缀为相同但后缀为.exe可执行文件可执行文件,且存放在外存放器中。,且存放在外存放器中。当该当该.exe可执行程序被运行时,首先从外存将程序代可执行程序被运行时,首先从外存将程序代码装载到内存代码区,然后从码装载到内存代码区,然后从main函数函数起始处开始执起始处开始执行行。程序在执行过程中,假如碰到了对其它函数调用,。程序在执行过程中,假如碰到了对其它函数调用,则暂停当前函数执行,则暂停当前函数执行,C+程序设计程序设计第35页v保保留留下下一一条条指指令令地地址址(即即返返回回地地址址,作作为为从从子子函函数数返返回回后后继继续续执执行行入入口口点点),并并保保留留现现场场(主主要要是是一一些些存存放放器器内内容容),然然后后转转到到子子函函数数入入口口地地址址,执执行行子子函函数数。当当碰碰到到return语语句句或或者者子子函函数数结结束束时时,则则恢恢复复先先前前保保留留现现场场,并并从从先先前前保保留留返返回回地地址址开开始始继继续续执执行行。图图2说说明明了了函函数数调调用用和和返返回回过过程程,图图中中标标号号标标明明了了执执行行次序。次序。3.2函数调用机制函数调用机制C+程序设计程序设计第36页图图2函数调用和返回示意图函数调用和返回示意图Main()func()调用调用func()结束结束返回返回保留:保留:返回地址返回地址 当前现场当前现场恢复:恢复:主调函数现场主调函数现场 返回地址返回地址3.2函数调用机制函数调用机制C+程序设计程序设计第37页作作业业1:设设N=10,X=2、4、6、8,即即求求N事事件件中中每每次次取取2、4、6、8组合数。组合数。v分析:这个问题需要重复利用两个公式:分析:这个问题需要重复利用两个公式:vN!vN!/X!/(N-X)!v设设 计计 两两 个个 函函 数数:一一 个个 求求 整整 数数 阶阶 乘乘 函函 数数lJiecheng和和一一个个求求组组合合数数函函数数lComb。由由主主函函数数main调用调用lComb,lComb又调用又调用lJiecheng。C+程序设计程序设计第38页程序代码以下:程序代码以下:v#includevlonglJiecheng(intn)vvlongrt=1;vinti;vfor(i=1;i=n;i+)vrt=rt*i;vreturnrt;C+程序设计程序设计第39页vvlonglComb(intN,intX)vvreturnlJiecheng(N)/lJiecheng(X)/lJiecheng(N-X);vvvoidmain()vvlonglJiecheng(intn);vlonglComb(intN,intX);C+程序设计程序设计第40页vvintiNum,x;vdovvcoutiNum;vwhile(iNum10);vfor(x=2;x10;x+=2)coutC(iNum,x)=lComb(iNum,x)0)1 (n=0)v这是一个递归形式公式这是一个递归形式公式,应该用递归函数实现应该用递归函数实现.3.3递递归归函函数数C+程序设计程序设计第46页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+程序设计程序设计第47页vvoidmain()vvlongfac(intn);vintn;vlongy;vcoutn;vy=fac(n);vcoutn!=yendl;vv运行结果:运行结果:vEnterapositiveinteger:8v8!=403203.3递递归归函函数数C+程序设计程序设计第48页循环终止条件循环终止条件一个递归调用语句(递推关系)一个递归调用语句(递推关系)递归条件递归条件3.3递递归归函函数数C+程序设计程序设计第49页v作作业业2:有有5个个人人坐坐在在一一起起,问问第第1个个人人多多少少岁岁,他他说说比比第第2个个人人大大2岁岁。问问第第2个个人人多多少少岁岁,他他说说比比第第3个个人人大大2岁岁。问问第第3个个人人多多少少岁岁,他他说说比比第第4个个人人大大2岁岁。问问第第4个个人人多多少少岁岁,他他说说比比第第5个个人人大大2岁岁。最最终终问问第第5个个人人,他他说说是是12岁。请问第岁。请问第1个人多少岁?个人多少岁?v分分析析:这这是是一一个个递递归归问问题题。每每一一个个人人年年纪纪都比其后那个人年纪大都比其后那个人年纪大2,即,即3.3递递归归函函数数C+程序设计程序设计第50页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+程序设计程序设计第51页v程序代码以下:程序代码以下:v#includevintage(intn)vvintss;vif(n=5)ss=12;velsess=age(n+1)+2;vreturn(ss);vvvoidmain()3.3递递归归函函数数C+程序设计程序设计第52页vvintage(intn);vcout第第一一个个人人年年纪纪为为age(1)岁岁endl;vv程序运行结果为程序运行结果为v第一个人年纪为第一个人年纪为20岁岁3.3递递归归函函数数C+程序设计程序设计第53页3.1函数定义与使用函数定义与使用3.2函数调用机制函数调用机制3.3递归函数递归函数3.4默认参数函数默认参数函数3.5函数重载函数重载3.6函数模板函数模板3.7变量作用域变量作用域C+程序设计程序设计第54页3.4默认参数函数默认参数函数v在函数定义中经过赋值运算就可指定默认参数值。在函数定义中经过赋值运算就可指定默认参数值。一旦程序在调用该函数时,假如给出一旦程序在调用该函数时,假如给出实参实参,则用,则用实参实参初始化形参初始化形参;假如;假如没有给出实参没有给出实参,则,则C+编译系统编译系统自自动以预先赋值默认参数值作为传入数值动以预先赋值默认参数值作为传入数值。普通情况下。普通情况下都将调用该函数时经惯用到常数作为默认参数值,这都将调用该函数时经惯用到常数作为默认参数值,这么在调用时就无需每次都写出该值了。指定默认参数么在调用时就无需每次都写出该值了。指定默认参数值能够使函数使用更为简单,同时也增强了函数可重值能够使函数使用更为简单,同时也增强了函数可重用性。用性。C+程序设计程序设计第55页v【例例7】带默认形参值函数例题。带默认形参值函数例题。v#includevintmult(intn,intk=2)/第二个形参含有默认值第二个形参含有默认值vvif(k=2)vreturn(n*n);velsevreturn(mult(n,k-1)*n);vvvoidmain()3.4默认参数函数默认参数函数C+程序设计程序设计第56页vvcoutendlmult(5)endl;v/*形形参参n用用实实参参来来初初始始化化为为5,形形参参k采采取取默默认认值值2,实现,实现5*5*/vcoutmult(5,3)endl;v/*用用实实参参来来初初始始化化形形参参,n为为5,k为为3,实实现现5*5*5*/vv程序运行结果为程序运行结果为v25v1253.4默认参数函数默认参数函数C+程序设计程序设计第57页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)/非法非法/非法非法/正当正当/正当正当/正当正当3.4默认参数函数默认参数函数C+程序设计程序设计第58页v默认形参值应该在函数原型中给出。默认形参值应该在函数原型中给出。比如:比如:vintmulti(intx=2,inty=5);/默默认认形形参参值值在函数原型中给出在函数原型中给出vvoidmain()vvmulti();/并并非非无无参参调调用用,而而是是采采取取默默认认值值,x取值取值2,y取值取值5vvintmulti(intx,inty)vreturn(x*y);3.4默认参数函数默认参数函数C+程序设计程序设计第59页v在在相相同同作作用用域域内内,默默认认形形参参值值说说明明应应保保持持唯唯一一。但但假假如如在在不不一一样样作作用用域域内内,允允许许说说明明不不一一样样默默认认形形参参。这这里里作作用用域域是是指指直直接接包包含含着着函函数数原原型型说说明明大大括括号号所所界界定定范范围围。比如:。比如:vintadd(intx=2,inty=5);/全全局局默默认认形形参值参值vvoidmain()vintadd(intx=1,inty=9);/局局部部默默认形参值认形参值3.4默认参数函数默认参数函数C+程序设计程序设计第60页vadd();/此处调用时,采取局部默认形参值,此处调用时,采取局部默认形参值,vx取值取值1,y取值取值9vvvoidfunc(void)vadd()/此此处处调调用用时时,采采取取全全局局默默认认形形参参值值,x取取值值2,y取值取值5v3.4默认参数函数默认参数函数C+程序设计程序设计第61页3.1函数定义与使用函数定义与使用3.2函数调用机制函数调用机制3.3递归函数递归函数3.4默认参数函数默认参数函数3.5内联函数内联函数3.6函数模板函数模板3.7变量作用域变量作用域C+程序设计程序设计第62页3.5内内联联函函数数v内联函数内联函数(也称也称在线函数在线函数)是在是在C+中为中为提升程序提升程序运行效率而引入运行效率而引入。全部函数。全部函数调用时都会产生一些额外调用时都会产生一些额外开销,主要是系统栈保护、代码传递、系统栈恢复以开销,主要是系统栈保护、代码传递、系统栈恢复以及参数传递等。及参数传递等。对于一些对于一些函数体很小函数体很小但又但又经常使用函经常使用函数数,因为被,因为被调用频率非常高调用频率非常高,这种额外开销也就很可,这种额外开销也就很可观,有时甚至会对运行效率产生本质影响。观,有时甚至会对运行效率产生本质影响。C+程序设计程序设计第63页v使用使用内联函数内联函数正是处理这一问题伎俩。正是处理这一问题伎俩。v内内联联函函数数不不是是在在调调用用时时发发生生转转移移,而而是是在在编编译译时时将将函函数数体体嵌嵌入入在在每每一一个个调调用用语语句句处处。这这么么就就相相对对节节约约了了参数传递、系统栈保护与恢复等开销。参数传递、系统栈保护与恢复等开销。v内内联联函函数数在在定定义义时时使使用用关关键键字字inline区区分分于于普普通通函数,其语法形式以下:函数,其语法形式以下:v(含含类类型说明形参表型说明形参表)v函数体函数体3.5内内联联函函数数C+程序设计程序设计第64页比如:比如:vinlineintmul(inta,intb)vreturna*b;v当当程程序序中中出出现现mul(2+3,4)函函数数调调用用时时,编编译译程程序序就就会会将将其其扩扩展展为为(2+3)*4。关关键键字字inline是是一一个个编编译译命命令令,编编译译程程序序在在碰碰到到这这个个命命令令时时将将统统计计下下来来,在在处处理理内内联联函函数数调调用用时时,编编译译程程序序就就试试图图产产生生扩扩展展码码。这这么么从从使使用用者者角角度度来来看看,内内联联函函数数在在语语法法上上与与普普通通函函数数没没有有什什么么区区分分,只只是是在在编编译译程程序序生生成成目目标标代代码码时时才才区区分分处处理。理。3.5内内联联函函数数C+程序设计程序设计第65页v注意:注意:v内内联联函函数数体体内内普普通通不不能能有有循循环环语语句句和和switch语句。语句。v内联函数定义必须出现在第一次被调用之前。内联函数定义必须出现在第一次被调用之前。v假假如如违违反反了了上上述述注注意意事事项项中中任任一一项项,编编译译程程序序就就会会无无视视关关键键字字inline存存在在,像像处处理理普普通通函函数数一一样样处处理理,不不生生成成扩扩展展代代码码。所所以以,只只有有很很简简单单而而使使用用频频率率很很高高函函数数才才被被说说明明为为内内联联函函数数。内内联联函函数数会会扩扩大大目目标标代代码码,使用时要慎重。使用时要慎重。3.5内内联联函函数数C+程序设计程序设计第66页v【例例8】内联函数例题。内联函数例题。v#includev#includevinlineintmax(inta,intb)vvif(ab)vreturna;velsevreturnb;v3.5内内联联函函数数C+程序设计程序设计第67页vvoidmain()vvinta,b,c,d;va=210;vb=150;vc=20;vd=max(a,b);vd=max(d,c);/编译时两个调用处均被编译时两个调用处均被v替换为替换为max函数体语句。函数体语句。3.5内内联联函函数数C+程序设计程序设计第68页vcoutThebiggestofvsetw(5)avsetw(5)bvsetw(5)cisdendl;vv程序运行结果为程序运行结果为vThebiggestof21015020is2103.5内内联联函函数数C+程序设计程序设计第69页回顾回顾C+程序设计程序设计第70页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)/非法非法/非法非法/正当正当/正当正当/正当正当3.4默认参数函数默认参数函数C+程序设计程序设计第71页v使用使用内联函数内联函数正是处理这一问题伎俩。正是处理这一问题伎俩。v内内联联函函数数不不是是在在调调用用时时发发生生转转移移,而而是是在在编编译译时时将将函函数数体体嵌嵌入入在在每每一一个个调调用用语语句句处处。这这么么就就相相对对节节约约了了参数传递、系统栈保护与恢复等开销。参数传递、系统栈保护与恢复等开销。v内内联联函函数数在在定定义义时时使使用用关关键键字字inline区区分分于于普普通通函数,其语法形式以下:函数,其语法形式以下:v(含含类类型说明形参表型说明形参表)v函数体函数体3.5内内联联函函数数C+程序设计程序设计第72页v注意:注意:v内内联联函函数数体体内内普普通通不不能能有有循循环环语语句句和和switch语句。语句。v内联函数定义必须出现在第一次被调用之前。内联函数定义必须出现在第一次被调用之前。v对内联函数不能进行异常接口申明。对内联函数不能进行异常接口申明。v假如违反了上述注意事项中任一项,编译程序假如违反了上述注意事项中任一项,编译程序就会无视关键字就会无视关键字inline存在,像处理普通函数一样处存在,像处理普通函数一样处理,不生成扩展代码。所以,理,不生成扩展代码。所以,只有很简单而使用频率只有很简单而使用频率很高函数才被说明为内联函数很高函数才被说明为内联函数。内联函数会扩大目标。内联函数会扩大目标代码,使用时要慎重。代码,使用时要慎重。3.5内内联联函函数数C+程序设计程序设计第73页3.1函数定义与使用函数定义与使用3.2函数调用机制函数调用机制3.3递归函数递归函数3.4默认参数函数默认参数函数3.5内联函数内联函数3.6函数重载函数重载3.7函数模板函数模板3.8变量作用域变量作用域C+程序设计程序设计第74页【例例7-9】v#includevintadd(intx,inty)vvreturn(x+y);vvdoubleadd(doublex,doubley)vvreturn(x+y);v3.6函函数数重重载载C+程序设计程序设计第75页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+程序设计程序设计第76页3.6函函数数重重载载vC+允许功效相近函数在相同作用域内以相同函数允许功效相近函数在相同作用域内以相同函数名申明,从而形成重载。名申明,从而形成重载。函数重载是指一个函数名能够有函数重载是指一个函数名能够有多个函数实现。多个函数实现。方便使用,便于记忆。方便使用,便于记忆。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+程序设计程序设计第77页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+程序设计程序设计第78页3.6函函数数重重载载不要将不一样功效函数申明为重载函数,以免出现调用不要将不一样功效函数申明为重载函数,以免出现调用结果误解、混同。这么不好:结果误解、混同。这么不好:int add(int x,int y)return x+y;float add(float x,float y)return x-y;注意:注意:C+程序设计程序设计第79页3.6函函数数重重载载例子例子例例9:编写三个名为:编写三个名为addadd重载函数,分别重载函数,分别实现两整数相加、两浮点数相加和三个实现两整数相加、两浮点数相加和三个整数相加功效。整数相加功效。C+程序设计程序设计第80页【例例9】v#includevintadd(intx,inty)vvreturn(x+y);vvdoubleadd(doublex,doubley)vvreturn(x+y);v3.6函函数数重重载载C+程序设计程序设计第81页vintadd(intx,inty,intz)vvreturn(x+y+z- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 函数 公共课 一等奖 全国 获奖 课件
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文