函数提高
函数默认参数
分析
在 C++中,函数的形参列表中的形参是可以有默认值的。
语法: 返回值类型 函数名 (参数= 默认值){}
示例:
int func(int a, int b = 10, int c = 10) { return a + b + c;}
int func2(int a = 10, int b = 10);int func2(int a, int b) { return a + b;}
int main() {
cout << "ret = " << func(20, 20) << endl; cout << "ret = " << func(100) << endl;
system("pause");
return 0;}
复制代码
PS:如果向函数传了数据就用所传的数据,如果没有传则用函数形参列表中的默认值。
注意事项
如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
❌错误写法:b 之后必须都有默认参数:c 和 d 也必须有默认参数
✔正确写法
如果函数声明有默认值,函数实现的时候就不能有默认参数
✔正确写法
函数占位参数
C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置
语法: 返回值类型 函数名 (数据类型){}
在现阶段函数的占位参数存在意义不大,但是后面的课程中会用到该技术
示例:
//函数占位参数 ,占位参数也可以有默认参数void func(int a, int) { cout << "this is func" << endl;}
int main() {
func(10,10); //占位参数必须填补
system("pause");
return 0;}
复制代码
函数重载
函数重载概述
**作用:**函数名可以相同,提高复用性
函数重载满足条件:
同一个作用域下
函数名称相同
函数参数类型不同 或者 个数不同 或者 顺序不同
注意: 函数的返回值不可以作为函数重载的条件
示例:
//函数重载需要函数都在同一个作用域下void func(){ cout << "func 的调用!" << endl;}void func(int a){ cout << "func (int a) 的调用!" << endl;}void func(double a){ cout << "func (double a)的调用!" << endl;}void func(int a ,double b){ cout << "func (int a ,double b) 的调用!" << endl;}void func(double a ,int b){ cout << "func (double a ,int b)的调用!" << endl;}
//函数返回值不可以作为函数重载条件//int func(double a, int b)//{// cout << "func (double a ,int b)的调用!" << endl;//}
int main() {
func(); func(10); func(3.14); func(10,3.14); func(3.14 , 10); system("pause");
return 0;}
复制代码
案例刨析
参数个数不同,图一为 0 个图二为 1 个
参数类型不同
参数顺序不同
函数重载注意事项
示例:
//函数重载注意事项//1、引用作为重载条件
void func(int &a){ cout << "func (int &a) 调用 " << endl;}
void func(const int &a){ cout << "func (const int &a) 调用 " << endl;}
//2、函数重载碰到函数默认参数
void func2(int a, int b = 10){ cout << "func2(int a, int b = 10) 调用" << endl;}
void func2(int a){ cout << "func2(int a) 调用" << endl;}
int main() { int a = 10; func(a); //调用无const func(10);//调用有const
//func2(10); //碰到默认参数产生歧义,需要避免
system("pause");
return 0;}
复制代码
案例刨析
引用作函数重载条件:函数参数类型不同
图一二这种情况表面属于重载,但实际上会报错!所以写函数重载时尽量避免使用默认参数!图三就可以正常运行。
注意:函数的返回值不可以作为函数重载的条件,条件见上面三条
评论