ImageVerifierCode 换一换
格式:PPTX , 页数:81 ,大小:275KB ,
资源ID:4149060      下载积分:18 金币
验证码下载
登录下载
邮箱/手机:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/4149060.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  
声明  |  会员权益     获赠5币     写作写作

1、填表:    下载求助     留言反馈    退款申请
2、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
3、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
4、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
5、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
6、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
7、本文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。

注意事项

本文(函数专业知识讲座省公共课一等奖全国赛课获奖课件.pptx)为本站上传会员【精****】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4008-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

函数专业知识讲座省公共课一等奖全国赛课获奖课件.pptx

1、第5章 函数中国铁道出版社1第1页5.1 结构化程序设计5.1.1 过程化过程化C+程序框架程序框架以源程序文件为单位进行编译以源程序文件为单位进行编译一个源程序由一个一个源程序由一个main()函数和(或)多个其它函数组成。函数和(或)多个其它函数组成。程序执行程序执行从从main()函数开始函数开始在在main()函数中调用其它函数函数中调用其它函数在在main()函数中结束运行。函数中结束运行。对于其它函数,经过被调用方式来执行,它能够由对于其它函数,经过被调用方式来执行,它能够由main()调用,也能够被多个其它函数屡次地调用。调用,也能够被多个其它函数屡次地调用。2第2页函数之间调用

2、关系示意图 函数之间调用关系:函数之间调用关系:main函数调用了函数调用了f1()、f2()、f3()这这3个函数个函数函数函数f2()调用了函数调用了函数f3()函数函数f3()调用了函数调用了函数f4()3第3页C+程序框架通常由3个部分组成(1)第)第1部分:对每一个将被调用函数进行申明部分:对每一个将被调用函数进行申明void f1();void f2();void f3();void f4();(2)第)第2部分:定义部分:定义main()函数函数void main()f1();/调用函数调用函数f1f2();/调用函数调用函数f2f3();/调用函数调用函数f3 4第4页(3)第

3、)第3部分:定义其它各个函数。部分:定义其它各个函数。void f1()/定义函数定义函数f1 void f2()/定义函数定义函数f2 f3();/调用函数调用函数f3 void f3()/定义函数定义函数f3 f4();/调用函数调用函数f45第5页【例5-1】计算圆面积和周长输入一个圆半径值,然后计算这个圆面积和周长,输入一个圆半径值,然后计算这个圆面积和周长,并输出计算结果,其中计算圆面积和周长分别由并输出计算结果,其中计算圆面积和周长分别由两个函数完成,两个函数完成,#include using namespace std;double area(double r);/申明计算面积函

4、数申明计算面积函数area()double len(double r);/申明计算周长函数申明计算周长函数len()6第6页【例5-1】(续)void main()double r;coutr;coutarea=area(r)endl;/调用调用area()计算面积计算面积coutlen=len(r)endl;/调用调用len()计算周长计算周长double area(double r)/定义计算面积函数定义计算面积函数area()return 3.1416*r*r;double len(double r)/定义计算周长函数定义计算周长函数len()return 2*3.1416*r;7第7页

5、5.1.2 库函数和自定义函数(1)库函数)库函数在函数库中已定义函数,也称为标准函数,分布在不一样函数在函数库中已定义函数,也称为标准函数,分布在不一样函数库中,比如库中,比如iostream、cmath和和string等。等。使用库函数时,在程序开头将该函数所在函数库进行包含使用库函数时,在程序开头将该函数所在函数库进行包含包含格式:包含格式:#include“函数库名函数库名”比如:比如:#include#include using namespace std;(2)自定义函数:由用户自行编写)自定义函数:由用户自行编写8第8页5.2 函数概念自定义函数定义方式自定义函数定义方式返回值概

6、念返回值概念函数申明函数申明9第9页5.2.1 函数定义1函数定义普通形式函数定义普通形式类型名类型名 函数名(类型名函数名(类型名 形参形参1,类型名,类型名 形参形参2,)函数体函数体 (1)类型名:又称为函数类型,是函数调用返回时带回)类型名:又称为函数类型,是函数调用返回时带回给主调函数值类型。给主调函数值类型。(2)函数名:函数名命名要符合标识符命名规则。)函数名:函数名命名要符合标识符命名规则。(3)形参类型和名称:形参用来在函数调用时接收从主)形参类型和名称:形参用来在函数调用时接收从主调函数那里传递过来数据。调函数那里传递过来数据。(4)函数体:用来实现该函数功效。)函数体:用

7、来实现该函数功效。10第10页2函数几个特殊形式(1)无参函数)无参函数没有形参函数称为无参函数,圆括号不能省略。没有形参函数称为无参函数,圆括号不能省略。(2)空函数)空函数假如函数体为空,该函数称为空函数,空函数也能够假如函数体为空,该函数称为空函数,空函数也能够被调用,调用后也能够返回到主调函数。被调用,调用后也能够返回到主调函数。空函数通惯用在程序设计最初阶段,目标是确保整个空函数通惯用在程序设计最初阶段,目标是确保整个程序完整性,以后再向函数体中填写详细语句程序完整性,以后再向函数体中填写详细语句11第11页void使用用关键字用关键字void来定义无类型或称为空类型函数,明来定义无

8、类型或称为空类型函数,明确表示不带回值。确表示不带回值。比如:比如:void fun()couty)return x;else return y;14第14页返回值类型与函数类型不一致情况返回值类型在定义函数时指定,假如返回值类型在定义函数时指定,假如return语句中语句中表示式类型与函数定义时类型不一致,返回时以表示式类型与函数定义时类型不一致,返回时以函数类型为准,这时系统会对函数类型为准,这时系统会对return语句中表示语句中表示式值自动进行类型转换。式值自动进行类型转换。15第15页【例5-2】返回值与函数类型不一致#include using namespace std;int

9、max(float x,float y)return(xy?x:y);void main()float a,b;int c;cinab;c=max(a,b);cout Max=y?x:y结果转换为结果转换为int,然后再返回给,然后再返回给main。16第16页5.2.3 函数申明1函数调用标准函数调用标准调用任何函数之前,应该先对该函数进行申明调用任何函数之前,应该先对该函数进行申明假如被调函数出现在主调函数之前,这时,定义函假如被调函数出现在主调函数之前,这时,定义函数同时也对该函数进行了申明,该函数能够直接调数同时也对该函数进行了申明,该函数能够直接调用,能够省略对该函数申明。用,能够省

10、略对该函数申明。假如被调函数出现在主调函数之后,就要在函数调假如被调函数出现在主调函数之后,就要在函数调用之前对该函数进行申明。用之前对该函数进行申明。17第17页【例5-3】被调函数在主调函数之前定义#include using namespace std;float f()return 3.5;void main()coutf();该程序能够正常运行。该程序能够正常运行。18第18页犯错程序假如将程序中两个函数次序进行交换:假如将程序中两个函数次序进行交换:#include using namespace std;void main()couty?x:y);该函数函数原型是:该函数函数原型

11、是:int max(int x,int y);或或 int max(int,int);20第20页5.3 函数调用5.3.1 函数调用普通形式函数调用普通形式1实际参数实际参数函数调用普通形式:函数调用普通形式:函数名(参数表列)函数名(参数表列)调用函数时,格式中参数表列各个参数称为实际参数,简称实调用函数时,格式中参数表列各个参数称为实际参数,简称实参,实参向被调函数形参传递数据。参,实参向被调函数形参传递数据。比如:比如:实参是变量:实参是变量:c=max(a,b);实参是常量:实参是常量:c=max(3,4);实参是表示式:实参是表示式:c=max(3+5,4+3);实参是另一个函数调

12、用结果:实参是另一个函数调用结果:c=sqrt(max(a,3);实参个数、类型和次序应与被调函数形参一一对应实参个数、类型和次序应与被调函数形参一一对应21第21页【例5-4】函数调用时数据传递#include using namespace std;void print_char(char c,int n)int i;coutendl;for(i=0;in;i+)coutc;void main()print_char(-,5);print_char(,10);22第22页2函数调用几个形式(1)语句调用)语句调用作为函数调用语句,完成一定操作,不返回任何值。作为函数调用语句,完成一定操作,

13、不返回任何值。(2)表示式调用)表示式调用函数调用出现在表示式中,函数值参加表示式运算函数调用出现在表示式中,函数值参加表示式运算比如:比如:c=2*max(a,b);(3)函数值作为另一个函数调用参数)函数值作为另一个函数调用参数这时被调函数作为其它函数参数这时被调函数作为其它函数参数比如:比如:m=max(a,max(b,c);23第23页【例5-5】函数调用语句#include using namespace std;void printstar();void printmess();void main()printstar();printmess();printstar();void

14、printstar()cout*endl;void printmess()cout C+Programmeendl;24第24页5.3.2 设置形参默认值C+中允许为形参指定默认值,在函数调用时假如中允许为形参指定默认值,在函数调用时假如有实参,则形参使用实参值,假如没有指定与形有实参,则形参使用实参值,假如没有指定与形参对应实参,形参自动使用默认值参对应实参,形参自动使用默认值指定参数默认值能够在函数定义中进行,也能够指定参数默认值能够在函数定义中进行,也能够在函数原型中进行,通常是写在函数名在程序中在函数原型中进行,通常是写在函数名在程序中第一次出现位置。第一次出现位置。比如:比如:int

15、 add(int x=0,int y=0);25第25页【例5-6】默认参数值使用#include using namespace std;void add(int x=0,int y=0)coutx+y=x+yendl;void main()add(1,2);add();add(3);26第26页对部分形参定义默认值要求要求:没有默认值形参只能出现在形参表列前边,默认没有默认值形参只能出现在形参表列前边,默认值出现在从右到左连续若干个形参中。值出现在从右到左连续若干个形参中。下面定义方法是允许:下面定义方法是允许:void fun(int i=1,int j=2,int k=3);void

16、fun(int i,int j=2,int k=3);void fun(int i,int j,int k=3);下面定义方法是不允许:下面定义方法是不允许:void fun(int i=1,int j=2,int k);void fun(int i=1,int j,int k);void fun(int i,int j=2,int k);27第27页5.4 参数传递在在C+语言中,函数之间调用时经过参数进行数据语言中,函数之间调用时经过参数进行数据传递,从传递内容上看,参数传递有值传递、地传递,从传递内容上看,参数传递有值传递、地址传递和引用传递址传递和引用传递3种方式种方式28第28页5.

17、4.1参数传递方式1值传递值传递值传递时,将实参值依次传递给对应形参,形参变量值传递时,将实参值依次传递给对应形参,形参变量只有在发生函数调用时才分配内存单元用来接收由只有在发生函数调用时才分配内存单元用来接收由实参传过来数据。实参传过来数据。值传递时,实参加形参各占不一样单元,当调用结束值传递时,实参加形参各占不一样单元,当调用结束后,形参所在内存单元被释放,而实参仍保留原值。后,形参所在内存单元被释放,而实参仍保留原值。29第29页【例5-7】分析程序#include using namespace std;void swap(int x,int y);void main()int a=3

18、,b=4;couta=a b=bendl;swap(a,b);couta=a b=bendl;void swap(int x,int y)int z;coutx=x y=yendl;z=x;x=y;y=z;coutx=x y=yendl;结论:变量结论:变量a和和b值并没有交换。值并没有交换。30第30页2引用传递假如形参是引用名,在函数调用时,形参变量与假如形参是引用名,在函数调用时,形参变量与实参变量实际表示是同一内存单元,在被调函数实参变量实际表示是同一内存单元,在被调函数中对引用变量操作就和在主调函数中使用实参效中对引用变量操作就和在主调函数中使用实参效果是一样,这么,能够经过引用变量

19、在被调函数果是一样,这么,能够经过引用变量在被调函数中改变主调函数中变量值。中改变主调函数中变量值。31第31页【例5-8】使用引用传递交换变量值#include using namespace std;void swap(int&,int&);/函数函数swap()形参是引用名形参是引用名void main()int a=5,b=10;couta=a,b=bendl;swap(a,b);couta=a,b=b;void swap(int&m,int&n)/引用传递引用传递 int t=m;m=n;n=t;结论:变量结论:变量a和和b值实现了交换。值实现了交换。32第32页5.4.2 一维数组

20、名作为函数参数因为数组名代表了该数组所占连续内存单元中首因为数组名代表了该数组所占连续内存单元中首地址,所以数组名作参数时,传送给形参数组是地址,所以数组名作参数时,传送给形参数组是实参数组起始地址,这也是引用传递,主调函数实参数组起始地址,这也是引用传递,主调函数和被调函数两个数组共占相同内存单元,这么,和被调函数两个数组共占相同内存单元,这么,假如被调函数中各数组元素值发生改变,在返回假如被调函数中各数组元素值发生改变,在返回主调函数后,实参数组中元素值也同时改变主调函数后,实参数组中元素值也同时改变33第33页【例5-9】数组名作函数参数#include using namespace

21、std;f(int b,int m,int n)int i,s=0;for(i=m;in;i=i+2)s=s+bi;return s;void main()int x,a=1,2,3,4,5,6,7,8,9;x=f(a,3,7);coutx;34第34页【例5-10】在被调函数中改变主调函数中数组元素值#include using namespace std;void f(int b)int i;for(i=0;i10;i+)bi+;void main()int i,a10=1,3,2,4,8,3,4,9,12,0;cout调用前调用前:;for(i=0;i10;i+)coutai,;cout

22、endl;f(a);cout调用后调用后:;for(i=0;i10;i+)coutai,;coutendl;35第35页5.5 函数特殊调用5.5.1 嵌套调用嵌套调用在一个函数调用过程中,被调函数又调用了另一个函在一个函数调用过程中,被调函数又调用了另一个函数。数。C+中能够嵌套调用,不过不能够嵌套定义函数。中能够嵌套调用,不过不能够嵌套定义函数。36第36页【例5-11】函数嵌套调用从键盘上输入两个整数,计算这两个整数平方和。从键盘上输入两个整数,计算这两个整数平方和。#include using namespace std;int square(int n)return n*n;int

23、sum(int x,int y)return square(x)+square(y);void main()int m,n;coutmn;coutm2+n2=sum(m,n)endl;37第37页5.5.2 递归调用在调用一个函数过程中直接或间接地调用其本身在调用一个函数过程中直接或间接地调用其本身,有两个阶段有两个阶段(1)递推阶段)递推阶段将原来问题不停地分解为新问题,逐步从未知向已知将原来问题不停地分解为新问题,逐步从未知向已知方向推测,最终抵达已知条件。方向推测,最终抵达已知条件。(2)回归阶段)回归阶段从已知条件出发,按递推从已知条件出发,按递推逆过程,逐一求值,最终逆过程,逐一求值

24、,最终抵达递推开始。抵达递推开始。38第38页【例5-12】用递归调用计算阶乘n!#include using namespace std;int fac(int n)int f;if(n=0|n=1)f=1;else f=fac(n-1)*n;return f;void main()int n,y;cinn;y=fac(n);coutn!=y;39第39页【例5-13】使用递归计算Fibonacci数列使用递归调用方法计算示使用递归调用方法计算示Fibonacci数列前数列前30项,每行显示项,每行显示5个。个。#include using namespace std;int fib(int

25、 n)if(n=0|n=1)return 1;else return fib(n-1)+fib(n-2);void main()int i;for(i=0;i30;i+)if(i%5=0)coutendl;coutfib(i)t;40第40页5.6 变量作用域和生存期一个变量能否在多个函数中使用,这是变量作用一个变量能否在多个函数中使用,这是变量作用域;域;一个变量在定义之后,起作用时间有多长,这是一个变量在定义之后,起作用时间有多长,这是变量生存期。变量生存期。41第41页5.6.1 变量作用域依据变量作用域不一样,能够把变量分为局部变依据变量作用域不一样,能够把变量分为局部变量和全局变量。

26、量和全局变量。1局部变量局部变量(1)在一个函数内部定义变量)在一个函数内部定义变量(2)函数形参是局部变量。)函数形参是局部变量。(3)在)在main中定义变量上局部变量。中定义变量上局部变量。(4)在复合语句中定义是局部变量,仅在复合语句范)在复合语句中定义是局部变量,仅在复合语句范围内有效。围内有效。42第42页【例5-14】不一样局部变量#include using namespace std;void main()int i=1,j=3;couti,;i+;int i=0;i+=j*2;couti,j,;couti,j;43第43页2全局变量全局变量全局变量在函数之外、类之外定义变量

27、,全局变量可认为在函数之外、类之外定义变量,全局变量可认为根源程序中全部函数、类或复合语句所访问。根源程序中全部函数、类或复合语句所访问。定义全局变量如果没有初始化,系统自动将其初定义全局变量如果没有初始化,系统自动将其初始化为始化为0。全局变量和某个局部变量允许同名,这时,在局全局变量和某个局部变量允许同名,这时,在局部变量作用范围内,全局变量是不起作用。部变量作用范围内,全局变量是不起作用。44第44页【例5-15】全局变量和局部变量#include using namespace std;int a=3,b=5;/这里定义了两个全局变量这里定义了两个全局变量int max(int a,i

28、nt b)return ab?a:b;void main()int a=8;/该处定义局部变量与全局变量同名该处定义局部变量与全局变量同名 coutmax(a,b);45第45页【例5-16】使用作用域运算符全局变量和局部变量重名时,在全局变量前使用作用域运算符全局变量和局部变量重名时,在全局变量前使用作用域运算符#include using namespace std;int avar;void main()int avar;avar=25;/局部变量局部变量avar:avar=10;/全局变量全局变量avar coutlocal avar=avarendl;coutglobal avar=

29、:avarendl;46第46页【例5-17】申明全局变量#include using namespace std;void main()int c;extern a,b;/*此处申明全局变量此处申明全局变量a,b */c=a+b;/*此处使用全局变量此处使用全局变量a,b */coutc;int a=3,b=5;/*此处定义全局变量此处定义全局变量a,b */47第47页5.6.2 变量存放类型 1C+程序使用内存区域程序使用内存区域(1)程序代码区:存放各个函数代码;)程序代码区:存放各个函数代码;(2)全局数据区:存放全局数据和静态数据,该区域)全局数据区:存放全局数据和静态数据,该区域

30、数据一直保持到程序结束;数据一直保持到程序结束;(3)栈区:存放程序局部数据,当函数被调用时,才)栈区:存放程序局部数据,当函数被调用时,才为函数中局部变量在此区分配存放空间,函数调用为函数中局部变量在此区分配存放空间,函数调用结束时会收回该函数在栈区分配单元;结束时会收回该函数在栈区分配单元;(4)堆区:存放程序动态数据,该区能够用)堆区:存放程序动态数据,该区能够用new或或malloc分配,能够用分配,能够用delete或或free进行释放。进行释放。48第48页 2局部变量存放方式变量存放类型,就是指定变量详细存放区域变量存放类型,就是指定变量详细存放区域在默认情况下,变量存放区域:在

31、默认情况下,变量存放区域:全局变量保留在全局数据区;全局变量保留在全局数据区;局部变量保留在栈区;局部变量保留在栈区;用用new或或malloc动态分配变量保留在堆区;动态分配变量保留在堆区;49第49页局部变量存放类型(1)auto类型类型 又称为自动变量,分配在栈区,这是缺省方式,关又称为自动变量,分配在栈区,这是缺省方式,关键字键字auto能够省略。能够省略。(2)static静态静态将局部变量分配到全局数据区空间,这么变量称为静将局部变量分配到全局数据区空间,这么变量称为静态局部变量,静态局部变量有以下特点:态局部变量,静态局部变量有以下特点:初始值缺省为初始值缺省为0;局部变量在函数

32、调用结束后所占内存单元不释放,其局部变量在函数调用结束后所占内存单元不释放,其值能够保持到函数下一次调用。值能够保持到函数下一次调用。50第50页(3)register存放器变量存放器变量用存放标识用存放标识register将局部变量值放在存放器中,用来将局部变量值放在存放器中,用来提升执行效率,使用该类型时应注意下面问题:提升执行效率,使用该类型时应注意下面问题:仅局部变量和形参可作为存放器变量;仅局部变量和形参可作为存放器变量;存放器数目有限,假如定义了多个存放器变量,多出存放器数目有限,假如定义了多个存放器变量,多出自动作自动作auto型处理;型处理;存放器变量没有地址,所以不能作地址运

33、算。存放器变量没有地址,所以不能作地址运算。51第51页 【例5-18】分析程序#include using namespace std;int fun(int n)static int f=1;f=f*n;return f;void main()int i;for(i=1;i=5;i+)coutfun(i)endl;52第52页 3在定义全局变量时使用static 在全局变量前加上在全局变量前加上static,表示该变量只能被本编译单位,表示该变量只能被本编译单位引用,而不能被其它编译单位引用。引用,而不能被其它编译单位引用。比如,有两个文件比如,有两个文件file1.cpp和和file2.

34、cpp。file1.cpp内容以下:内容以下:static int A;void main()file2.cpp内容以下:内容以下:extern int A;int fun(int n)在在file1.cpp中定义全局变量中定义全局变量A用用static 申明,所以只能用于申明,所以只能用于file1.cpp中,这么,在中,这么,在file2.cpp中即使用了中即使用了extern int A;但但还是无法使用还是无法使用file1.cpp中全局变量。中全局变量。53第53页4在定义全局变量时使用extern定义全局变量时,在其前面使用定义全局变量时,在其前面使用extern,有两种情况。,有

35、两种情况。(1)在同一编译单位内全局变量前加)在同一编译单位内全局变量前加extern用于全局变量定义在后,引用变量函数在前情况,用来说明该用于全局变量定义在后,引用变量函数在前情况,用来说明该变量是已被定义了全局变量。变量是已被定义了全局变量。(2)在不一样编译单位内全局变量前加)在不一样编译单位内全局变量前加extern一个程序由多个编译单位组成时候,假如每个文件中需要引用一个程序由多个编译单位组成时候,假如每个文件中需要引用同一个全局变量,可在其中一个文件中定义全部全局变量,同一个全局变量,可在其中一个文件中定义全部全局变量,而在其它用到这些全局变量文件中用而在其它用到这些全局变量文件中

36、用extern对变量进行说明,对变量进行说明,申明这些变量已在其它编译单位中定义。申明这些变量已在其它编译单位中定义。54第54页5.6.3 变量生存期变量生存期是指一个变量从定义且分配内存单元开始,变量生存期是指一个变量从定义且分配内存单元开始,一直到该变量所占空间被释放为止。一直到该变量所占空间被释放为止。按变量存放类型不一样,变量有两种生存期:按变量存放类型不一样,变量有两种生存期:(1)静态存放分配)静态存放分配变量在编译时分配空间,在程序运行过程中一直占用空间,包变量在编译时分配空间,在程序运行过程中一直占用空间,包含全局变量和静态局部变量,程序结束时,变量所占空间被含全局变量和静态

37、局部变量,程序结束时,变量所占空间被释放。释放。(2)自动存放分配)自动存放分配在程序运行期间为变量分配空间,这类变量就是局部变量,即在程序运行期间为变量分配空间,这类变量就是局部变量,即在函数或复合语句内定义自动变量,程序执行到函数或复合在函数或复合语句内定义自动变量,程序执行到函数或复合语句时建立并分配空间,函数或复合语句结束时所占空间被语句时建立并分配空间,函数或复合语句结束时所占空间被释放。释放。55第55页5.7 函数重载函数重载机制函数重载机制两个或两个以上函数含有相同函数名,这些函数被称两个或两个以上函数含有相同函数名,这些函数被称为重载函数,只要这些函数形参个数不一样或形参为重

38、载函数,只要这些函数形参个数不一样或形参类型不完全一样,编译系统依据实参和形参个数或类型不完全一样,编译系统依据实参和形参个数或类型匹配关系,在同名函数中自动选择调用某个函类型匹配关系,在同名函数中自动选择调用某个函数。数。56第56页【例5-19】按形参类型重载函数#include#include using namespace std;int max(int x,int y)return xy?x:y;/(1)求整型数最大值)求整型数最大值57第57页【例5-19】(续)double max(double x,double y)return xy?x:y;/(2)求双精度型数最大值)求双精

39、度型数最大值char max(char x,char y)return xy?x:y;/(3)求字符型数最大值)求字符型数最大值char*max(char*s1,char*s2)return strcmp(s1,s2)0?s1:s2;/(4)求字符串最大值)求字符串最大值58第58页【例5-19】(续)void main()coutmax(4,5)endl;coutmax(4.6,1.2)endl;coutmax(x,y)endl;coutmax(abc,aaa);59第59页【例5-20】按形参个数重载函数#include using namespace std;int add(int x,

40、int y)/有两个形参有两个形参int sum;sum=x+y;return sum;int add(int x,int y,int z)/有有3个形参个形参int sum;sum=x+y+z;return sum;int add(int x,int y,int z,int t)/有有4个形参个形参int sum;sum=x+y+z+t;return sum;60第60页【例5-20】(续)void main()int a,b,c;a=add(3,5);b=add(3,5,7);c=add(3,5,7,9);coutaendl;coutbendl;coutcendl;61第61页5.8 内联

41、函数问题问题:一些代码不长又经常被调用函数,系统为调用所花费时间和空一些代码不长又经常被调用函数,系统为调用所花费时间和空间开销较大,有时甚至会影响程序运行效率。间开销较大,有时甚至会影响程序运行效率。处理方法处理方法:将函数定义为内联函数将函数定义为内联函数定义格式定义格式:inline 函数类型函数类型 函数名(形参及其类型表列)函数名(形参及其类型表列)函数体函数体 程序编译程序编译将内联函数调用表示式用内联函数函数体替换,这么,就不会将内联函数调用表示式用内联函数函数体替换,这么,就不会产生程序调用时转向、恢复等问题,以增加程序代码为代价产生程序调用时转向、恢复等问题,以增加程序代码为

42、代价换来时间上效率换来时间上效率62第62页【例5-21】内联函数使用#include using namespace std;inline int square(int x)/定义为内联函数定义为内联函数 return x*x;void main()int i,sum=0;for(i=1;i=10;i+)sum=sum+square(i);coutsum=y?x:y;double max(double x,double y)return xy?x:y;char max(char x,char y)return xy?x:y;这几个函数参数类型不一样,返回值类型不一样,但功这几个函数参数类型不

43、一样,返回值类型不一样,但功效一样,而且函数体中代码完全一样效一样,而且函数体中代码完全一样问题:能否只编写一个含有通用功效函数,让该函数支问题:能否只编写一个含有通用功效函数,让该函数支持不一样类型数据,从而免去相同代码重复持不一样类型数据,从而免去相同代码重复使用函数模板能够处理这个问题。使用函数模板能够处理这个问题。64第64页5.9.1 模板定义和使用函数模板定义:函数模板定义:template 函数定义函数定义格式中格式中“模板形参表列模板形参表列”必须放在尖括号中,每一个模必须放在尖括号中,每一个模板形参能够使用下面定义形式之一:板形参能够使用下面定义形式之一:(1)typenam

44、e 参数名参数名(2)class 参数名参数名(3)类型名)类型名 参数名参数名 前两种形式效果一样,申明参数称为虚拟类型参数,第前两种形式效果一样,申明参数称为虚拟类型参数,第3种形式申明参数称为常规参数。种形式申明参数称为常规参数。比如,有一个形参:比如,有一个形参:template 两个形参:两个形参:template 65第65页在函数模板中所定义函数称为模板函数在函数模板中所定义函数称为模板函数在对程序编译时,编译系统依据每次调用该模板在对程序编译时,编译系统依据每次调用该模板函数所使用详细数据类型生成适当函数代码,这函数所使用详细数据类型生成适当函数代码,这一过程称为函数模板实例化

45、,实例化时,用实参一过程称为函数模板实例化,实例化时,用实参详细类型替换形参虚拟类型。详细类型替换形参虚拟类型。66第66页【例5-22】只带有虚拟类型参数模板#include using namespace std;template T max(T x,T y)/所定义模板形参为所定义模板形参为Treturn xy?x:y;void main()coutmax(4,5)endl;/调用模板函数实参类型是调用模板函数实参类型是int coutmax(4.6,1.2)endl;/调用模板函数实参类型是调用模板函数实参类型是double coutmax(x,y)y?x:y;(2)第)第2次调用模板

46、函数是次调用模板函数是max(4.6,1.2),实参类型,实参类型是是double,实例化生成以下函数实例:,实例化生成以下函数实例:double max(double x,double y)return xy?x:y;(3)第)第3次调用模板函数以次调用模板函数以char类型进行实例化类型进行实例化68第68页【例5-23】同时带有虚拟类型参数和常规参数模板#include using namespace std;template T sum(T a,int n)/虚拟参数虚拟参数T和常规参数和常规参数n int i;T sum=0;for(i=0;in;i+)sum=sum+ai;retu

47、rn sum;69第69页【例5-23】(续)void main()int a10=1,2,3,4,5,6,7,8,9,10;double b10=1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0;coutsum(a,5)endl;/计算数组计算数组a中前中前5个数之和个数之和 coutsum(a,10)endl;/计算数组计算数组a中前中前10个数之和个数之和 coutsum(b,5)endl;/计算数组计算数组b中前中前5个数之和个数之和 coutsum(b,10)endl;/计算数组计算数组b中前中前10个数之和个数之和70第70页5.9.2 模板实参使用

48、当从模板函数实参表中无法取得足够信息来判断当从模板函数实参表中无法取得足够信息来判断形参类型时,需要使用模板实参。形参类型时,需要使用模板实参。带有模板实参模板函数调用形式以下:带有模板实参模板函数调用形式以下:函数名函数名 (函数实参表列函数实参表列)71第71页1从模板函数实参表无法确定模板参数类型template T max(T x,T y)return xy?x:y;调用调用max(3.5,6)实参类型分别是实参类型分别是double和和int,系统,系统无法判断形参无法判断形参T类型是类型是double还是还是int。处理方法:在函数调用时加上模板实参处理方法:在函数调用时加上模板实

49、参调用调用1:max(3.5,6)形参形参T被替换为被替换为double调用调用2:max(3.5,6)形参形参T作为作为int型型72第72页2需要指定特定类型返回值【例【例5-24】指定返回值类型。】指定返回值类型。#include using namespace std;template T max(T x,T y)return(float)(xy?x:y);73第73页【例5-24】(续)void main()coutmax(a,b)endl;coutmax(4.6,1)endl;第第1次调用次调用max(a,b)使用了模板实参类型为使用了模板实参类型为int,函数,函数两个实参类型都

50、为两个实参类型都为char型,它们自动转换为型,它们自动转换为int型,并以型,并以int型返回,结果为型返回,结果为98。第第2次调用次调用max(4.6f,1),两个函数实参类型不一致,两个函数实参类型不一致,而模板实参类型为而模板实参类型为float,将转换为,将转换为float型,最终返回值型,最终返回值类型也是类型也是float型。型。74第74页3模板形参没有出现在模板函数形参表中模板形参是无法经过模板函数实参确定,只能在模板形参是无法经过模板函数实参确定,只能在模板实参中定义。模板实参中定义。【例【例5-25】模板形参不在模板函数形参表中。】模板形参不在模板函数形参表中。#inc

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服