第7课 - 函数参数的扩展
第7课 - 函数参数的扩展
1. 函数参数的默认值
(1)C++ 中可以在函数声明时为参数提供一个默认值 (注意是在声明中提供,不能在函数定义中提供)
(2)当函数调用时没有提供参数的值,则使用默认值
1 #include <stdio.h> 2 3 //默认值只能在函数声明时提供 4 int mul(int x = 0); //参数x的默认值为0 5 6 int main() 7 { 8 printf("%d\n", mul()); //传入默认值0 9 printf("%d\n", mul(-1)); //传入-1 10 printf("%d\n", mul(2)); //传入2 11 12 return 0; 13 } 14 15 int mul(int x) //定义中,不能提供默认值,编译器会报错 16 { 17 return x * x; 18 }
(3)函数默认参数的规则
① 参数的默认值必须从左向右提供
② 函数调用时使用了默认值,则后续参数必须使用默认值
1 #include <stdio.h> 2 3 //默认参数必须从右向左提供,诸如 4 //int add(int x = 0,int y = 1,int z)是错误的 5 int add(int x, int y = 1, int z = 2); 6 7 int main() 8 { 9 //第2参数y使用了默认值,则后续的z也必须使用默认值 10 //诸如add(1, ,3);的调用是错的。 11 printf("%d\n", add(0)); //x = 0, y = 1, z = 2 12 13 printf("%d\n", add(2, 3)); //x = 2, y = 3, z = 2 14 printf("%d\n", add(3, 2, 1));//x = 3, y = 2, z = 1 15 16 return 0; 17 } 18 19 int add(int x, int y, int z) 20 { 21 return x + y + z; 22 }
2. C++ 中的函数占位参数
(1)占位参数只有参数类型声明,而没有参数名声明
(2)一般情况下,在函数体内部无法使用占位参数
(3)函数占位参数的意义
① 占位参数与默认参数结合起来使用,使得C的代码经过简单的修改可以方便的在C++中使用
② 兼容C语言程序中可能出现的不规范写法
在C 语言中两者是不等价的,前者是接收任意个参数,后者是不接收参数;在C++ 中两者是等价的,都是不接收参数。
1 #include <stdio.h> 2 3 //在C中int func()是可以接受任意参数的,所以在后来的调用中可能 4 //出现func(1)、func(2, 3)等不同的调用,而这样的代码在C++中是 5 //错误的,所以为了兼容C语言这种不规范的写法,可以给func提供两个 6 //占用参数如func(int = 0,int = 0),则前面的两种调用就合法了, 7 //这样花很少的代价,就可以让C的代码可以在C++中使用。让人感觉仿 8 //佛C++也可以像C语言一样,接受任意个参数了! 9 10 //占位参数,且默认值为0 11 int func(int x = 0, int = 0); 12 13 int main() 14 { 15 printf("%d\n", func()); //0 16 printf("%d\n", func(1)); //1 17 printf("%d\n", func(2, 3)); //2 18 19 return 0; 20 } 21 22 //第2个参数为占位参数(没参数名),因此在函数内部也就无法使用 23 //这个参数,只起到占位的作用 24 int func(int x, int) 25 { 26 return x; 27 }
3. 小结
(1)C++ 中支持函数参数的默认值
(2)如果函数调用时没有提供参数值,则使用默认值
(3)参数的默认值必须从右向左提供
(4)函数调用时使用了默认值,则后续参数必须使用默认值
(5)C++ 中支持占位参数,用于兼容C 语言中的不规范写法