第03章函数精选文档.ppt

上传人:石*** 文档编号:77732620 上传时间:2023-03-16 格式:PPT 页数:80 大小:3.42MB
返回 下载 相关 举报
第03章函数精选文档.ppt_第1页
第1页 / 共80页
第03章函数精选文档.ppt_第2页
第2页 / 共80页
点击查看更多>>
资源描述

《第03章函数精选文档.ppt》由会员分享,可在线阅读,更多相关《第03章函数精选文档.ppt(80页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第03章函数章函数本讲稿第一页,共八十页l函数是函数是C+程序的基本模块。可将一些程序的基本模块。可将一些功能相对独立的功能相对独立的或或经常使用经常使用的操作或运算抽象出来,定义为函数。使用时的操作或运算抽象出来,定义为函数。使用时只要考虑其功能和使用接口即可。只要考虑其功能和使用接口即可。l 在结构化程序设计中,函数是将任务进行模块划分在结构化程序设计中,函数是将任务进行模块划分的基本单位。的基本单位。l 在面向对象的程序设计中,在面向对象的程序设计中,类中所封装类中所封装的的操作操作是用是用函函数数进行描述的,因此函数在进行描述的,因此函数在C+程序中具有非常重要的程序中具有非常重要的

2、意义。意义。l 要掌握函数的使用,必须理解要掌握函数的使用,必须理解函数调用函数调用时的时的内部实内部实现机制现机制,以及与此相关的,以及与此相关的内存分配机制内存分配机制、变量、变量生命期生命期和和作用域作用域。l 本章还将介绍关于函数重载的概念,介绍递归算法、本章还将介绍关于函数重载的概念,介绍递归算法、内联函数、默认参数函数的概念和运行库函数。内联函数、默认参数函数的概念和运行库函数。函数意义函数意义2本讲稿第二页,共八十页本章主要内容本章主要内容l函数的声明和调用函数的声明和调用l函数间的参数传递函数间的参数传递l内联函数内联函数l带默认形参值的函数带默认形参值的函数l函数重载函数重载

3、lC+系统函数系统函数3本讲稿第三页,共八十页函数概述函数概述函数是函数是C+C+程序的基本组成模块。程序的基本组成模块。通通过过函函数数,可可以以把把一一个个复复杂杂任任务务分分解解成成为为若若干干个个易易于于解解决决的的小小任任务务。充充分分体体现现结结构构化化程程序序设设计计由由粗粗到到精精,逐逐步步细细化化的的设计思想。设计思想。组组 成成 C+C+程程 序序 的的 若若 干干 函函 数数 中中,有有 一一 个个 称称 为为main()main()(Winmain()Winmain())函函数数,是是程程序序执执行行的的入入口口,它它可可以以调调用用其其他他函函数数。而而其其他他一一般

4、般函函数数既既可可以以调调用用也也可可以以被被调调用用。函函数数之之间间的的调调用关系见下图:用关系见下图:4本讲稿第四页,共八十页函数概述函数概述函数的声明与使用main()fun2()fun1()fun3()fun1_1()fun2_1()fun2_2()图图 函数调用层次关系函数调用层次关系5本讲稿第五页,共八十页函数概述函数概述函数的声明与使用 函数按其是否系统预定义分为两类,一类是函数按其是否系统预定义分为两类,一类是编译系编译系统预定义统预定义的,称为的,称为库函数库函数或或标准函数标准函数,如一些常用的数,如一些常用的数学计算函数、字符串处理函数、图形处理函数、标准输学计算函数、

5、字符串处理函数、图形处理函数、标准输入输出函数等。这些入输出函数等。这些库函数都按功能分类,集中说明在不库函数都按功能分类,集中说明在不同的头文件中同的头文件中。用户只需在自己的程序中包含某个头文件,就。用户只需在自己的程序中包含某个头文件,就可直接使用该文件中定义的函数。可直接使用该文件中定义的函数。另一类是另一类是用户自定义函数用户自定义函数,用户可以根据需要将某个,用户可以根据需要将某个具有相对独立功能的程序定义为函数。具有相对独立功能的程序定义为函数。函数函数按是否带有参数,分为按是否带有参数,分为:无参函数无参函数和和有参函数有参函数6本讲稿第六页,共八十页函数的声明函数的声明l函数

6、是面向对象程序设计中,对功能的函数是面向对象程序设计中,对功能的抽象抽象l函数声明的语法形式函数声明的语法形式类型标识符 函数名(形式参数表)语句序列函数的声明与使用若无参数,写若无参数,写void是被初始化的内部变量,寿命和可见性仅限于函数内部若无返回值,写若无返回值,写void7本讲稿第七页,共八十页函数的声明函数的声明l形式参数表形式参数表 name1,name2,.,namenl函数的返回值函数的返回值由 return 语句给出,例如:return 0无返回值的函数(void类型),不必写return语句。函数的声明与使用8本讲稿第八页,共八十页无参函数无参函数函数的声明与使用定义格式

7、为:定义格式为:数据类型数据类型 函数名函数名(void)(void)函数体函数体 例例:下面函数的功能是打印一个表头下面函数的功能是打印一个表头void TableHead()cout*endl;cout*example *endl;cout*=b?a:b);10本讲稿第十页,共八十页提示提示函数的声明与使用 定义函数时可能会涉及若干个变量,究竟哪些变量应当作为函数的参数定义函数时可能会涉及若干个变量,究竟哪些变量应当作为函数的参数?哪些应当定义在函数体内?这有一个原则:作为一个相对独立的模块,?哪些应当定义在函数体内?这有一个原则:作为一个相对独立的模块,函函数在使用时完全可以被看成数在使

8、用时完全可以被看成 “黑匣子黑匣子”,除了输入输出外,其他部分可不必关心,除了输入输出外,其他部分可不必关心。从函数的定义看出,从函数的定义看出,函数头函数头正是用来反映函数的功能和使用接口,它所定义正是用来反映函数的功能和使用接口,它所定义的是的是“做什么做什么”,在这部分必须明确,在这部分必须明确“黑匣子黑匣子”的输入输出部分,的输入输出部分,输出就是函输出就是函数的数的返回值返回值,输入就是,输入就是参数参数。因此,只有那些功能上起自变量作用的变量才必。因此,只有那些功能上起自变量作用的变量才必须作为参数定义在参数表中;须作为参数定义在参数表中;函数体函数体中具体描述中具体描述“如何做如

9、何做”,因此除参数之外的,因此除参数之外的为实现算法所需用的变量应当定义在函数体内。为实现算法所需用的变量应当定义在函数体内。C+C+中不允许函数的中不允许函数的嵌套定义嵌套定义,即在一个函数中定义另一个函数。,即在一个函数中定义另一个函数。11本讲稿第十一页,共八十页函数的调用函数的调用l调用前调用前先声明函数原型先声明函数原型:在调用函数中,或程序文件中所有函数之外,按如下形式说明:类型标识符 被调用函数名(含类型说明的形参表);l调用形式调用形式 函数名(实参列表)l嵌套调用嵌套调用函数可以嵌套调用,但不允许嵌套定义。l递归调用递归调用函数直接或间接调用自身。函数的声明与使用12本讲稿第

10、十二页,共八十页13 下下面面是是一一个个使使用用结结构构化化程程序序设设计计思思想想开开发发的的企企业业管管理理报报表表程程序序的的框框架架。它使用了函数原型说明。它使用了函数原型说明。#include void menu_print();void account_report();void engineering_report();void marketing_report();void main()int choice;do menu_print();cinchoice;while(choice=4);switch(choice)case 1:account_report();break

11、;case 2:engineering_report();break;case 3:marketing_report();break;13本讲稿第十三页,共八十页14void menu_print()cout”系统功能:系统功能:”endl;cout”1财务报表财务报表”endl;cout”2工程报表工程报表”endl;cout”3市场报表市场报表”endl;cout”选择业务序号:选择业务序号:”;void account_report()/生成财务报表生成财务报表void engineering_report()/生成工程报表生成工程报表 void marketing_report()/生

12、成市场报表;生成市场报表;14本讲稿第十四页,共八十页例例3-1编写一个求编写一个求x的的n次方的函数次方的函数#include using namespace std;doublepower(double x,int n);void main(void)cout 5 to the power 2 is power(5,2)endl;doublepower(double x,int n)double val=1.0;while(n-)val=val*x;return(val);函数的声明与使用15本讲稿第十五页,共八十页运行结果:运行结果:5 to the power 2 is 25例例3-1

13、编写一个求编写一个求x的的n次方的函数次方的函数函数的声明与使用16本讲稿第十六页,共八十页例例3-2 数制转换数制转换题目:题目:输入一个输入一个8位二进制数,将其转换位二进制数,将其转换为十进制数输出。为十进制数输出。例如:例如:11012=1(23)+1(22)+0(21)+1(20)=1310 所以,如果输入所以,如果输入1101,则应输出,则应输出13函数的声明与使用17本讲稿第十七页,共八十页#include using namespace std;double power(double x,int n);void main(void)int i;int value=0;char

14、ch;cout=0;i-)cin ch;if(ch=1)value+=int(power(2,i);cout Decimal value is valueendl;double power(double x,int n)double val=1.0;while(n-)val*=x;return(val);运行结果:运行结果:Enter an 8 bit binary number 01101001Decimal value is 10518本讲稿第十八页,共八十页例例3-3编写程序求编写程序求的值的值其中其中arctan用如下形式的级数计算:用如下形式的级数计算:直直到到级级数数某某项项绝绝对

15、对值值不不大大于于10-15为为止止;和和x均为均为double型。型。函数的声明与使用19本讲稿第十九页,共八十页#includeusing namespace std;void main()double a,b;double arctan(double x);/函数原型声明函数原型声明 a=16.0*arctan(1/5.0);b=4.0*arctan(1/239.0);/注意:因为整数相除结果取整,注意:因为整数相除结果取整,/如果参数写如果参数写1/5,1/239,结果就都是,结果就都是0 coutPI=a-b1e-15)f=e/i;r=(i%4=1)?r+f:r-f ;e=e*sqr

16、;i+=2;return r;运行结果:运行结果:PI=3.1415921本讲稿第二十一页,共八十页例例3-4l寻找并输出寻找并输出11999之间的数之间的数m,它满足,它满足m、m2和和m3均为回文数。均为回文数。回文:各位数字左右对称的整数。例如:11满足上述条件 112=121,113=1331。l分析:分析:10取余的方法,从最低位开始,依次取出该数的各位数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。函数的声明与使用22本讲稿第二十二页,共八十页#include using namespace std;void main()bool symm(long n);l

17、ong m;for(m=11;m1000;m+)if(symm(m)&symm(m*m)&symm(m*m*m)coutm=m m*m=m*m m*m*m=m*m*mendl;23本讲稿第二十三页,共八十页bool symm(long n)long i,m;i=n;m=0;while(i)m=m*10+i%10;i=i/10 ;return(m=n);24本讲稿第二十四页,共八十页运行结果:运行结果:m=11 m*m=121 m*m*m=1331m=101 m*m=10201 m*m*m=1030301m=111 m*m=12321 m*m*m=136763125本讲稿第二十五页,共八十页例例

18、3-5计算如下公式,并输出结果:计算如下公式,并输出结果:其中其中r、s的值由键盘输入。的值由键盘输入。SIN x的近的近似值按如下公式计算,计算精度为似值按如下公式计算,计算精度为10-6:函数的声明与使用26本讲稿第二十六页,共八十页#include#includeusing namespace std;void main()double k,r,s;double tsin(double x);coutr;couts;if(r*r=s*s)k=sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s);else k=tsin(r*s)/2;coutk=p);return g;

19、运行结果:r=5s=81.3778128本讲稿第二十八页,共八十页例例3-6投骰子的随机游戏投骰子的随机游戏游游戏戏规规则则是是:每每个个骰骰子子有有六六面面,点点数数分分别别为为1、2、3、4、5、6。游游戏戏者者在在程程序序开开始始时时输输入入一一个个无无符符号号整整数数,作为产生随机数的种子。作为产生随机数的种子。每每轮轮投投两两次次骰骰子子,第第一一轮轮如如果果和和数数为为7或或11则则为为胜胜,游游戏戏结结束束;和和数数为为2、3或或12则则为为负负,游游戏戏结结束束;和和数数为为其其它它值值则则将将此此值值作作为为自自己己的的点点数数,继继续续第第二二轮轮、第第三三轮轮.直直到到某

20、某轮轮的和数等于点数则取胜,若在此前出现和数为的和数等于点数则取胜,若在此前出现和数为7则为负。则为负。由由rolldice函函数数负负责责模模拟拟投投骰骰子子、计计算算和和数数并并输输出出和和数。数。函数的声明与使用29本讲稿第二十九页,共八十页#include#include using namespace std;int rolldice(void);void main()int gamestatus,sum,mypoint;unsigned seed;coutseed;/输入随机数种子输入随机数种子 srand(seed);/将种子传递给将种子传递给rand()sum=rolldice

21、();/第一轮投骰子、计算和数第一轮投骰子、计算和数30本讲稿第三十页,共八十页 switch(sum)case 7:/如果和数为如果和数为7或或11则为胜则为胜,状态为状态为1 case 11:gamestatus=1;break;case 2:/和数为和数为2、3或或12则为负则为负,状态为状态为2 case 3:case 12:gamestatus=2;break;default:/其它情况其它情况,游戏尚无结果游戏尚无结果,状态为状态为0,记下点数记下点数,为下一轮做准备为下一轮做准备 gamestatus=0;mypoint=sum ;coutpoint is mypointendl

22、;break;31本讲稿第三十一页,共八十页 while(gamestatus=0 )/只要状态仍为只要状态仍为 0,就继续进行下一轮就继续进行下一轮 sum=rolldice();if(sum=mypoint)/某轮的和数等于点数则取胜某轮的和数等于点数则取胜,状态置为状态置为1 gamestatus=1 ;else if(sum=7 )/出现和数为出现和数为7则为负则为负,状态置为状态置为2 gamestatus=2;/当状态不为当状态不为0时上面的循环结束时上面的循环结束,以下程序段输出游戏结果以下程序段输出游戏结果 if(gamestatus=1 )coutplayer winsn;e

23、lse coutplayer losesn;32本讲稿第三十二页,共八十页lrand函数原型:int rand(void);所需头文件:功能和返回值:求出并返回一个伪随机数lsrand函数原型:void srand(unsigned int seed);参数:seed产生随机数的种子。所需头文件:功能:为使rand()产生一序列伪随机整数而设置起始点。使用1作为seed参数,可以重新初化rand()。33本讲稿第三十三页,共八十页int rolldice(void)/投骰子、计算和数、输出和数投骰子、计算和数、输出和数 int die1,die2,worksum;die1=1+rand()%6

24、;die2=1+rand()%6;worksum=die1+die2;coutplayer rolled die1+die2=worksumendl;return worksum;34本讲稿第三十四页,共八十页运行结果运行结果2:Please enter an unsigned integer:23player rolled 6+3=9point is 9player rolled 5+4=9player wins35本讲稿第三十五页,共八十页函数调用的执行过程函数调用的执行过程函数的声明与使用main()调fun()结束fun()返回保存:返回地址当前现场恢复:主调程序现场返回地址36本讲稿

25、第三十六页,共八十页嵌套调用嵌套调用函数的声明与使用main调fun1()结束fun1()调fun2()返回fun2()返回37本讲稿第三十七页,共八十页例例3-6 输入两个整数,求平方和。输入两个整数,求平方和。#include#include using namespace std;using namespace std;void main(void)void main(void)int a,b;int a,b;int fun1(int x,int y);int fun1(int x,int y);cinab;cinab;couta couta、b b的平方和:的平方和:fun1fun1(

26、a,b)endl;(a,b)endl;函数的声明与使用38本讲稿第三十八页,共八十页int int fun1fun1(int x,int y)(int x,int y)int int fun2fun2(int m);(int m);return(fun2(x)+fun2(y);return(fun2(x)+fun2(y);int int fun2fun2(int m)(int m)return(m*m);return(m*m);运行结果:运行结果:3 43 4a a、b b的平方和:的平方和:252539本讲稿第三十九页,共八十页递归调用递归调用l函数直接或间接地调用自身,称为递归调用。l递归

27、过程的两个阶段:递推:4!=43!3!=32!2!=21!1!=10!0!=1未知 已知回归:4!=43!=243!=32!=62!=21!=21!=10!=10!=1未知 已知函数的声明与使用40本讲稿第四十页,共八十页例例3-8 求求n!分析:计算n!的公式如下:这是一个递归形式的公式,应该用递归函数实现。函数的声明与使用41本讲稿第四十一页,共八十页源程序:源程序:#include#include using namespace std;using namespace std;long long facfac(int n)(int n)long f;long f;if(n0)if(n0)

28、coutn0,data error!endl;coutn0,data error!endl;else if(n=0)f=1;else if(n=0)f=1;else f=else f=facfac(n-1)*n;(n-1)*n;return(f);return(f);42本讲稿第四十二页,共八十页void main()void main()long fac(int n);long fac(int n);int n;int n;long y;long y;coutEnter a positive integer:;coutn;cinn;y=y=facfac(n);(n);coutn!=yendl

29、;coutn!=yendl;运行结果:运行结果:Enter a positive integer:8Enter a positive integer:88!=403208!=4032043本讲稿第四十三页,共八十页例例3-9l用递归法计算从用递归法计算从n个人中选择个人中选择k个人组个人组成一个委员会的不同组合数。成一个委员会的不同组合数。l分析:分析:由n个人里选k个人的组合数=由n-1个人里选k个人的组合数 +由n-1个人里选k-1个人的组合数当n=k或k=0时,组合数为1函数的声明与使用44本讲稿第四十四页,共八十页#includeusing namespace std;void mai

30、n()int n,k;int comm(int n,int k);cinnk;coutcomm(n,k)n )return 0;else if(n=k|k=0 )return 1;else return comm(n-1,k)+comm(n-1,k-1);运行结果:18 5856845本讲稿第四十五页,共八十页例例3-10汉诺塔问题汉诺塔问题有三根针有三根针A、B、C。A针上有针上有N个盘子,大的个盘子,大的在下,小的在上,要求把这在下,小的在上,要求把这N个盘子从个盘子从A针移到针移到C针,在移动过程中可以借助针,在移动过程中可以借助B针,每次只允许移动针,每次只允许移动一个盘,且在移动过程

31、中在三根针上都保持大盘在一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。下,小盘在上。函数的声明与使用ABC46本讲稿第四十六页,共八十页分析:分析:将将n 个盘子从个盘子从A针移到针移到C针可以分解为下面三个步骤:针可以分解为下面三个步骤:将将A 上上n-1个盘子移到个盘子移到 B针上(借助针上(借助C针)针);把把A针上剩下的一个盘子移到针上剩下的一个盘子移到C针上针上;将将n-1个盘子从个盘子从B针移到针移到C针上(借助针上(借助A针)针);事实上,上面三个步骤包含两种操作:事实上,上面三个步骤包含两种操作:将多个盘子从一个针移到另一个针上,这是一个递归的将多个盘子从一个针移到

32、另一个针上,这是一个递归的过程。过程。hanoi函数实现。函数实现。将将1个盘子从一个针上移到另一针上。个盘子从一个针上移到另一针上。用用move函数实现。函数实现。本讲稿第四十七页,共八十页#include using namespace std;void move(char getone,char putone)cout getone putoneendl;void hanoi(int n,char one,char two,char three)void move(char getone,char putone);if(n=1)move(one,three);else hanoi(n-1

33、,one,three,two);move(one,three);hanoi(n-1,two,one,three);48本讲稿第四十八页,共八十页void main()void hanoi(int n,char one,char two,char three);int m;coutm;coutthe steps to moving m diskes:CA-BC-BA-CB-AB-CA-C50本讲稿第五十页,共八十页函数的参数传递机制函数的参数传递机制 传递参数值传递参数值l在函数被调用时才分配形参的存储单在函数被调用时才分配形参的存储单元。元。l实参可以是常量、变量或表达式。实参可以是常量、变量

34、或表达式。l实参类型必须与形参相符。实参类型必须与形参相符。l传递时是传递参数值,即单向传递。传递时是传递参数值,即单向传递。函数的声明与使用51本讲稿第五十一页,共八十页函数的参数传递机制函数的参数传递机制 参数值传递举例参数值传递举例XN被调函数:被调函数:主调函数:主调函数:3 2.5AD=power(A,3)2.53double power(double X,int N)函数的声明与使用52本讲稿第五十二页,共八十页例例3-11 输入两输入两 整数交换后输出整数交换后输出#includeusing namespace std;void Swap(int a,int b);int mai

35、n()int x(5),y(10);coutx=x y=yendl;Swap(x,y);coutx=x y=yendl;return 0;函数的声明与使用53本讲稿第五十三页,共八十页void Swap(int a,int b)int t;t=a;a=b;b=t;运行结果运行结果:x=5 y=10 x=5 y=1054本讲稿第五十四页,共八十页a=b;5 x10 y5 a10 b执行主函数中的函数调用Swap(x,y);t=a;5 x10 y5 a10 b5tb=t;5 x10 y10 a5 b5t5 x10 y10 a10 b5t在Swap子函数中返回主函数以后5x10y5555本讲稿第五十

36、五页,共八十页调用调用power(4.6,3)函数函数power(4.6,3)return 97.336 主程序后续语句主程序后续语句n=3x=4.6c=a说明实参和形参对应关系的示例。说明实参和形参对应关系的示例。#include#includefloat power(float x,int n)/求求x x的的n n次幂次幂float pow=1;while(n-)pow*=x;return pow;void main()int n=3;float x=4.6;char c=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)e

37、ndl;coutpower(n,x)=power(n,x)endl;56本讲稿第五十六页,共八十页调用调用power(a,3)函数函数power(a,3)return 912673 主程序后续语句主程序后续语句n=3x=4.6c=a说明实参和形参对应关系的示例。说明实参和形参对应关系的示例。#include#includefloat power(float x,int n)/求求x x的的n n次幂次幂float pow=1;while(n-)pow*=x;return pow;void main()int n=3;float x=4.6;char c=a;coutpower(x,n)=pow

38、er(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)endl;57本讲稿第五十七页,共八十页调用调用power(3,4.6)函数函数power(3,4.6)return 81 主程序后续语句主程序后续语句n=3x=4.6c=a说明实参和形参对应关系的示例。说明实参和形参对应关系的示例。#include#includefloat power(float x,int n)/求求x x的的n n次幂次幂float pow=1;while(n-)pow*=x;return pow;void main()int n=3;f

39、loat x=4.6;char c=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)endl;58本讲稿第五十八页,共八十页函数的参数传递函数的参数传递 用引用做形参用引用做形参l引用引用(&)是标识符的别名是标识符的别名,例如例如:int i,j;int&ri=i;/建立一个int型的引用ri,并将其 /初始化为变量i的一个别名j=10;ri=j;/相当于 i=j;l声明一个引用时,必须同时对它进行初始化,使声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的

40、对象。它指向一个已存在的对象。l一旦一个引用被初始化后,就不能改为指向其它对一旦一个引用被初始化后,就不能改为指向其它对象。象。l引用可以作为形参引用可以作为形参 void swap(int&a,int&b).函数的声明与使用59本讲稿第五十九页,共八十页例例3-12 输入两个整数交换后输出输入两个整数交换后输出#includeusing namespace std;void Swap(int&a,int&b);int main()int x(5),y(10);coutx=x y=yendl;Swap(x,y);coutx=x y=yendl;return 0;void Swap(int&a,

41、int&b)int t;t=a;a=b;b=t;函数的声明与使用运行结果运行结果:x=5 y=10 x=10 y=560本讲稿第六十页,共八十页t=a;x x5t5x 的别名a ax xy y510y 的别名x 的别名a ab by 的别名x 的别名a ab bx x10y y10a=bb=t;y5t5y 的地址b bx xy y105Swap(x,y);61本讲稿第六十一页,共八十页内联函数声明与使用内联函数声明与使用l声明时使用关键字声明时使用关键字 inline。l编译时在调用处用函数体进行替换编译时在调用处用函数体进行替换,节节省了参数传递、控制转移等开销。省了参数传递、控制转移等开销

42、。l注意:注意:内联函数体内不能有循环语句和switch语句。内联函数的声明必须出现在内联函数第一次被调用之前。对内联函数不能进行异常接口声明。内联函数62本讲稿第六十二页,共八十页例例3-14 内联函数应用举例内联函数应用举例#includeusing namespace std;inline double CalArea(double radius)return 3.14*radius*radius;int main()double r(3.0);double area;area=CalArea(r);coutareaendl;return 0;内联函数63本讲稿第六十三页,共八十页默认形

43、参值的作用默认形参值的作用l函数在声明时可以预先给出默认的形参值,调用函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给时如给出实参,则采用实参值,否则采用预先给出的默认形参值。出的默认形参值。l例如:例如:int add(int x=5,int y=6)return x+y;void main(void)add(10,20);/10+20 add(10);/10+6 add();/5+6带默认形参值的函数64本讲稿第六十四页,共八十页默认形参值的说明次序默认形参值的说明次序l默认形参值必须默认形参值必须从右向左从右向左顺序声明,并顺序声明,并且在默认形参值的

44、右面不能有非默认形且在默认形参值的右面不能有非默认形参值的参数。因为调用时实参取代形参参值的参数。因为调用时实参取代形参是从左向右的顺序。是从左向右的顺序。l例:例:int add(int x,int y=5,int z=6);/正确int add(int x=1,int y=5,int z);/错误int add(int x=1,int y,int z=6);/错误带默认形参值的函数65本讲稿第六十五页,共八十页默认形参值与函数的调用位置默认形参值与函数的调用位置l调用出现在函数体实现之前时,默认形参值必须调用出现在函数体实现之前时,默认形参值必须在函数原形中给出;而当调用出现在函数体实现在

45、函数原形中给出;而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。之后时,默认形参值需在函数实现时给出。l例:例:int add(int x=5,int y=6);void main(void)add();/调用在实现前int add(int x,int y)return x+y;int add(int x=5,int y=6)return x+y;void main(void)add();/调用在实现后带默认形参值的函数66本讲稿第六十六页,共八十页默认形参值的作用域默认形参值的作用域l在相同的作用域内,默认形参值的说明应保在相同的作用域内,默认形参值的说明应保持唯一,但如果在不

46、同的作用域内,允许说持唯一,但如果在不同的作用域内,允许说明不同的默认形参。明不同的默认形参。l例:例:int add(int x=1,int y=2);void main(void)int add(int x=3,int y=4);add();/使用局部默认形参值(实现3+4)void fun(void).add();/使用全局默认形参值(实现1+2)带默认形参值的函数67本讲稿第六十七页,共八十页重载函数的声明重载函数的声明lC+允许功能相近的函数在相同的作用域允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。内以相同函数名声明,从而形成重载。方便使用,便于记忆。方便使用,

47、便于记忆。l例:例:形参类型不同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);函 数 重 载68本讲稿第六十八页,共八十页注意事项注意事项不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:int add(int x,int y);int add(int a,int b);编译器不以形参名来区分int add(int x,int y);void add(int x,int y);编译器不以返回值来区分int add

48、(int x,int y)return x+y;float add(float x,float y)return x-y;函 数 重 载重载函数的形参必须不同:个数不同或类型不同。编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。69本讲稿第六十九页,共八十页例例3-16重载函数应用举例重载函数应用举例编写三个名为编写三个名为add的重载函数,分别实现两整数相的重载函数,分别实现两整数相加、两实数相加和两个复数相加的功能。加、两实数相加和两个复数相加的功能。#includeusing namespace std;struct complexdouble real;double

49、 imaginary;函 数 重 载70本讲稿第七十页,共八十页void main(void)int m,n;double x,y;complex c1,c2,c3;int add(int m,int n);double add(double x,double y);complex add(complex c1,complex c2);coutmn;coutinteger m+n=add(m,n)endl;71本讲稿第七十一页,共八十页coutxy;coutreal number x+y=add(x,y)endl;coutc1.realc1.imaginary;coutc2.realc2.im

50、aginary;c3=add(c1,c2);coutcomplex number(c1.real,c1.imaginary)+(c2.real,c2.imaginary)=(c3.real,c3.imaginary)n;72本讲稿第七十二页,共八十页int add(int m,int n)return m+n;double add(double x,double y)return x+y;complex add(complex c1,complex c2)complex c;c.real=c1.real+c2.real;c.imaginary=c1.imaginary+c2.imaginary

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

当前位置:首页 > 教育专区 > 大学资料

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com