默认参数:
在C++中,可以为参数指定默认值。在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数。
#include<iostream>
using namespace std;
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了。而当我们填写参数时,函数也能够按照我们的意愿正常运行。
在定义默认参数时,必须在函数声明中定义。
定义默认参数的顺序:
当一个函数具有多个参数时,定义默认参数的方向是从右向左的,即以最后一个参数定位的;而匹配参数的方向是从左向右的,即以第一个参数定位的,如下图所示:
如果要定义默认参数,那么必须从最后一个参数定义起,并且逐渐向前(左)定义,不可以跳过某个参数。
如果调用一个定义了默认参数的函数,那么填写的第一个参数一定是和最左边形参匹配,并且逐渐向后(右)匹配,不可以中途省略某一个参数,直到所有未被设置默认值的形参都有参数。
于是,在调用函数时,用户向右自定义的实参至少要和向左来的已定义默认参数的形参相邻,函数才能够被成功调用。否则这个函数就是缺少参数的。
默认值可以是全局变量、全局常量,甚至是一个函数。但不可以是局部变量,因为默认参数的调用是在编译时确定的,而局部变量位置与默认值在编译时无法确定。
例如:
定义时:
void mal(int a, int b=3, int c); //错误,从右向左定义,不可以跳过某个参数
void mal(int a, int b=3, int c=5); //正确
调用时:
mal(3,8,9); // mal(3,8,9) 调用时有指定参数,则不使用默认参数
mal(3,5); // mal(3,5,5) 调用时只指定两个参数,按从左到右顺序调用
mal(3); // mal(3,3,5) 调用时只指定1个参数,按从左到右顺序调用
mal( ); //错误,因为a没有默认值,也没有人为的设置
mal(3, , 9) //错误,应按从左到右顺序逐个调用
函数默认参数和重载函数:
int f(int a);
int f(int a,int b=2);
int f(int a,int b=3,int c=4);
这些函数不论是从重载的角度看,还是从默认参数的角度看都是合法的。然而,这样的写法却是不合理的。
当调用函数f(1)的时候,三个函数都是可以匹配的,因为计算机可以认为省略了后面的参数;当调用函数f(1,1)的时候,后两个函数也都是可以匹配的……
由于计算机无法确认我们到底想要调用哪个函数,所以导致了错误的发生。