- 默认实参的例子
//所有形参有默认值
int fun(int a=1,int b=2,int c=3)
{
return a+b+c;
}
//部分形参有默认值
int fun(int a,int b=2,int c=3)
{
return a+b+c;
}
可以所有函数形参都赋予默认值,也可以只部分赋予,但是,一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。
- 默认实参的声明及初始化
一般来说,函数只声明一次,但实际上函数多次声明是合法的,要注意的是,在某个作用域中一个形参只能被赋予一次默认实参。函数的后续声明只能为之前没有默认值的形参添加默认实参,而且如上面所述,该形参右侧所有形参都要有默认值。
int fun(int a,int b,int c=1);
int fun(int a,int b,int c=1);//错误,重复声明
int fun(int a,int b,int c=2);//错误,重复声明
int fun(int a,int b=2,int c);//正确,添加默认实参
//实际上是声明了一个函数:
int fun(int a,int b=2,int c=1);
1. 表达式或函数可以作为默认实参。
int tmp1=1;
int tmp2=2;
int getVal(){return 1;}
void fun(int a=getVal(),int b=tmp1,int c=tmp2);
2. 局部变量不能作为默认实参。
//接上面的代码
void fun1()
{
tmp1=3;//改变了默认实参
int tmp2=3;//未改变默认实参
fun();
}
函数fun1内部改变了tmp1的值,所以fun的调用会传递这个更新的值。
声明的局部变量隐藏了外层的tmp2,但是这个局部变量跟传递给fun的默认实参没有关系。
参考资料:《C++ Primer》