C++中的默认参数
文章目录
C++可以给函数定义默认参数值。在函数调用时没有指定与形参相对应的实参时,就自动 使用默认参数。
默认参数的语法与使用:
- 在函数声明或定义时,直接对参数赋值,这就是默认参数。
- 在函数调用时,省略部分或全部参数。这时可以用默认参数来代替。
默认参数在函数声明中提供,当有声明又有定义时,定义中不允许默认参数。如果函数只 有定义,则默认参数才可出现在函数定义中。例如:
void point(int=3,int=4);//声明中给出默认值
void point(int x,int y) 〃定义中不允许再给出默认值
{
cout<<x<<endl;
cou<<<<endl;
}
在使用默认参数时,一般需要注意以下几个问题:
-
如果一个函数中有多个默认参数,则形参分布中,默认参数应从右至左逐渐定义。例如:
void fun(int a=1 ,int b,int c=3,int d=4); void fun(int a,int b=2,int c=3,int d=4); 上例中,第1种声明方法就是错误的,而第2种声明方法就是正确的。
-
在默认参数调用时,调用顺序为从左到右逐个调用。
例如,首先声明一个带默认参数的函数void mal(int a, int b=3,int c=5),
-
函数调用mal(3,8,9)在调用时有指定参数,则不使用默认参数,是合法调用;
-
函数调mal(3, 5)在调用时只指定两个参数,按从左到右的顺序调用,相当mal(3,5,5),是合法调用.
-
函数mal(3)在调用时只指定1个参数,按从左到右的顺序调用,相当于mal(3,3,5),是合法调用;
-
而函数调用mal()因为a没有默认值,所以调用错误;
-
函数调用mal(3,,9)应按从左到右的顺序逐个调用,所以也错误。
- 默认值可以是全局变量、全局常量,甚至是一个函数。
例如:
int a=l;
int fim(int);
int g(int x,ftm(a));//正确:允许默认值为函数
默认值不可以是局部变量,因此默认参数的函数调用是在编译时确定的,而局部变量的位 置与值在编译时均无法确定。例如:
void ftin()
{
int i;
voidg(intx=i);//错误:处理g()函数声明时,i不可见
}
-
默认参数可将一系列简单的重载函数合成为一个。例如下面的3个重载函数:
void point(int,int){//…} void point(int a){return point(a,4);} void point() {return point(3,4);}
可以用下面的默认参数的函数来替代:
void point(int=3,int=4);
上例中,当调用“point();”时,即调用“point(3,4);”它是第3个声明的重载函数。当调用“point(6);”时,即调用“point(6,4);”它是第2个声明的重载函数。当调用“point(7,8);”时,即调用第1个声明的重载函数。
如果一组重载函数(可能带有默认参数)都允许相同实参个数的调用,将会引起调用的二 义性。例如:
void fanc(int);重载函数之一
void func(int,int=4);//重载函数之二,带有默认参数
void func(int=3,int=4);//重载函数三,带有默认参数
func(7);//错误:到底调用3个重载函数中的哪个?
func(20,30);//错误:到底调用后面两个重载函数的哪个?
文章作者 Forz
上次更新 2017-09-05