现在有很多电器都很人性化,比如自动洗衣机,如果想偷个懒你就可以直接把衣服扔进去,使用自动功能,它就能帮你全都搞定;如果哪天要洗个什么大件物品,你也可以人工对其进行设置,同样让你用得得心应手。
我们在调用函数时,可能会要填写很多的参数,那么电脑能否像自动洗衣机一样,让我们偷个懒,帮我们把参数都自动填好呢?
我们知道,所谓自动洗衣功能就是使用其预置好的程序进行洗涤。如果我们也将函数的参数预置好,那么我们同样可以不必填写参数就能让函数运作起来。这些预置的参数称为默认参数。
下面我们先来看一个程序,熟悉一下如何来定义默认参数:(程序6.4)
#include "iostream.h"
void create(int n=100);//在函数声明中定义默认参数
int main()
{
create();//默认实参为100
create(5);//人工设置实参
return 0;
}
void create(int n)//假设该函数的作用是创建空间
{
cout <<"要创建" <<n <<"个空间" <<endl;
}
运行结果:
要创建100个空间
要创建5个空间
当调用create函数,不填写参数时,电脑自动将参数n设置为100了。而当我们填写参数时,函数也能够按照我们的意愿正常运行。
在定义默认参数时,必须在函数声明中定义。不过,当对多个参数设置默认参数时,会有一些麻烦的情况。
当一个函数具有多个参数时,定义默认参数的方向是从右向左的,即以最后一个参数定位的;而匹配参数的方向是从左向右的,即以第一个参数定位的,如下图所示:
如果我们要定义默认参数,那么我们必须从最后一个参数定义起,并且逐渐向前(左)定义,不可以跳过某个参数,直到所有的形参都被定义了默认值。
如果我们调用一个定义了默认参数的函数,那么我们填写的第一个参数一定是和最左边形参匹配,并且逐渐向后(右)匹配,不可以中途省略某一个参数,直到所有未被设置默认值的形参都已经有参数。
于是,在调用函数时,用户向右自定义的实参至少要和向左来的已定义默认参数的形参相邻,函数才能够被成功调用。否则这个函数就是缺少参数的。
我们在上一节讲了重载函数这个有用的工具,这一节的默认参数也会给我们的程序设计带来方便,然而我们把这两样有用的东西放在一起,却会带来不小的麻烦。我们来看下面这些函数原型:
int fn(int a);
int fn(int a,int b=2);
int fn(int a,int b=3,int c=4);
这些函数不论是从重载的角度看,还是从默认参数的角度看都是合法的。然而,这样的写法却是不合理的。
当我们调用函数fn(1)的时候,三个函数都是可以匹配的,因为电脑可以认为我们省略了后面的参数;当我们调用函数fn(1,1)的时候,后两个函数也都是可以匹配的……由于电脑无法确认我们到底想要调用哪个函数,所以导致了错误的发生。
因此,我们在同时使用重载函数和默认参数的时候,要注意到这一点。