




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
5.6 具有缺省参数值和参数个数可变的函数VC+程序设计基础,讲述C+语言的语法和标准库,以及Visual C+ 函数库和MFC类库的使用,并附相关代码示例。在C+中定义函数时,允许给参数指定一个缺省的值。在调用函数时,若明确给出了这种实参的值,则使用相应实参的值;若没有给出相应的实参,则使用缺省的值。这种函数称为具有缺省参数的函数。另外,在定义函数时,可以不明确指定参数的个数,在调用函数时,允许给出的实参个数是可变的。我们把这种函数称为参数个数可变的函数。提供这二种函数的目的是为了用户更方便地使用函数。5.6.1 具有缺省参数的函数我们先通过一个例子来说明具有缺省参数的函数的定义及调用。例 5.12 具有缺省参数值的延时函数。#include void deleay (int n =1000)for ( ; n 0 ; n-);void main(void )cout 延时500 个单位时间 .n;deleay(500);cout 延时1000 个单位时间.n;delay(); /A例中的deleay()函数是一个具有缺省参数值的函数,参数n为要延时的时间单位(长度),n的缺省值为1000。第一次调用deleay()时,给定了实参,其值为500,这时,deleay()函数中n的取值为500;而第二次调用时,没有给出实参,则n取缺省的值,其值为1000。因此,程序中的A行等同于:delay(1000);使用具有缺省参数的函数时,应注意以下几点:1、缺省参数的说明必须出现在函数调用之前。方法可有二种:第一种方法是函数的定义放在最前面,如上例所示;第二种方法是先给出函数的原型说明,并在原型说明中依次列出参数的缺省值,而在后面定义函数时,不能重复指定缺省参数的值。例 5.13 输入长方体的长度,宽度和高度,求出长方体的体积。#include float v(float a, float b=10, float c=20); /Avoid main(void)float x,y,z;coutxyz;cout第一个长方体的体积为:V(X,Y,Z)N; coutxy;cout第二个长方体的体积为:V(X,Y)N; coutx;cout第三个长方体的体积为:V(X)N; float v(float a, float b, float c) /Breturn a*b*c;在A行中,指定了第二和第三参数的缺省值,而在B行中就不能再指定b和c的缺省值。A行也可以简写为:float v(float a, float =10, float =20);2、参数的缺省值可以是表达式,但表达式所用到的量必须有确定的值。3、在定义函数时,具有缺省值的参数可有多个,但在函数定义时,缺省参数必须位于参数表中的最右边。如上例中有A行不能写为:float v(float a, float a=10, float b);A行也不能定义为:float v(float a=20, float b, float =20);这种规定的原因是,C+语言在处理函数调用时,参数是自右向左依次入栈的。并且只有这样规定后,在函数调用时,才不可能产生二义性。4、同一个函数在不同的作用域内,可提供不同的缺省参数值。例如:void deleay (int n =100) ;.void b()void deleay (int =200) ;.deleay ( ); /缺省值为200.float cc()void deleay (int =300) ;.deleay ( ); /缺省值为300.float dd().deleay ( ) ; /缺省值为100.void deleay (int n )for ( ; n 0 ; n-);5.6.2 参数个数可变的函数到目前为止,在定义函数时,都明确规定了函数的参数个数及类型。在调用函数时,实参的个数必须与形参相同。在调用具有缺省参数值的函数时,本质上,实参的个数与形参的个数仍是相同的,由于参数具有缺省值,因此,在调用时可省略。在某些应用中,在定义函数时,并不能确定函数的参数个数,参数的个数在调时才能确定。在C+中允许定义参数个数可变的函数。我们用一个例子来说明这种函数的定义方法及使用方法。例 5.14 求输入若干个数中的最大数。#include #include int max(int num, int b .)va_list ap;int maxf,temp;va_start(ap, b); /Amaxf=b; /B 把b作为最大值for(int i=1;i num;i+)temp=va_arg(ap,int); /Ccouttemp=TEMPT; if(maxf temp) maxf=temp;va_end(ap); /Dreturn maxf;void main(void)int x,y,z,u,v;coutMAX(1,55)N; p E coutxyz;cout这三个整数中的最大数为:MAX(3,X,Y,Z)N; coutxyzu;cout这四个整数中的最大数为:MAX(4,X,Y,Z,U)N; coutxyzuv;cout这五个整数中的最大数为:MAX(5,X,Y,Z,U,V)N; 上例中定义了一个参数个数可变的函数max(),形参表中在b后的省略号“.”表示在它的后面可以没有参数,也可以有若干个参数。在定义参数个数可变的函数时,必定要用到三个库函数va_start()、va_arg()和va_end(),如例中所示。使用这三个函数时,必须包含头文件“stdarg.h”。首先,要说明一个va_list类型的变量,如例中的ap变量。va_list与int,float类同,它是C+系统预定义的一个数据类型,只有通过这种类型的变量才能从实际参数表中取出可变有参数。va_start()函数具有二个参数,第一个参数是va_list类型的变量,第二个参数必定是参数个数可变函数的形参表中最后一个固定参数的变量名,即在省略号“.”前的变量名。该函数的作用是,初始化参数个数可变的函数,使va_start()中的第一个实参(如例中的ap)指向参数个数可变函数的实参中的第一个可变的参数,并为取第一个可变的参数作好准备。因此,在参数个数可变的函数中在取可变的实数之前必须调用这个函数。程序中A行就是使变量ap指向参数b后的第一个可变的参数。函数va_arg()也具有二个参数,第一个参数必须与函数 va_start()的第一个参数相同,第二个参数应该是一个C+中预定义的数据类型名,如例中的int。该函数的作用是将第一个参数所指向的可变参数转换成由第二个参数所指定的类型的数据,并将该数据作为函数va_arg()的返回值;同时,使va_arg()的第一个参数指向下一个可变的参数,即为取下一个可变的参数作好准备。在上例中,执行C行语句时,先将ap所指向的实参变换成实数后,赋组变量temp,并使ap指向下一个可变的实参。函数va_end()只有一个参数,该参数必须与函数va_start()的第一个参数相同。该函数的作用是做好取可变实参的收尾工作,以便参数个数可变的函数能正常返回。程序中的D行就是完成收尾工作的。注意,在定义参数个数可变的函数过程中,在return语句之前,或在结束该函数之前,必须调用函数va_end()一次,做好结束工作;否则,在执行程序时,会出现不可预测的错误(典型的现象就是死机)。使用参数数目可变的函数时要注意以下几点:1、在定义函数时,固定参数部分必须放在参数表的前面,可变参数在后面,并用省略号“.”表示可变参数。在函数调用时,可以没有可变的参数,如上例中的E行。2、必须使用函数va_start()来初始化可变参数,为取第一个可变的参数作好准备工作;使用函数va_arg()依次取各个可变的参数值;最后用函数va_end()做好结束工作,以便能正确地返回。3、在调用参数个数可变的函数时,必定有一个参数指明可变参数的个数或总的实参个数。上例中的第一个参数值为总的实际参数的个数。另一种方法是在省略号“.”前的参数值为可变参数的个数。如上例中的函数 max()可改写为:#include int max(int num.)va_list ap;int maxf,temp;if( num = 0) cout参数个数不对!n;exit(2);va_start(ap
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年下沉市场消费金融风险管理策略研究报告
- 2025年体检行业服务质量提升与行业风险管理策略报告
- 2025年商业写字楼智能化系统初步设计评估与智能化系统应用效果评估报告
- 药品超市购物管理制度
- 药学门诊咨询管理制度
- 药店店长业务管理制度
- 药店药品效期管理制度
- 营业场所库存管理制度
- 设备保养检修管理制度
- 设备备件仓库管理制度
- 2025年高考江苏卷物理真题(解析版)
- 2025年重庆市中考化学试卷真题(含标准答案)
- 科学技术普及法解读
- 医院检验科实验室生物安全程序文件SOP
- 北京市朝阳区2022-2023四年级下册数学期末试题+答案
- 发动机装调工:高级发动机装调工试题及答案
- 药物临床试验的伦理审查课件
- EHS目标与指标管理一览表
- L等级考试LTE无线网络优化L3
- 河北省工伤职工停工留薪期分类目录
- PROFINET总线技术在汽车生产线上的应用
评论
0/150
提交评论