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