注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。
测试环境:Ubuntu 10.10
GCC版本:4.4.5
一、函数参数的默认值
1)C++中可以在函数声明时为参数提供一个默认值
2)当函数调用时没有提供参数的值,则使用默认值
int mul(int x = 0); //声明时有默认值
int main(int argc, char *argv[])
{
printf("%d\n", mul()); //mul(0)
return 0;
}
int mul(int x)
{
return x * x;
}
3)参数的默认值必须在函数声明中指定
问题:
函数定义中是否可以出现参数的默认值?
当函数声明和定义中的参数默认值不同时会发生什么?
int mul(int x = 0);
// ……
int mul(int x = 5)
{
return x * x;
}
int r = mul(); //r = 0;
如果r的值是什么?
int r = mul();
实例分析
默认参数值初探
7-1.cpp
#include <stdio.h>
int mul(int x = 0);
int main(int argc, char *argv[])
{
printf("%d\n", mul()); //使用了默认值0
printf("%d\n", mul(-1));
printf("%d\n", mul(2));
return 0;
}
int mul(int x)
{
return x * x;
}
操作:
1) g++ 7-1.cpp -o 7-1.out编译成功,运行结果:
0
1
4
2) 修改代码,定义mul()时增加形参默认值:
#include <stdio.h>
int mul(int x = 0);
int main(int argc, char *argv[])
{
printf("%d\n", mul()); //使用了默认值0
printf("%d\n", mul(-1));
printf("%d\n", mul(2));
return 0;
}
int mul(int x = 5)
{
return x * x;
}
g++ 7-1.cpp -o 7-1.out编译报错:
7-1.cpp:14:18: error: default argument given for parameter 1 of 'int mul(int)'
int mul(int x = 5)
错误:参数1给了默认值
7-1.cpp:3:5: error: after previous specification in 'int mul(int)'
int mul(int x = 0);
程序结论:声明提供默认值,定义时不提供。
4)函数默认值参数的规则
- 参数的默认值必须从右向左提供(参见C进阶函数参数秘密)
- 函数调用时使用了默认值,则后续参数必须使用默认值
int add(int x, int y = 1, int z = 2)
{
return x + y + z;
}
add(0); // x = 0, y = 1, z = 2;
add(2,3); // x = 2, y = 3, z = 2;
add(3,2,1); // x = 3, y = 2, z = 1;
注意:设计函数时要从右向左考虑,例如,int add(int x, int y = 0, int z)会报错,更换形参顺序(y,z)可以解决问题。
编程实验
默认参数的错误示例
7-2.cpp
#include <stdio.h>
int add(int x, int y = 0, int z = 0);
int main(int argc, char *argv[])
{
printf("%d\n", add(1)); //x=1 y=0 z=0
printf("%d\n", add(1, 2)); //x=1 y=2 z=0
printf("%d\n", add(1, 2, 3)); //x=1 y=2 z=3
return 0;
}
int add(int x, int y, int z)
{
return x + y + z;
}
操作:
1) g++ 7-2.cpp -o 7-2.out编译正常,打印结果:
1
3
6
2) 去掉add()函数声明时z的默认值
#include <stdio.h>
int add(int x, int y = 0, int z);
int main(int argc, char *argv[])
{
printf("%d\n", add(1)); //x=1 y=0 z=0
printf("%d\n", add(1, 2)); //x=1 y=2 z=0
printf("%d\n", add(1, 2, 3)); //x=1 y=2 z=3
return 0;
}
int add(int x, int y, int z)
{
return x + y + z;
}
g++ 7-2.cpp -o 7-2.out编译错误:
7-2.cpp:3:5: error:default argument missing for parameter 3 of 'int add(int, int, int)'
int add(int x, int y = 0, int z);
错误:int add(int, int, int)参数3丢失默认值。
二、函数占位参数
1)在C++中可以为函数提供占位参数
- 占位参数只有参数类型声明,而没有参数名声明(在C中的函数指针和转换表中使用过)
- 一般情况下,在函数体内部无法使用占位参数
int func(int x, int)
{
return x;
}
//...
func(1, 2); //ok!
2)函数占位参数的意义
- 占位参数与默认参数结合起来使用
- 兼容C语言程序中可能出现的不规范写法
下面的两种声明方式等价吗?
void func(); <--> void func(void);
C:不等价,无参数可以接受任意类型且多个参数;void表示参数为空。测试:gcc
C++:等价。测试:g++
void func(),在C语言下可以执行;在C++下不可以执行!证明C++对于程序类型检查更严谨。
编程实验
占位参数与默认参数值(为了兼容C中不规范写法)
7-3.cpp
#include <stdio.h>
int func(int x = 0, int = 0) //c++
{
}
int main(int argc, char *argv[])
{
func();
func(1,2);
return 0;
}
操作:
1) C++版本代码:g++ 7-3.cpp -o 7-3.out编译正常
2) C版本代码:
#include <stdio.h>
int func()
{
}
int main(int argc, char *argv[])
{
func();
func(1,2);
return 0;
}
gcc 7-3.c -o 7-3.out编译正常。
分析:
从C版本移植到C++版本,只需要增加默认值x=0,和占位参数int = 0即可。编译器对函数形参处理是从右至左。
小结:
1)C++中支持函数参数的默认值
2)如果函数调用时没有提使用供参数值,则使用默认值
3)参数的默认值必须从右向左提供
4)函数调用时使用了默认值,则后续参数必须使用默认值
5)C++中支持占位参数,用于兼容C语言中的不规范写法