C++ 函数高级
1. 函数的默认参数
在C++中,函数的形参列表中的形参是可以有默认值的。
- 语法:
返回值类型 函数名 (参数= 默认值){}
test1中形参没有默认值,调用时要传入参数。test2中形参a
test2中形参有默认值,调用时如果没有传入参数则使用默认值,如果传入参数则优先使用传入的参数
注意事项
- 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
例如,test3中形参b有默认值,这个位置之后都得有默认值,否则会报错 - 如果函数声明有默认值,函数实现的时候就不能有默认参数
函数声明和函数实实现只能一个有默认值
2. 函数占位参数
C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置
语法: 返回值类型 函数名 (数据类型){}
占位参数有默认值时,调用函数可传可不传参数
3. 函数重载
作用: 函数名可以相同,提高复用性
3.1 函数重载满足条件
- 同一个作用域下
- 函数名称相同
- 函数参数类型不同 或者 个数不同 或者 顺序不同
1)函数类型相同
提示错误:已有主体,编译器不知道调用哪一个函数。
2)参数个数不同
test6()和test6(int a),参数个数不同,根据传入不同个数的参数调用不同的函数。
3)参数类型不同
test6(int a)和test6(float a),参数类型不同,根据传入不同类型的参数调用不同的函数。
4)参数顺序不同
test6(int a, float b)和test6(float b, int a),参数顺序不同,根据传入不同顺序的参数调用不同的函数。
注意: 函数的返回值不可以作为函数重载的条件
此时主函数中既可以调用上面是test6,也可以调用下面的test6,只是下面的test6的返回值不接收,但是编译器不知道调用哪个函数,所以系统会提示“函数的返回值不可以作为函数重载的条件”
3.2 函数重载的注意事项
1)引用作为重载条件
int a = 45;
test7(a);`
这里调用的是test7(int& a)函数,因为a是变量,可读可写;
test7(45);
这里调用的是test7(const int& a)函数,test7(const int& a)加入了const修饰a,a只是可读。
直接传入45,对test7(int& a)而言,这种传入是不合法的,因为引用必须使用的是一块合法的空间;
但是对于test7(const int& a)函数,加入了const修饰,此时引用使用的是一块临时的合法空间,在编译期内部会自动优化:
int temp = 10;
const int& ref = temp;
对于引用做重载条件时,可以加const(直接传数值),也可以不加const(传入变量)。
2)函数重载碰到函数默认参数
test8(45)这句代码:既可以调用test8(int a, int b = 45)函数,把45传给a,b使用默认值;也可以调用调用test8(int a)函数,把45传给a。所以下面才会报错“test8调用不明确”
所以,函数重载碰到默认参数出现二义性,应该尽量避免。/要么不要使用默认参数,要么把所有参数的值都传入。
总结
- 引用可以作为重载条件,需要区分加const和不加的函数调用。
- 引用加const时,可以直接传入值;没加时,需要传入变量。
- 函数重载应该尽量避免默认参数会导致二义性的出现,要么不使用默认参数,要么把所有参数都传入实参。