《要点掌握函定义》由会员分享,可在线阅读,更多相关《要点掌握函定义(73页珍藏版)》请在金锄头文库上搜索。
1、第五章第五章函函数数要点:掌握函数的定义,函数的原形,函数的返回值,函数的调用,函数的形式参数和实际参数之间的关系;掌握函数重载的使用方法,关键字inline的含义与使用,掌握变量的作用域与生存期,了解函数的作用域。第五章第五章函函数数第五章第五章C+函数函数重点考核的内容(知识点):重点考核的内容(知识点):1函数的声明格式与定义格式。2函数调用表达式的语法格式及执行过程。3函数定义中形参变量的作用及实虚参数结合的过程。5函数声明(原型)语句的定义格式及作用。6形参为一维数组或二维数组时的说明格式、对应实参的语法规则、调用时数组参数传递的过程。7变量的作用域的概念和含义;系统对全局变量、st
2、atic变量、局部变量的建立和初始化过程。第五章第五章函函数数一般考核的内容(知识点):一般考核的内容(知识点):1函数模板(又称模板函数)的定义格式及其作用。函数模板的实例化,函数模板与一般函数定义之间的优先关系。2函数的递归调用的概念和递归函数的具体执行过程3头文件在程序文件中的位置和作用。4函数声明或定义中可选参数的使用,对应的函数调用的格式及执行过程。5内联函数的定义与作用。6函数重载的概念。l考核要求:考核要求:l掌握以上重点考核的内容,了解其一般考核的内容。l第五章第五章函函数数5.1函数概述函数概述1函函数数:将将大大的的程程序序分分成成功功能能相相对对独独立立的的小小模块,每一
3、个模块称之为函数。模块,每一个模块称之为函数。函数分为用户定义的函数和标准库函数两种。函数分为用户定义的函数和标准库函数两种。一一个个c+程程序序由由一一个个main()函函数数和和若若干干用用户户定定义的函数组成。义的函数组成。第五章第五章函函数数2.函数定义函数定义格式:类型格式:类型函数名函数名(参数表参数表)函数体函数体例如:例如:doublesqare(doublen)returnn*n);第五章第五章函函数数3函数类型函数类型(1)有参数、有返回值有参数、有返回值例例intbigger(inta,intb)return(ab)?a:b;第五章第五章函函数数(2)有参数、无返回值有参
4、数、无返回值例例voiddelay(longa)for(inti=1;i=a;i+)第五章第五章函函数数(3)无参数、有返回值无参数、有返回值例例intgetx()intx;coutx;returnx;第五章第五章函函数数(4)无参数、无返回值无参数、无返回值例例voidmessage()coutthisisamessage.n;第五章第五章函函数数3.函数定义中,若类型省略,默认函数定义中,若类型省略,默认为为int,但一般不要省略。但一般不要省略。例例f(ints)returns+1;例例intf(ints)returns+1;第五章第五章函函数数5.3函数调用函数调用1.函数调用格式与方
5、式。函数调用格式与方式。(1)函数调用格式:函数名函数调用格式:函数名(实参表实参表)(2)函数调用方式函数调用方式l作为表达式的函数调用作为表达式的函数调用l作为语句的函数调用作为语句的函数调用第五章第五章函函数数例:例:#includevoidhi()cout“hi!”endl;doublesquare(doublen)returnn*n;voidmain()doubles=0,i;for(i=1;i=100;i+)s=s+square(i);/作为表达式的函数调用作为表达式的函数调用hi();/作为语句的函数调用作为语句的函数调用cout“1至至100的平方和:的平方和:”s2)retu
6、rn(fib(x-1)+fib(x-2);elsereturn1;第五章第五章函函数数l间间接接递递归归调调用用:函函数数A调调用用函函数数B,而而函函数数B又又调调用用了了函数函数A。例例5.2见书。见书。第五章第五章函函数数(4)递归的条件递归的条件l须有完成函数任务的语句。须有完成函数任务的语句。例:例:#includevoidmain()if(val1)count(val-1);cout”ok:”val1)。l一个递归调用语句:如上一个递归调用语句:如上例例count(val-1)。l先测试,后递归调用。先测试,后递归调用。第五章第五章函函数数例:例:#includevoidmain(
7、)count(val-1);/无穷递归,最终栈空间枯竭而出错无穷递归,最终栈空间枯竭而出错if(val1)cout”ok:”valendl;第五章第五章函函数数(5)消除递归:用非递归函数代替递归函数。消除递归:用非递归函数代替递归函数。例:例:longfact(intn)if(n=1)return1;returnfact(n-1)*n;第五章第五章函函数数例:例:longfact(intn)longtemp=1;for(inti=1;ib)returna;elsereturnb;第五章第五章函函数数4.return语句语句功功能能:将将程程序序的的执执行行返返回回到到函函数数调调用用处处,并
8、并将将其其后后表表达达式式的值作为函数值返回。的值作为函数值返回。(1)return语句后面的括号是可选的。语句后面的括号是可选的。例:例:return(3);等价等价与与return3;第五章第五章函函数数(2)若若函函数数的的返返回回类类型型是是void,在在函函数数体体中中也也可可使使用用return语句,但不能有返回值。语句,但不能有返回值。例:例:voidmessage(inta)if(a10)return;第五章第五章函函数数5.函数原型、函数定义和函数调用的关系函数原型、函数定义和函数调用的关系(1)函数必须先有原型函数必须先有原型(或定义或定义)后调用。后调用。(2)函数定义包
9、含函数原型。函数定义包含函数原型。(3)若函数定义于函数原型之前,则不必给出函数原型。若函数定义于函数原型之前,则不必给出函数原型。(4)若函数定义于函数原型之后,则必须给出函数原型。若函数定义于函数原型之后,则必须给出函数原型。第五章第五章函函数数例:例:#includedoublemax(double,double);/函数原型函数原型voidmain()c=max(a,b);/函数调用函数调用doublemax(doublex,doubley)/函数定义函数定义if(xy)returnx;elsereturny;例:例:#includedoublemax(doublex,doubley)
10、/函数定义函数定义if(xy)returnx;elsereturny;voidmain()c=max(a,b);/函数调用函数调用第五章第五章函函数数6.一一般般,我我们们不不将将函函数数原原型型、函函数数调调用用和和函函数数定定义义放放在在同同一一程程序序文文件件,而而是是分分别别保保存存。函函数数原原型型归归入入头头文文件件,函函数数定定义义归归入入程程序序文文件件,函函数数调调用用归归入入主主程程序序文文件件。从从而而形形成成项项目的多文件结构。目的多文件结构。例:例:/头文件头文件area.hdoublearea(double);/程序文件程序文件area.cpp#include”ar
11、ea.h”#definePI3.14159doublearea(doubler)returnr*r*PI;/主程序文件主程序文件areat.cpp#include”area.h”#includevoidmain()area=area(radius);第五章第五章函函数数7.一个一个c+项目项目(控制台应用程序控制台应用程序)的结构。的结构。主程序文件主程序文件(.cpp)+头文件头文件(.h)程序文件程序文件1(.cpp)+头文件头文件(.h)程序文件程序文件2(.cpp)+头文件头文件(.h)项目项目(.prj)程序文件程序文件n(.cpp)+头文件头文件(.h)第五章第五章函函数数5.4函
12、数调用中的参数传递。函数调用中的参数传递。5.4.1传值方式:形参传值方式:形参=实参的值实参的值例:例:(形参为简单变量形参为简单变量)#includedoubletime2(doublen)n=n*2;returnn;第五章第五章函函数数voidmain()doublem=7.0;coutendlm;coutendltime2(m);coutendlm;结论:当形参为普通变量时,结论:当形参为普通变量时,形参和实参按传值方式结合。形参和实参按传值方式结合。n=m的值的值n*=2;returnn;#includedouble time2(double n) n=n*2; return n;第
13、五章第五章函函数数5.4.2传地址方式:形参传地址方式:形参=实参的值实参的值(地址值地址值)例:例:(形参为数组变量形参为数组变量)设设计计函函数数sum,它它计计算算并并返返回回参参数数数数组组中中所所有有元素的合计值。元素的合计值。/头文件头文件intsum(intarray,intsize);第五章第五章函函数数/程序文件程序文件sum.cpp#include”sum.h”intsum(intarray,intsize)ints=0;for(inti=0;isize;i+)s+=arrayi;returns;第五章第五章函函数数/主程序文件主程序文件sumt.cpp#include#i
14、nclude”sum.h”voidmain()intv1=1,2,3,4,5;coutsum(v1,5)endl;intv2=1,2,3,4,5,6,7,8;coutsum(v2,8)endl;第五章第五章函函数数sum(v1,5)=结论:当参数为数组时,形参和实参按传地址方式结合。结论:当参数为数组时,形参和实参按传地址方式结合。例:见书。例:见书。size=5的值的值 /传值方式传值方式int s=0;for(int i=0;isize;i+) s+=v1i;/传地址方式传地址方式return s;第五章第五章函函数数5.4.3默认参数的函数默认参数的函数1默默认认参参数数:函函数数的的形
15、形参参表表中中,若若给给形形参参定定义义了了默默认认值值,称此参数为默认参数。又称可选参数。称此参数为默认参数。又称可选参数。2函函数数调调用用时时,若若不不给给出出可可选选参参数数所所对对应应的的实实参参,则则实实参取默认值。参取默认值。第五章第五章函函数数例例:intf(inta,charb,charc=z,intd=100);/c、d为默认参数为默认参数f(3,a,b)等价等价于于f(3,a,b,100)f(3,a)等价等价于于f(3,a,z,100)第五章第五章函函数数3可选参数的声明可选参数的声明(1)既既有有函函数数原原型型又又有有函函数数定定义义时时,只只能能在在函函数数原原型型
16、中中声声明明可选参数。函数定义中不允许声明可选参数。可选参数。函数定义中不允许声明可选参数。(2)只有函数定义时,可选参数方可出现在函数定义中。只有函数定义时,可选参数方可出现在函数定义中。第五章第五章函函数数4可选参数的顺序规定可选参数的顺序规定(1)可选参数必须为形参表中最后且连续的若干个参数。可选参数必须为形参表中最后且连续的若干个参数。例:例:voidfunc(inta=1,intb,intc=3,intd=4);/错误错误voidfunc(inta,intb=2,intc=3,intd=4);/正确正确第五章第五章函函数数(2)调调用用具具有有可可选选参参数数的的函函数数时时,被被省
17、省略略的的实实参参只只能能是是最最后后且连续的若干个可选参数。且连续的若干个可选参数。例:例:voidfunc(inta,intb=2,intc=3,intd=4);func(10,15,20,30);/正确正确func();/错误错误func(12,12);/正确正确func(2,15,20);/错误错误例:见书。例:见书。第五章第五章函函数数5.5内联函数内联函数(inlinefunction)1为为提提高高程程序序的的执执行行效效率率和和可可读读性性,一一般般将将只只有有1至至5行行代代码码的的简简单单函函数数声声明明为为内内联联函函数数。内内联联函函数数必必须须在在被被调用之前声明或调
18、用。调用之前声明或调用。例:例:inlineintadd2(intn)returnn+2;第五章第五章函函数数2内联函数的函数体限制。内联函数的函数体限制。(1)内联函数只适合于只有内联函数只适合于只有1至至5行的小函数。行的小函数。(2)递归函数不能用作为内联函数。递归函数不能用作为内联函数。(3)内内联联函函数数体体中中,不不能能含含有有复复杂杂的的结结构构控控制制语语句句。如如:switch和和while语句等。语句等。第五章第五章函函数数5.6重载函数重载函数(functionoverloading)1函函数数重重载载:即即允允许许定定义义同同名名的的函函数数,但但重重载载的的函函数数
19、必必须须在在形形参参的的数数量量或或类类型型上上或或顺顺序序上上与与其其他他同同名名函函数数有有所所不同。不同。例:例:longadd(longa,longb)returna+b;longadd(doublea,doubleb)returna+b;第五章第五章函函数数2形式参数:函数原型或函数定义中的参数。简称形参。形式参数:函数原型或函数定义中的参数。简称形参。实在参数:函数调用中的参数。简称实参。实在参数:函数调用中的参数。简称实参。3 函函 数数 重重 载载 的的 内内 部部 实实 现现 方方 法法 -名名 字字 粉粉 碎碎 (namemangling)名名字字粉粉碎碎:c+根根据据函函
20、数数名名和和参参数数信信息息来来生生成成内内部部函函数数名的方法。名的方法。第五章第五章函函数数例:例:重载函数重载函数内部函数名内部函数名intf(chara);f_cintf(chara,intb,doublec);f_cidintf_cid();f_cidv第五章第五章函函数数5可选参数与函数重载可选参数与函数重载例:例:intf(intk,intm=0,doubled=0.0);则函数调用则函数调用f(3,5,6.7);/正确正确f(3,5);/正确正确f(3);/正确正确第五章第五章函函数数但以下函数均不能重载:但以下函数均不能重载:intf(intk,intm=0,doubled=
21、0.0);intf(int);/f(2)调用谁调用谁?intf(int,int);/f(2,3)调用谁调用谁?intf(int,int,double);/f(2,3,5.0)调用谁调用谁?intf(int,double=0.0);/f(2)调用谁调用谁?结结论论:对对有有可可选选参参数数的的函函数数,在在逐逐个个去去掉掉可可选选参参数数后后形形成的函数不能重载。成的函数不能重载。第五章第五章函函数数例:例:若有若有intfp(charc,intk=0,doubled=100.0);则下列函数中可以重载的是则下列函数中可以重载的是(A,D)A.intfp();B.voidfp(charc);C.
22、intfp(char,int);D.voidfp(char,int,int);第五章第五章函函数数5.7函数和变量的作用域函数和变量的作用域1.一个一个c+项目项目(控制台应用程序控制台应用程序)的结构。的结构。主程序文件主程序文件(.cpp)+头文件头文件(.h)程序文件程序文件1(.cpp)+头文件头文件(.h)程序文件程序文件2(.cpp)+头文件头文件(.h)项目项目(.prj)程序文件程序文件n(.cpp)+头文件头文件(.h)第五章第五章函函数数2.几个概念几个概念l跨跨文文件件作作用用域域:不不仅仅在在定定义义它它的的程程序序文文件件中中有有作作用用,在在同一项目的其它程序文件中
23、也有作用。又称全局作用域。同一项目的其它程序文件中也有作用。又称全局作用域。l文件作用域:仅在定义它的程序文件中有作用。文件作用域:仅在定义它的程序文件中有作用。l局部作用域:仅在定义它的函数或块中有作用。局部作用域:仅在定义它的函数或块中有作用。第五章第五章函函数数l静静态态生生命命期期:整整个个应应用用程程序序运运行行期期间间不不会会消失消失(死亡死亡)。l局局部部生生命命期期:在在定定义义它它的的函函数数或或块块运运行行结结束立即消失束立即消失(死亡死亡)。又称自动生命期。又称自动生命期。第五章第五章函函数数3.结论结论第五章第五章函函数数5.7.2变量的作用域和生存期变量的作用域和生存
24、期1全局变量全局变量例例1(无修饰的全局变量无修饰的全局变量)/ch61.prjch61.cppch611.cpp/ch61.cpp#includevoidfn1();voidfn2();intn;/全局变量全局变量voidmain()n=3;fn1();coutnendl;voidfn1()fn2();/ch611.cppexternintn;/n是是另另一一程程序序文文件件中中定定义的全局变量义的全局变量voidfn2()n=8;结果:结果:8第五章第五章函函数数例例2(static修饰的全局变量修饰的全局变量)/ch62.prjch62.cppch621.cpp/ch62.cpp#inc
25、ludevoidfn();intn;/全局变量全局变量voidmain()n=20;coutnendl;fn();/ch621.cppstaticintn;/默认初始化为默认初始化为0voidfn()n+;coutnendl;结果:结果:201若将若将static改成改成extern,则则结果:结果:2021第五章第五章函函数数6局部变量局部变量例例1(无修饰的局部变量无修饰的局部变量)#includevoidmain()intx=5,y=1;/局部变量局部变量coutx1=x,y=yendl;intx=3;/局部变量局部变量coutx2=x,y=yendl;coutx3=x,y=yendl;
26、结果结果:x1=5,y=1x2=3,y=1x3=5,y=1第五章第五章函函数数例例2(无修饰的局部变量无修饰的局部变量)#includevoidmain()voidincreament();increament();increament();increament();voidincreament()inti=0;/局部变量局部变量i+;couti,;结果:结果:1,1,1第五章第五章函函数数例例3(static修饰的局部变量修饰的局部变量)#includevoidmain()voidincrement();increament();increament();increament();voidi
27、ncrement()staticinti;/static修饰的局部变量修饰的局部变量i+;coutix,;结果:结果:1,2,3第五章第五章函函数数例例4(综合举例综合举例)#includevoidfunc();intn=1;/全局变量全局变量voidmain()staticinta;/静态局部变量静态局部变量intb=-10;func();couta:ab:bn:nendl;b+=4;couta:ab:bn:nendl;n+=10;func();voidfunc()staticinta=2;/静态局部变量静态局部变量intb=5;/局部变量局部变量a+=2;n+=12;b+=5;couta:
28、ab:bn:nendl;结果:结果:a:0b:-10n:1a:4b:10n:13a:0b:-6n:13a:6b:10n:35第五章第五章函函数数5.7.1函数的作用域函数的作用域1函函数数原原型型或或函函数数定定义义时时,若若加加上上extern修修饰饰或或无无任任何修饰时,具有跨文件作用域。何修饰时,具有跨文件作用域。2函函数数原原型型或或函函数数定定义义时时,若若用用static修修饰饰,称称为为静静态态函数,具有文件作用域。函数,具有文件作用域。3函数均具有静态生存期。函数均具有静态生存期。第五章第五章函函数数例:例:/file1.cppvoidfn();voidfn1();voidma
29、in()fn();fn1();/file2.cpp#includevoidfn();staticvoidfn1();/文件作用域文件作用域voidfn()voidfn1()说说明明:fn1()具具有有文文件件作作用用域域,即即只只在在file2.cpp中中有有作作用用,file1.cpp中中调调用用fn1(),会产生错误。会产生错误。第五章第五章函函数数5.8函数模板函数模板(functiontemplate)1.函函数数模模板板:一一系系列列相相关关函函数数定定义义的的模模型型或或样样板板。这这些些函函数数的的代代码码除除了了因因数数据据类类型型不不同同而而有有所所差差异异外,其结构基本相同
30、。函数模板可归入头文件。外,其结构基本相同。函数模板可归入头文件。第五章第五章函函数数例:例:对函数对函数max(x,y)intmax(inta,intb)return(ab)?a:b;longmax(longa,longb)return(ab)?a:b;floatmax(floata,floatb)return(ab)?a:b;doublemax(doublea,doubleb)return(ab)?a:b;可定义一个样板。可定义一个样板。第五章第五章函函数数2.格式:格式:template函数定义函数定义例例:templateTmax(Tx,Ty)return(xy)?x:y;3.模板的实
31、例化模板的实例化(1)函函数数调调用用时时,编编译译根根据据实实参参的的类类型型(如如int)替替代代虚虚拟拟类类型型(如如T),并生成相应的函数定义代码的过程。并生成相应的函数定义代码的过程。第五章第五章函函数数例:例:couty)?x:y;例:例:couty)?x:y;例:例:coutmax(3,5.0);/无法实例化无法实例化第五章第五章函函数数(2)解决方法解决方法A.强制实例化:函数调用时插入模板实参表。强制实例化:函数调用时插入模板实参表。例:例:lcoutmax(3,5.0);l实实例例化化:intmax(intx,inty)return(xy)?x:y;lcoutmax(3,5
32、.0);l实例化:实例化:doublemax(doublex,doubley)return(xy)?x:y;第五章第五章函函数数B.模板形参表中设置多个实参。模板形参表中设置多个实参。例:例:templateT1max(T1x,T2y)returnx(T1)y?x:(T1)y;第五章第五章函函数数4.函函数数模模板板形形参参表表中中,class说说明明的的为为虚虚拟拟类类型型参参数数,亦亦可可有有一一般般类类型型修修饰饰符符(如如:int,double等等)说说明明的的常常规规参参数数。调用具有常规参数的模板函数必须强制实例化。调用具有常规参数的模板函数必须强制实例化。例:使用函数模板。例:使
33、用函数模板。/ch520.cpp#include#include第五章第五章函函数数templateTypemax(Typed1,Typed2)if(d1d2)returnd1;elsereturnd2;intmax(int,int);charmax(char,char);char*max(char*str1,char*str2);/重载模板函数重载模板函数voidmain()intival1=10,ival2=4;floatfval1=12.3,fval2=45.67;coutmax(ival1,ival2)endl;coutmax(fval1,fval2)endl;coutmax(a,A)endl;coutmax(“hello”,”hello,world”)0)returns1;elsereturns2;