1、默认函数本质功能:使用【不同数目】的参数调用【同一个函数】
2、与函数多态(函数重载)的区别:多态是使用【相同】或【不同】数目的参数,调用多个同名函数
3、默认参数和重载不能同时出现:使用了默认参数就不能使用重载,使用了重载也不能使用默认参数,它们是相互冲突的。因为当调用函数时如果少写一个参数,编译器就无法判定是利用函数重载还是利用默认参数,会出现二义性,无法执行。
例子1:
using namespace std;
void func(int a, float b=1.2, char c='@'){
cout<< a <<", "<<b<<", "<<c<<endl;
}
int main(){
func(10, 3.5, '#'); //为所有参数传值
func(20, 9.8); //为a、b传值,相当于调用func(20, 9.8, '@')
func(30); //只为n传值,相当于调用func(30, 1.2, '@')
return 0;
}
输出:10,3.5,#
20,9.8,@
30,1.2,@
4、C++规定,默认参数只能放在形参列表的最后,而且一旦为某个参数指定了默认值,那么它后面的所有参数都必须有默认值。
void func(int a, int b=10, int c=20){ } //right
void func(int a, int b, int c=20){ } //right
void func(int a, int b=10, int c=20, int d){ } //false
void func(int a, int b=10, int c, int d=20){ } //false
5、可以在函数声明中指定默认参数,不过默认参数只能指定一次,在声明中指定了就不能在定义中二次声明
void func(int a, float b=1.2, char c='@');
int main(){
func(30); //只为n传值,相当于调用func(30, 1.2, '@')
return 0;
}
//如下是错误写法,无法编译通过
void func(int a, float b=1.2, char c='@'){
cout<< a <<", "<<b<<", "<<c<<endl;
}
//正确写法如下所示:
void func(int a, float b, char c){
cout<< a <<", "<<b<<", "<<c<<endl;
}