1、函数参数的默认值
- C++中可以在函数声明时为参数提供一个默认值
- 当函数调用时没有提供参数的值,则使用默认值
举个例子:
#include <stdio.h>
int mul(int x = 0); //前项声明
int main()
{
printf("%d\n", mul());
printf("%d\n", mul(-1));
printf("%d\n", mul(2));
return 0;
}
int mul(int x )
{
return x*x;
}
#include <stdio.h>
int mul(int x = 0)
{
return x*x;
}
int main()
{
printf("%d\n", mul());
printf("%d\n", mul(-1));
printf("%d\n", mul(2));
return 0;
}
其实不写声明,直接在函数定义里的参数中写默认值也是可以的。
如上所示,当我们的函数没有提供参数时,会使用默认参数。默认参数就是前项声明里的值。
参数的默认值必须在函数声明中指定,函数的定义中不能出现参数的默认值,会报错。当函数声明和定义中的参数默认值不同时,同样也会报错。
详情:
#include <stdio.h>
int mul(int x = 2); //前项声明
int main()
{
printf("%d\n", mul());
return 0;
}
int mul(int x = 2)
{
return x*x;
}
#include <stdio.h>
int mul(int x = 2); //前项声明
int main()
{
printf("%d\n", mul());
return 0;
}
int mul(int x = 0)
{
return x*x;
}
2、参数默认规则
— 参数的默认值必须从右向左提供
— 函数调用时使用了默认值,则后续参数必须使用默认值
int add(int x, int y = 1, int z = 2)
{
return x + y + z;
}
add(0);
add(2, 3);
add(3, 2, 1);
先用你函数提供的参数,如果不够就使用默认值参数。
#include <stdio.h>
int add(int x, int y = 0, int z = 3);
int main()
{
printf("%d\n", add(1));
printf("%d\n", add(1, 2));
printf("%d\n", add(1, 2, 3));
return 0;
}
int add(int x, int y, int z)
{
return x + y + z;
}
如果在声明时参数默认值不按从右向左提供的规则:
int add(int x, int y = 0, int z)
很明显,程序报错。解决的办法是我们可以在函数声明和函数定义的时候给它调个位子。
#include <stdio.h>
int add(int x, int z, int y = 1);
int main()
{
printf("%d\n", add(1, 0));
printf("%d\n", add(1, 2));
printf("%d\n", add(1, 2, 3));
return 0;
}
int add(int x, int z, int y)
{
return x + y + z;
}
3、函数的占位参数
- 在C++中可以为函数提供占位参数
— 占位参数只有参数类型声明,而没有参数名声明
— 一般情况下,在函数体内部无法使用占位参数
int func(int x, int)
{
return x;
}
//...
func(1, 2); //ok
占位参数的出现实际上是为了兼容C语言,因为C语言有这样的写法:void func();
它可以接收任意个参数,但是这条语句在C++里面的意思就是不接收任意参数。
- 占位参数的意义:
— 占位参数与默认参数结合起来使用
— 兼容C语言程序中可能出现不规范的写法
这是为了避免将C语言程序移植到C++编译器而产生非常大的错误。
#include <stdio.h>
void func(int = 0, int = 0)
{
}
int main()
{
func(); //如果不加默认参数,这里会报错,这是C语言的写法
func(1, 2);
return 0;
}
小结:
- C++中支持函数参数的默认值
- 如果函数调用时没有提供参数值,则使用默认值
- 参数的默认值必须从右向左提供
- 函数调用时使用了默认值,则后续参数必须使用默认值
- C++中支持占位参数,用于兼容C语言中的不规范写法。