AP计算机科学A(APcomputer science A)复习备考攻略视频教程
42752 人在学
什么是C++语言中带默认参数的函数,它和我们之前讲到的重载函数又有着什么关系,估计很多初学者对此都并不太了解。为此本次的讲解课课家笔者主要给大家普及下C++语言中函数的默认参数的基本概念以及具体的编写应用。
在C++中定义函数时我们可以给参数指定一个默认的初始值。通常调用函数时可以省略有默认值的参数,也就是说如果我们指定了参数的值,那么就使用我们指定的值,否则使用参数的默认值。指定了默认值的参数,称为默认参数。简单点来说,C++函数的默认参数指的是在函数声明或者定义时给形式参数指定默认值,从而在调用参数时可以少写参数,而少掉的参数用默认值代替。
◎默认参数的语法与使用
在刚才上述的基本概念中我们了解到两点:
①在函数声明或定义时,直接对参数赋值。
②在函数调用时,省略部分或全部参数。
下面是需要大家在使用默认参数时注意的几点补充:
①默认参数只可在函数声明中设定一次。只有在无函数声明时,才可以在函数定义中设定。
②默认参数定义的顺序为自右到左。即如果一个参数设定了缺省值时,其右边的参数都要有缺省值,具体比如:
intmal(inta,intb=3,intc=6,intd=8)正确,按从右到左顺序设定默认值。
intmal(inta=6,intb=3,intc=5,intd)错误,未按照从右到左设定默认值。c设定缺省值了,而其右边的d没有缺省值。
③默认参数调用时,则遵循参数调用顺序,自左到右逐个调用。这一点大家记得要和②分清楚,不要混淆,具体比如:
voidmal(inta,intb=3,intc=5);//默认参数
mal(3,8,9);//调用时有指定参数,则不使用默认参数
mal(3,5);//调用时只指定两个参数,按从左到右顺序调用,相当于mal(3,5,5);
mal(3);//调用时只指定1个参数,按从左到右顺序调用,相当于mal(3,3,5);
mal();//错误,因为a没有默认值
mal(3,,9)//错误,应按从左到右顺序逐个调用(调用实参,即,实参必须是连续的)
再比如:
voidmal(inta=8,intb=3,intc=5);//默认参数
mal();//正确,调用所有默认参数,相当于mal(8,3,5);
④默认值可以是全局变量、全局常量,甚至是一个函数。但不可以是局部变量。因为默认参数的调用是在编译时确定的,而局部变量位置与默认值在编译时无法确定。
看完上面的基本概念介绍,大家可能还是对此觉得比较模糊,为了进一步深化大家对此的理解,大家可以观察下面的代码例子:
#include<iOStream>
usingnamespacestd;
//带默认参数的函数
voidfunc(intn,floatb=1.2,charc='@'){
cout<<n<<","<<b<<","<<c<<endl;
}
intmain(){
//为所有参数传值
func(10,3.5,'#');
//为n、b传值,相当于调用func(20,9.8,'@')
func(20,9.8);
//只为n传值,相当于调用func(30,1.2,'@')
func(30);
return0;
}
输出结果
10,3.5,#
20,9.8,@
30,1.2,@
在上面的代码例子中此代码式定义了一个带有默认参数的函数func(),并在main()函数中进行了不同形式的调用。在实际的编写操作中为参数指定默认值其实非常简单,我们直接在形参列表中赋值就可以了,事实上这和定义普通变量的形式比较类似。另外值得我们注意的一点是,默认参数的值除了使用字面量指定,也可以使用表达式指定,具体比如:
floatd=10.8;
voidfunc(intn,floatb=d+2.9,charc='@'){
cout<<n<<","<<b<<","<<c<<endl;
}
在C++中规定,默认参数只能放在形参列表的最后且一旦为某个参数指定了默认值,那么它后面的所有参数都必须有默认值。如之前所提到的,实参和形参的传值是从左到右依次匹配的,默认参数的连续性是保证正确传参的前提。
下面的是正确的代码写法:
voidfunc(inta,intb=10,intc=20){}
voidfunc(inta,intb,intc=20){}
而下面是不正确的写法:
voidfunc(inta,intb=10,intc=20,intd){}
voidfunc(inta,intb=10,intc,intd=20){}
除了函数定义,我们也可以在函数声明中指定默认参数。不过默认参数只能指定一次,在声明中指定了就不能在定义中指定,反过来也一样。具体大家可以观察下面的代码例子:
#include<iostream>
usingnamespacestd;
voidfunc(inta,intb=10,intc=20);
intmain(){
func(20,30);
return0;
}
//不能再指定默认参数
voidfunc(inta,intb,intc){
cout<<a<<","<<b<<","<<c<<endl;
}
输出结果:
20,30,20
◎默认参数和重载
默认参数和重载不能同时出现:使用了默认参数就不能使用重载,使用了重载也不能使用默认参数,它们是相互冲突的。因为当调用函数时如果少写一个参数,编译器就无法判定是利用函数重载还是利用默认参数,会出现二义性,无法执行。大家在进行程序编写时要时刻注意这一点。
本次的C++基础知多点之函数的默认参数的讲解到此暂告一段落,如果以后有什么相关的内容补充或者修改的话,笔者会在此继续进行相关的内容的补充或者修改的工作,同时也欢迎大家对本次的讲解提出自己的建议和补充。最后笔者希望本次的讲解对大家学习C++能够起到一定的帮助作用!