## 今天学了什么
今天学习C++函数默认参数、占位参数及函数重载的语法和规则。
## 函数的默认参数
函数形参列表的形参可以有默认值,语法 返回类型 函数名(参数=默认值){}。
#include<iostream> using namespace std; //函数的默认参数 int func(int a, int b = 10,int c=20) { return a + b+c; } //默认参数声明实现只能有一个 如果在实现里,实现必须在main函数前面 int func02(int a, int b); int func02(int a = 10, int b = 1) { return a + b; } int main() { cout << "func 的运行结果:" << func(1,1,1)<<endl; cout << "func02 的运行结果:" << func02() << endl; return 0; }通过对上述代码进行调试,发现:
- - 设置默认参数后,传入新值,会替换默认值,不传入新值则会使用默认值;
- - 默认参数后面的参数也必须有默认值,前面没有。即默认参数必须从右往左连续定义,否则会报错;
- - 函数声明有默认参数,则函数实现就不能有默认参数,反正也是。并且如果默认参数在实现,函数的实现必须在main函数前,否则默认参数设置无效。
## 函数的占位参数
语法:返回值类型 函数名(数据类型){}
- 参数只有类型,不写变量名,作用是占位;
- 调用函数时必须填补该位置;
- 占位参数可以设置默认值。
int func03(int a, int) //占位参数可以有默认值 例:int func03(int a, int=10)
{
a = a + 1;
return a;
}
## 函数重载
** 作用:同一个作用域下,函数名可以相同,依靠参数区分函数,提高复用性。**
** 函数重载条件:**
- 同一个作用域;
- 同一个函数名;
- 函数参数的类型不同/个数不同/顺序不同。
**重点:函数的返回值不同不能作为重载条件,原因:调用函数时,编译器只看传入参数,可以不接收返回值,编译器无法仅靠返回值区分调用函数。**
#include<iostream> using namespace std; int func(int a, int b ,int c) { return a + b + c; } //函数重载 类型不同 int func(float a) { return a + 100; } //函数重载 个数不同 int func(int a, int b) { return a + 2 + b; } //函数重载 顺序不同 int func(int a, double b) { return a * b; } int func(double a, int b) { return a / b; } int main() { cout << "func 的运行结果:" << func(1,1,1)<<endl; cout << "func 重载函数的运行结果:" << func((float)1.0) << endl; return 0; }## 引用作为重载条件
当函数参数为引用时,也有可重载的情况,int &a 和 const int &a 可以构成重载:
- 传入变量(左值):调用void func04(int &a);
- 传入常量、字面量:调用void func04(const int &a);
//引用作为重载条件 void func04(int &a) { cout << "func(int &a)调用" << endl; } void func04(const int &a) { cout << "func(const int &a)调用" << endl; } int main() { int i=1; func04(i);//输出结果:func(int &a)调用 func04(2);//输出结果:func(const int &a)调用 return 0; }## 发现:函数重载遇到默认参数(坑:二义性)
例:①void func(int a,int b=10){}
②void func (int a) {}
func(1);
虽然满足函数重载的条件-参数个数不同,但运行依旧错误。原因:编译器在调用时发现①②两个 函数都能调用,存在二义性,导致运行出错。