函数提高
函数默认参数
- 未传数据,则用默认形参值,传入实参值,优先使用实参值
int func1(int a, int b = 1){
return a+b;
}
int main(){
cout<<func1(1,2)<<endl; //1+2=3
cout<<func1(1)<<endl; //1+1=2
}
- 从有默认值的位置后,必须均有默认值
int func2(int a, int b = 1,int c = 3){
return a+b+c;
} //right
int func2(int a, int b = 1,int c){
return a+b+c;
} //error
- 声明函数时有默认参数,则实现不能有,即二者只能有一处有默认参数
int func3(int a,int b=10,int c=22);
int func3(int a, int b = 1,int c = 3){
return a+b+c;
} //error 重定义默认参数!!
int func3(int a,int b=10,int c=22);
int func3(int a, int b,int c){
return a+b+c;
} //right
int func3(int a,int b,int c);
int func3(int a, int b = 1,int c = 3){
return a+b+c;
} //right
函数的占位参数
没有形参变量,只有数据类型,意义不是很大
int func(int a,int){
return a+2;
}
func(10,10);
占位参数也可以有默认参数,就不用必须传递值
int func(int a,int = 11){
return a+2;
}
func(10);
函数重载
同一个作用域,函数名相同但是至少满足以下三点之一:
- 参数类型不同
- 参数个数不同
- 参数顺序不同
作用:复用性更高
,根据参数来判断选择哪一个函数进行调用
//同全局作用域
void func(){
cout<<"first"<<endl;
}
void func(int a){
cout<<"second"<<endl;
}
void func(double a){
cout<<"third"<<endl;
}
void func(int a,double b){
cout<<"fourth"<<endl;
}
void func(double a,int b){
cout<<"fifth"<<endl;
}
int func(){
cout<<"sixth"<<endl;
}//error 函数的返回值不能作为函数重载的条件
int main(){
func(); //first
func(1); //second
func(1.2); //third
func(1,1.2); //fourth
func(1.2,1); //fifth
}
关于引用重载:
//参数类型不同
void func(int &a){
cout<<"one"<<endl;
}
void func(const int &a){
cout<<"two"<<endl;
}
func(10); //two
int a = 23;
func(a); //one
关于默认参数:
函数重载的时候尽量避免默认参数
void func(int a,double b = 12){
cout<<"one"<<endl;
}
void func(int a){
cout<<"two"<<endl;
}
func(20); //编译器傻眼了error!!
上述两个函数语法上是对的,生成是没问题的,但是一旦调用func(20),两个函数都可以调用,所以编译器懵逼了,就会报错,因此在函数重载的时候尽量避免默认参数这个坑!