默认参数
对于默认值大家都不陌生,比如在安装某一款软件时,在安装过程中会有好多选项设置了默认参数值,你可以不管它继续安装,当然你也可以更改这些默认值。类似于此,C++的函数也支持默认参数机制,即在定义或声明函数时给形参一个初始值,在调用函数时,如果不传递实参就使用默认参数值。例如下面两个设置图片大小的的函数声明,一个带默认参数值,一个不带。
int _size1(int length = 20, int width = 30);
int _size2(int length, int width);
调用size1()函数时,如果不传递参数,则图片默认大小为2030;如果调用size2()函数,则必须要传递参数来设置图片大小。接下来我们通过一个具体的案例来学习默认参数的用法,如例1所示。
例1
1 #include <iostream>
2 using namespace std;
3 void add(int x, int y = 1, int z = 2); //函数声明中有两个形参有默认值
4 int main()
5 {
6 add(1); //只传递1给形参x,y、z使用默认形参值
7 add(1, 2); //传递1给x,2给y,z使用默认形参值
8 add(1, 2, 3); //传递三个参数,不使用默认形参值
9 system("pause");
10 return 0;
11 }
12 void add(int x, int y, int z)
13 {
14 cout<< x + y + z << endl;
15 }
运行结果如图1所示。
图1 例1-11运行结果
在例1中定义了函数add(),三个形参有两个有默认参数值,在main()中调用该函数分别传入一个参数、两个参数、三个参数,都有结果打印出来,说明在传入参数不足的情况下函数使用了默认参数。
在使用默认参数时有一些规则需要注意。
(1)默认参数只可在函数声明中出现一次,如果没有函数声明 ,只有函数定义,才可以在函数定义中设定。如例1中,add()函数既有定义又有声明,则默认参数只能在函数声明中设定而不能在函数定义中设定。
(2)默认参数定义的顺序是自右向左,即如果一个参数设定了默认参数,则其右边不能再有普通参数。例如下面的代码:
void add1(int x, int y = 1, int z = 2); //正确
void add2(int x, int y = 1, int z); //错误,默认参数后不能再有普通的形参
(3)默认参数调用时,遵循参数调用顺序,即有参数传入它会先从左向右依次匹配。
(4)默认参数值可以是全局变量、全局常量,甚至可以是一个函数,但不可以是局部变量,因为默认参数的值是在编译时确定的,而局部变量位置与默认值在编译时无法确定。