一、函数中的参数有默认值
例如:定义一个函数:int fun(int a,int b=10)
在主函数中调用时,可以不写出b值
即fun(10);
注意事项:1、如果在主函数中重新赋值给b,那么b的值不再等于默认值,等于重新赋的值。
2、如果在函数的参数列表中赋默认值,那么从这个参数往后一直到最后一个形参都必须赋默认值
例如:定义一个函数:fun1(int a,int b,int c,int d)
如果给a赋默认值,那么b,c,d也要有,如果给b赋值,c,d也要有
3、如果函数声明有默认参数,那么实现中不能有默认参数,反之亦如此
函数占位参数
二、函数占位参数
void func(int a,int)//返回值类型 函数名(数据类型){}
相比于普通函数的参数的区别是,只定义了参数类型,没有定义参数名
但是在main函数中调用的时候,仍然要传入参数。
三、函数重载
作用:函数名可以相同,提高函数的复用性
满足条件:1、同一个作用域下:比如:全局
2、函数名称相同
3、函数的参数类型不同或者个数不同或者顺序不同
注:函数的返回值不作为函数重载的条件,也就是说,返回值不同,其他都相同,仍然不满足上述的三个重载条件,所以不能发生重载,无法重载以返回值区分的函数
void func()
{
cout << "func" << endl;
}
void func(int a)//参数类型不同,满足重载条件
{
cout << "func1" << endl;
}
在主函数中:
func(10);//这里如果写func()则调用的第一个函数,如果写func(10)则调用的第二个函数
四、函数重载的两个坑
1、引用
void func(int& a)和void func(const int& a)是满足重载条件的
void func(const int& a)//只读状态,只读不写
当主函数调用func(a);//这样是调用的第一个函数,不加const
当主函数调用func(10);//调用第二个函数,加const。因为10是放到常值区里面的,引用只能在堆区或者栈区,不合法
2、函数参数默认值
例如:void func(int a,int b=10)//当函数重载碰到默认参数,出现二义性,报错,因为如果函数参数有两个,比如void func(int a,int b=10),但是主函数实际调用的时候只需要输入一个参数,例如func(10)或func(a),这就相当于void func(int a)这个函数了,编译器无法区分调用的是哪个函数