目录
1 函数提高
1.1 函数默认参数
在c++中,函数的形参列表中的形参可以有默认值
语法:
返回值类型 函数名 ( 参数/参数=默认值);
例:
对于函数Add1
int Add1(int x, int y)
{
return x + y;
}
对参数加上默认值
int Add2(int x, int y = 5)// 使y默认为5
{
return x + y;
}
注意:
-
如果我们自己传入数据,则用我们自己的数据,否则用默认值
Add2(a);// 用默认值
Add2(a.b);// 用b的值
-
如果某个位置已经有了默认值,则从此位置开始从左到右所有参数都必须有
-
函数的声明和实现只能有一个存在默认参数
声明有默认参数
int Add3(int x = 5, int y = 5); // 函数声明
int Add3(int x,int y)// 函数实现/定义
{
return x + y;
}
实现/定义有默认参数
int Add4(int x, int y); // 函数声明
int Add4(int x = 5, int y = 5)// 函数实现/定义
{
return x + y;
}
1.2 函数占位参数
在C++中,函数的形参列表可以有占位参数,用来做占位,调用函数时必须填补该位置
语法:
返回值类型 函数名 (函数类型)
如 int fun(int);
1.2.1 示例1
int Add(int x, int y,int )
{
return x + y;
}
形参列表里x与y是函数实现的主体,剩下一个是占位参数
在主函数中
int main()
{
Add(10, 10, 10); // 形参列表最后有个int类型,必须补上个int
return 0;
}
1.2.2 示例2
不过,占位参数也是个参数,也可以有默认参数
int Add(int x, int y, int = 10) // 最后的int=10即默认参数
{
return x + y;
}
此时在主函数里调用函数时,就不用填补了,非要填补也可以,虽然没啥用
1.3 函数重载
概述:在C++中,函数名相同,提高复用性
条件:全部满足
-
同一个作用域
-
函数名称相同
-
函数参数 个数不同/类型不同/顺序不同,满足其一
1.3.1 参数个数不同
void fun() // 0个
{
cout << "fun 的调用" << endl;
}
void fun(int a) // 1个
{
cout << "fun(int a)的调用" << endl;
}
1.3.2 参数类型不同
void fun(int a) // 整型
{
cout << "fun(int a)的调用" << endl;
}
void fun(float b) // 浮点型
{
cout << "fun(float b)的调用" << endl;
}
1.3.3 参数顺序不同
void fun(int a, float b) // int 在前,float在后
{
cout << "fun(int a, float b)的调用" << endl;
}
void fun(float b, int a) // float在前,int在后
{
cout << "fun(float b, int a)的调用" << endl;
}
1.4 注意事项
1.4.1 函数的返回值不可以作为函数重载的条件
void fun1()
{
cout << "fun1 的调用" << endl;
}
int fun1() // error
{
cout << "fun1 的调用" << endl;
}
1.4.2 引用作为函数参数
1.4.2.1 示例1
void func(int &a) // 相当于int &a = a;
{
cout << "func(int &a) 的调用" << endl;
}
void func(const int &a)
{
cout << "func(const int &a) 的调用" << endl;
}
一种参数是int&a
,一种是const int&a
int main()
{
int a = 5;
func(a);
return 0;
}
创建变量a后调用
结果是第一种
1.4.2.2 示例2
而如果在主函数中不创建变量,直接传递整型数字过去
func(5);// 相当于const int &a = 10;
则是第二种
1.4.3 函数重载遇到默认参数
void func1(int a, int b = 10) // 默认值b=10
{
cout << "func1(int a, int b = 10)的调用" << endl;
}
void func1(int a)
{
cout << "func1(int a) 的调用" << endl;
}
无论哪个函数,均只需接受一个参数即可,因此无法调用,编译不通过
而如果再加1个参数,使参数达到2个,则一定可以通过,而且是调用第一个func
func1(5,20);