1 C++中函数参数的默认值
1.1 C++中函数参数的默认值
对于C++中函数参数的默认值:
- C++中可以在函数声明时为参数提供一个默认值。
- 当函数调用时没有提供参数的值,则使用默认值。
注意: 参数的默认值必须在函数声明中指定,不能在定义中指定,否则编译报错。
问题:函数定义中是否可以出现参数的默认值?当函数声明和定义中的默认值不同时是否会发生错误?
如上直接编译错误。
实例分析:默认参数值初探
#include <stdio.h>
int mul(int x = 0);
int main(int argc, char *argv[])
{
printf("%d\n", mul());
printf("%d\n", mul(-1));
printf("%d\n", mul(2));
return 0;
}
int mul(int x)
{
return x * x;
}
/*
第一种情况:当声明和定义的默认值不同时
error: default argument given for parameter 1 of ‘void fun(int)’
error: after previous specification in ‘void fun(int)’
void fun(int x = 555);
*/
/*
第二种情况:当声明中无默认值,而定义中有默认值
此时调用函数必须按相应参数进行传参,否则会报错。并且定义时的默认值并不会起作用,这是种没有意义的做法,虽然编译通过了。
*/
/*
第三种情况:声明和定义时均给出了默认值,则直接编译错误。
*/
1.2 函数默认参数的规则
函数默认参数的规则:
- 参数的默认值必须从右向左提供,设计函数时使用什么样的默认值;
- 函数调用时使用了默认值,则后续参数必须使用默认值,即参数调用时参数匹配从左到右。
编程实验:默认参数的错误示例
#include <stdio.h>
int add(int x, int y = 0, int z = 0);
int main(int argc, char *argv[])
{
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;
}
/*
不正确声明
default argument missing for parameter 2 of ‘void fun(int, int, int)’
void fun(int x = 555, int y, int z = 12);
*/
2 函数占位参数
2.1 函数占位参数
函数占位参数:
- 在C++中可以为函数提供占位参数。
- 占位参数只有参数类型声明,而没有参数名声明。
- 一般情况下,在函数体内部无法使用占位参数。
2.2 函数占位参数的意义
主要意义如下:
- 占位参数与默认参数结合起来使用;
- 兼容C语言程序中可能出现的不规范写法。
问题:下面的两种声明方式等价吗?
void fun(); <-> void fun(void);
(C语言中不等价,不写void意味着接收任意的参数,写void意味着不接收任何参数;C++中等价,都意味着不接收任何参数)
编程实验:占位参数与默认参数值
#include <stdio.h>
int func(int x, int = 0);
int main(int argc, char *argv[])
{
printf("%d\n", func(1));
printf("%d\n", func(2, 3));
return 0;
}
int func(int x, int)
{
return x;
}
示例代码:占位符与默认参数结合起来使用
#include<stdio.h>
void fun(int = 0, int = 0);
int main(void)
{
fun(1,2);
fun();
return 0;
}
void fun(int, int)
{
}
参考资料: