定义
在C++中,定义函数时可以给形参指定一个默认的值,这样调用函数时如果没有给这个形参赋值(没有对应的实参),那么就使用这个默认的值。也就是说,调用函数时可以省略有默认值的参数。如果用户指定了参数的值,那么就使用用户指定的值,否则使用参数的默认值。
所谓默认参数,指的是当函数调用中省略了实参时自动使用的一个值,这个值就是给形参指定的默认值。下面是一个简单的示例:
#include<iostream>
using namespace std;
//带默认参数的函数
void func(int n, float b=1.2, char c='@'){
cout<<n<<", "<<b<<", "<<c<<endl;
}
int main(){
//为所有参数传值
func(10, 3.5, '#');
//为n、b传值,相当于调用func(20, 9.8, '@')
func(20, 9.8);
//只为n传值,相当于调用func(30, 1.2, '@')
func(30);
return 0;
}
运行结果:
10, 3.5, #
20, 9.8, @
30, 1.2, @
参数添加顺序
对于带参数列表的函数,必须从右向左添加默认值。也就是说,要为某个参数设置默认值,则必须为它的右边的所有参数提供默认值:
int function1(int n,int m = 4,int j = 5); //有效
int function2(int n,int m = 6,int j); //无效
int function3(int k = 1,int m = 2,int n = 3); //有效
例如,function1( )原型允许调用该函数时提供1个、2个或3个参数:
beeps = function1(2);//即function1(2,4,5)
beeps = function1(1,8);//即function1(1,8,5)
beeps = function1(8,7,6);//即function1(8,7,6)没有使用默认参数
实参按从左到右的顺序依次被赋给相应的形参,而不能跳过任何参数。因此,下面的调用是不允许的:
beeps = function1(3,,8)//无效
注意事项
这种默认参数的情况会带来有些便利。(比如初始化一个商品对象,在99%的情况在都是正常的,那么这个商品是否正常的标记就可以默认为1,特殊的1%情况,再加上)。但是有以下三个要注意的情况:
1.默认参数只能放在函数声明处或者定义处,能放在声明处就放在声明处 。
a. 大部分情况,别人调用你的代码只能看到函数声明,如果你写在定义处,别人根本不知道你的默认参数是什么。
b.如果你是在定义处写的默认参数,那么你在使用该函数前就需要把函数定义放在前面。不然编译阶段通过无默认参数的函数声明无法确定这个函数是带默认参数的。
所以,默认参数写在声明处。
2.如果某个参数是默认参数,那么它后面的参数必须都是默认参数
因为非默认参数的参数必须要给出具体值,而调用函数传递参数的时候是从左到右的,所以非默认参数前面的都必须要传值进来。
那么默认参数后面的当然也得都为默认参数。
3.不要重载一个带默认参数的函数
class Test
{
public:
int func(int a)
{
return a;
}
int func(int a, int b = 1)
{
return a + b;
}
} ;
你调用func(1)的时候,谁知道你想调用哪一个。