1.函数的默认参数
1.用法分析
可以给形参设定默认值,当实参不够时顶上,当实参足够时会覆盖默认值。
#include<iostream>
using namespace std;
int fun(int a = 10, int b = 20, int c = 30)
{
return a + b + c;
}
int main()
{
cout << "结果:" << fun(1,1,1) << endl;
cout << "结果:" << fun() << endl;
cout << "结果:" << fun(1, 1) << endl;
}
执行结果:
2.注意事项!!
1.如果某个位置已经有了默认参数,那么从这个位置往后都必须是默认参数。
错误示例:
#include<iostream>
using namespace std;
int fun(int a, int b = 2, int c)//此处默认实参后应都是默认实参,所以错误
{
return a + b + c;
}
int main()
{
cout << fun(10) << endl;//从而导致下面参数不全,且无法正确补全
return 0;
}
2.函数声明和函数实现只能一方有默认参数
下面是一对配套的声明和实现
函数声明:
int fun(int a=10,int b=20,int c=30);
函数实现:
int fun(int a=10,int b=20,int c=30)
{
return a+b+c;
}
会报错显示:重定义的默认参数。
如果声明和实现的面默认参数不一致,程序会存在二义性,也是错误的。
2.函数占位参数
意义:占下来一个形参的位置,填写实参时必须补全相应类型的参数。
#include<iostream>
using namespace std;
int fun(int a = 1, int)
{
return a;
}
int main()
{
cout << fun(10, 10) << endl;
return 0;
}
现阶段意义不大,以后会用到。
3.函数重载
1.定义
可以让函数名相同,提高复用性。
2.函数重载满足条件
(不过子函数的类型,也叫做返回值的类型不能作为函数重载的条件。因为程序会产生二义性。)
1.同一个作用域下。
2.函数名称相同。
3.函数参数类型不同,或者顺序不同,或者类型不同。
#include<iostream>
using namespace std;
void fun()
{
cout << "1" << endl;
}
void fun(int a)
{
cout << "2" << endl;
}
void fun(double a)
{
cout << "3" << endl;
}
int main()
{
fun();
fun(10);
fun(3.14);
return 0;
}
运行结果:
需要注意的是:这三个子函数都在全局作用域下。
3.注意事项
1.函数重载碰到引用时
#include<iostream>
using namespace std;
void fun(int &a)
{
cout << "1" << endl;
}
void fun(const int &a)
{
cout << "2" << endl;
}
int main()
{
int b = 10;
fun(b);
fun(10);
return 0;
}
解释:因为实参b是一个变量,而形参&a需要的是一个变量;(int &a=10;是不合法的,见 引用——C++)
10是一个常量,只读不可改,const int &a也只读不可改。
2.函数重载碰到默认参数时
这种情况肯定会报错,出现了二义性,只能尽量避免。
#include<iostream>
using namespace std;
void fun(int a,int b=10)
{
cout << "1" << endl;
}
void fun(const int a)
{
cout << "2" << endl;
}
int main()
{
int a = 10;
fun(a);
fun(10);
return 0;
}
报错信息如下: