版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章函数C++语言程序设计教程第4章函数制作人:沈显君第1页第4章函数1.掌握函数申明和定义、函数调用及函数参数传递过程;2.掌握关键字inline含义与使用;3.掌握递归函数使用;4.掌握函数重载使用方法; 5.掌握函数模板使用方法; 6.了解各类系统函数,掌握惯用系统函数使用。学习目标
C++语言程序设计教程第4章函数第2页4.1函数定义和申明在C++程序中,使用函数前首先需要对函数原型进行申明,告诉编译器函数名称、类型和形式参数。在C++中,函数原型申明标准以下:(1)假如函数定义在先,调用在后,调用前能够无须申明;
假如函数定义在后,调用在先,调用前必须申明。(2)在程序设计中,为了使程序设计逻辑结构清楚,普通
将主要函数放在程序起始位置申明,这么也起到了
列函数目录作用。注意事项见书上:P74C++语言程序设计教程第4章函数第3页4.1函数定义和申明/***********************************p4_1.cpp**函数使用,对两个数取大************************************/#include<iostream>usingnamespacestd;intmax(intx,inty)//假如函数定义在后,调用在先,调用前必须申明。voidmain(){inta,b;cin>>a>>b;cout<<max(a,b)<<endl;}intmax(intx,inty){intz;z=(x>y)?x:y;returnz;}123456789101112131415161718C++语言程序设计教程第4章函数函数原型申明主函数函数体:函数所完成详细操作第4页在C++中,函数原型申明标准以下:
(1)假如函数定义在先,调用在后,调用前能够无须申明;假如函数定义在后,调用在先,调用前必须申明。(2)在程序设计中,为了使程序设计逻辑结构清楚,普通将主要函数放在程序起始位置申明,这么也起到了列函数目录作用。
申明函数原型形式以下:
比如:
intmax(intx,inty)
;intmax(int,int)
;C++语言程序设计教程第4章函数4.1.2函数原型申明返回类型
函数名(数据类型1参数1,数据类型2参数2,...);
加上参数名会使函数功效和参数更清楚。第5页内联函数定义形式以下:
C++语言程序设计教程第4章函数4.3内联函数
inline函数类型函数名(形式参数表){函数体;}内联函数:
是经过在编译时将函数体代码插入到函数调用处,将调用函数方式改为次序执行方式来节约程序执行时间开销,这一过程叫做内联函数扩展。所以,内联函数实际上是一个用空间换时间方案。函数调用是什么样子呢?(等我展示,见前例)在内联函数扩展时也进行了实参加形参结合过程:先将实参名(而不是实参值),将函数体中形参处处替换,然后搬到调用处。但从用户角度看,调用内联函数和普通函数没有任何区分。第6页4.3内联函数
//***********************************p4_6.cpp**内联函数使用***********************************/#include<iostream>usingnamespacestd;inlinedoubleCirArea(doubleradius){return3.14*radius*radius;}voidmain(){doubler1(1.0),r2(2);cout<<CirArea(r1)<<endl;cout<<CirArea(r1+r2+4)<<endl;}12345678910111213141516C++语言程序设计教程第4章函数内联函数定义内联函数调用运行结果:12↙479001600
第7页C++语言程序设计教程第4章函数4.3内联函数注意:假如仅在申明函数原型时加上关键字inline,并不能到达内联效果。内联函数定义必须出现在对该函数调用之前,因为编译器在
对函数调用语句进行替换时,必须事先知道替换该语句代码是
什么。这也是仅在申明函数原型时加上关键字inline,并不能到达
内联效果原因。
因为计算机资源总是有限,使用内联函数即使节约了程序运行时间开销,但却增大了代码占用内存空间开销。所以在详细编程时应仔细地权衡时间开销与空间开销之间矛盾,以确定是否采取内联函数。与处理register变量相同,是否对一个内联函数进行扩展完全由编译器自行决定。所以,说明一个内联函数只是请求而不是命令编译器对它进行扩展。实际上,假如将一个较复杂函数定义为内联函数,大多数编译器会自动地将其作为普通函数处理。第8页比如:C++语言程序设计教程第4章函数4.4带默认形参值函数
intsub(intx=8,inty=3){returnx-y;}voidmain(void){sub(20,15);//传递给形参x,y值分别为20和15sub(10);//传递给形参x,y值分别为10和3sub();//传递给形参x,y值分别为8和3}
C++语言允许在函数说明或函数定义中为形参预赋一个默认值,这么函数就叫做带有默认形参值函数。在调用带有默认参数值函数时,若为对应形参指定了实参,则形参将使用实参值;不然,形参相使用其默认值。这就大大地方便了函数使用。第9页C++语言程序设计教程第4章函数4.4带默认形参值函数intf(inta,floatb=5.0,charc='.',intd=10);//正确intf(inta=1,floatb=5.0,charc='.',intd);//错误,d未给值intf(inta=1,floatb,charc='.',intd=10);//错误,b未给值
(1)若函数含有多个形参,则缺省形参值必须自右向左连续地定义,而且在一个缺省形参值右边不能有未指定缺省值参数。这是因为C++语言在函数调用时参数是自右至左入栈这一约定所决定。比如:假如有以下申明:intf(inta,floatb=5.0,charc='.',intd=10);采取以下调用形式是错误:f(8,,,4);//语法错误(2)
在调用一个函数时,假如省去了某个实参,则直到最右端实参都要省去(当然,与它们对应形参都要有缺省值)。比如:
第10页C++语言程序设计教程第4章函数4.4带默认形参值函数intsub(intx=8,inty=3);//缺省形参值在函数原型中给出voidmain(void){sub(20,15);//20-15sub(10);//10-3sub();//8-3}intsub(intx,inty)//缺省形参值没有在函数定义时给出{returnx-y;}(3)缺省形参值说明必须出现在函数调用之前。这就是说,假如存在函数原型,则形参缺省值应在函数原型中指定;不然在函数定义中指定。另外,若函数原型中已给出了形参缺省值,则在函数定义中不得重复指定,即使所指定缺省值完全相同也不行。比如:
第11页C++语言程序设计教程第4章函数4.4带默认形参值函数intf(inta,floatb,char,intd=10);intf(inta,floatb,charc='.',intd=10);//错误:企图再次定义缺省参数c和d(4)在同一个作用域,一旦定义了缺省形参值,就不能再定义它。比如:intf(inta=6,floatb=5.0,charc='.',intd=10);voidmain(void){intf(inta=3,floatb=2.0,charc='n',intd=20);cout<<f()<<endl;//f函数使用局部缺省参数值}(5)假如几个函数说明出现在不一样作用域内,则允许分别为它们提供不一样缺省形参值。比如:第12页C++语言程序设计教程第4章函数4.4带默认形参值函数//d参数缺省值是函数调用。intf(inta,floatb=5.0,charc='.',intd=sub(20,15));
(6)
对形参缺省值指定能够是初始化表示式,甚至能够包含函数调用。比如:
intf(int,float=5.0,char=’.’,int=sub(20,15));
(7)在函数原型给出了形参缺省值时,形参名能够省略。比如:第13页C++语言程序设计教程第4章函数4.5函数重载
intmax(int,int);intmax(int,int,int);floatmax(float,float);doublemax(double,double);函数重载:
就是两个以上函数,取相同函数名,不过形参个数和类型不一样,编译器依据实参和形参类型及个数最正确匹配,自动决定调用哪一个函数。
比如:第14页/*******************************p4_7.cpp**函数重载********************************/#include<iostream>usingnamespacestd;intadd(intx,inty)
{cout<<"(int,int)\t";returnx+y;}doubleadd(doublex,doubley){cout<<"(double,double)\t";returnx+y;}intadd(intx,doubley){cout<<"(int,double)\t";returnint(x+y);}123456789101112131415161718192021C++语言程序设计教程第4章函数函数重载函数重载函数重载第15页doubleadd(doublex,inty)
{cout<<"(double,int)\t";returnx+y;}voidmain(){cout<<add(9,8)<<endl;cout<<add(9.0,8.0)<<endl;cout<<add(9,8.0)<<endl;cout<<add(9.0,8)<<endl;}212223242526272829303132C++语言程序设计教程第4章函数函数重载运行结果:(int,int)17(double,double)17(int,double)17(double,int)17重载函数调用第16页C++语言程序设计教程第4章函数4.5函数重载//C++无法区分这两个函数。因为在没有确定函数调用是对哪一个重载函数之前,
//返回类型是不知道。intadd(inti1,inti2);floatadd(intf1,intf2);注意:(1)各个重载函数返回类型能够相同,也能够不一样。但假如函数名相同、形参表也相同,仅仅是返回类型不一样,则是非法。在编译时会认为是语法错误。//将char型转换成int型,然后与add(int,int)绑定。add('A','A'+'0');//函数实参向(double,double)转换,然后与add(double,double)绑定。add(float(8),float(9));//实参类型为(longdouble,int),向低类型转化。不过转换既能够向add(int,int)又能够向add(double,int)转换,轻易引发二义性。add(longdouble(8),9);
(2)确定对重载函数哪个函数进行调用过程称为绑定(binding),绑定优先次序为准确匹配、对实参类型向高类型转换后匹配、实参类型向低类型及相容类型转换后匹配。第17页C++语言程序设计教程第4章函数4.5函数重载
消除这种二义性方法有:①添加重载函数定义,使调用取得准确匹配。如:增加定义add(longdouble,int)②将函数实参进行强制类型转换,使调用取得准确匹配。比如:
调用形式可改为add(double(longdouble(8)),9),但改为add(longdouble(8),longdouble(9))一样出现绑定二义性。绑定(匹配)二义性
两个重载函数,编译器不知道进行哪种类型转换,与哪个函数绑定,这种现象就叫绑定(匹配)二义性。注意:重载函数与带默认形参值函数一起使用时,有可能引发二义性。比如:voidadd(intx,inty,intz=0);当调用add(8,9)时,不知与add(int,int)还是add(int,int,int=0)绑定。消除这种二义性方法是增加或降低实参个数。第18页C++语言程序设计教程第4章函数4.6函数模板
template<class类型名1,class类型名2,...>
返回类型函数名(形参表){函数体;}函数模板:
能够用来创建一个通用功效函数,以支持各种不一样形参,深入简化重载函数函数体设计。函数模板定义形式为:
模板参数表意义:对于功效完全一样,只是参数类型不一样函数,能写一段通用代码适合用于各种不一样数据类型,会使代码可重用性大大提升,从而提升软件开发效率。
第19页C++语言程序设计教程第4章函数4.6函数模板(见P88)//将add函数定义成了一个函数模板:template<classT>Tadd(Tx,Ty){returnx+y;}比如:
注意:template关键字表示申明是模板。<>中是模板参数表,能够有一项或多项,其中类型名称为参数化类型,是一个抽
象类型或可变类型。class是类型关键字,也能够用typename作为关键字。函数返回值类型能够是普通类型,也能够是模板参数表中指定类型。模板参数表中参数类型能够是普通类型。第20页C++语言程序设计教程第4章函数4.6函数模板说明:依据<>中给出详细类型,用类似于函数调用实参加形参结合方式,将模板参数表中参数化类型一一实例化成详细类型,函数中参数化类型也一一实例化。假如模板参数表中有形式参数,还需要用常量表示式去初始化。比如:使用add<double>(8,9)将Tadd(Tx,Ty)实例化成:doubleadd(double,double)使用sum<int,100>将Tsum()实例化成:intsum(),size取得初值100;
函数模板定义后,就能够用它生成各种详细函数(称为模板函数)。在函数调用时,用函数模板生成模板函数实际上就是将模板参数表中参数化类型依据实参实例化(详细化)成详细类型。这个过程称为模板实例化。函数模板实例化分为显式实例化与隐式实例化。(1)
显式实例化
函数名<详细类型名1,详细类型名2,...,常量表示式>(实参表)第21页C++语言程序设计教程第4章函数4.6函数模板比如:
使用add(‘A’,‘B’)将Tadd(Tx,Ty)实例化成:charadd(char,char)(2)
隐式实例化:隐式实例化格式为函数调用式,实例化过程是在实参加形参结合时,用实参类型实例化形参对应参数化类型。
注意:使用隐式实例化无法初始化模板参数表中普通类型形参,假如模板参数表中使用普通类型参数,必须使用显式初始化。第22页4.6函数模板//*******************************p4_8.cpp**函数模板********************************/#include<iostream>usingnamespacestd;template<classT1,classT2>T1add(T1x,T2y){cout<<"("<<sizeof(T1)<<","<<sizeof(T2)<<")\t";returnx+y;}voidmain(){cout<<add(9,8)<<endl;cout<<add(9.0,8.0)<<endl;cout<<add(9,8.0)<<endl;cout<<add(9.0,8)<<endl;cout<<add('A','A'-'0')<<endl;cout<<add(longdouble(8),9)<<endl;}123456789101112131415161718192021C++语言程序设计教程第4章函数函数模板定义模板函数调用运行结果:(4,4)17(8,8)17(4,8)17(8,4)17(1,4)R(8,4)17第23页C++语言程序设计教程第4章函数4.7C++系统函数
C++不但允许我们依据自己需要定义函数,C++系统为我们提供了大量标准库函数,这些函数原型在对应头文件中,使用时要包含对应头文件。
C++函数分类表
分别求x正弦值、余弦值、正切值;x为弧度数doublesin(doublex)doublecos(doublex)doubletan(doublex)lnx即logexlog10xdoublelog(doublex)doublelog10(doublex)xy次幂ex次幂doublepow(doublex,doubley)doubleexp(doublex)分别求整型数、长整型、浮点数绝对值intabs(inti)longlabs(longn)doublefabs(doublex)math.hcmath求x平方根doublesqrt(doublex)数学C式头文件C++头文件功效简述
原型
类别
第24页C++语言程序设计教程第4章函数C式头文件C++头文件功效简述
原型
类别
将整数v按x进制转成字符串schar*itoa(intv,char*s,intx)time.hctime返回1970/1/1零点到当前秒数time_ttime(time_t*timer)时间
设置随机数种子
产生0-RAND_MAX随机数rand(unsignedseed)intrand()stdlib.hiostream将字符串转化成整数intatoi(char*s)类型转换memory.hiostream将s指向内存区域c个字节拷贝到d指向区域void*memcpy(void*d,void*s,intc)内存操作unsignedstrlen(char*str)unsignedstrlen(char*str)其它字符串
字符stdlib.hiostream终止正在执行程序exit(int)string.hiostreamchar*strcpy(char*s1,char*s2)char*strcpy(char*s1,char*s2)将c转换成小写、大写字母inttolower(intc),inttoupper(intc)ctype.hiostreamc是否是字母,c是否是数字intisalpha(intc),intisdigit(intc)math.hcmath分别求x反正弦值、反余弦值、反正切值doubleasin(doublex)doubleacos(doublex)doubleatan(doublex)数学注意:在C++中,旧式C格调头文件去掉了后缀.h,加上了前缀C,如stdlib.h在C++中变成了Cstdlib。当使用了:#include<iostream>
usingnamespacestd;时,许多头文件不需要包含了。在上面表中,用iostream表示不再需要包含对应C++格调头文件。4.7C++系统函数
第25页4.7C++系统函数/**********************************************p4_9.cpp**利用系统函数rand()随机产生学生成绩********
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 竹笋产业发展实施方案
- 质量问题分析与解决流程方案
- ARIMA模型数据预处理课程设计
- 4 古诗三首【活动探究版】
- IATF16949审核资料清单
- 护一口皓齿揽万千星河-2026年全国爱牙日主题班会教学设计(初中八年级)
- 【讲义】高中地理·高考大一轮复习:工业区位因素的多维嬗变与价值重塑
- 智斗数字迷局-高一防电信诈骗主题班会教案
- 高中二年级语文《月满中秋·诗韵中华》大单元教学教案
- 点亮成长的天赋眼-高中二年级心理健康主题班会教学设计
- 消防车祸抢险救援
- 头颈部肿瘤基础知识课件
- 2025中国电建集团山东电力建设第一工程有限公司招聘笔试历年难易错考点试卷带答案解析试卷3套
- 写字楼分租合同范本
- 单侧双通道脊柱内镜技术
- 2025地理会考综合试卷及答案
- 化学史简明教程 课件全套 (韩福芹) 第1-7章化学知识的萌芽与积累-现代化学的发展趋势
- 筏板基础基础施工方案(鲁班奖-)
- 小学科学实验操作规范及方案
- Power-Query课件教学课件
- 工厂vave管理制度
评论
0/150
提交评论