目录
缺省参数
1.定义
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参。以下代码为实例:
void Func(int a = 0)
{
cout<<a<<endl;
}
int main()
{
Func(); // 没有传参时,使用参数的默认值
//输出 0
Func(10); // 传参时,使用指定的实参
//输出 10
return 0;
}
2.分类
全缺省参数
全缺省参数:函数中所有参数都有一个缺省值,具体如下:
void Func(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
半缺省参数
半缺省参数:函数中部分参数有缺省值,具体如下:
(图中 a 需要在主程序中传值。)
void Func(int a, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
注意:
- 半缺省参数必须从右往左依次来给出,不能间隔着给
- 缺省参数不能在函数声明和定义中同时出现(如果同时出现且给定的缺省值不同,编译器无法确定使用哪个缺省值)如果想要声明和定义分离,只能在声明中出现。
- 缺省值必须是常量或者全局变量
函数重载
定义
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。以下是三种函数重载的情况:
1.参数类型不同
// 1、参数类型不同
int Add(int left, int right)
{
cout << "int Add" << endl;
return left + right;
}
//输出int Add
double Add(double left, double right)
{
cout << "double Add" << endl;
return left + right;
}
//输出double Add
2.参数个数不同
// 2、参数个数不同
void f()
{
cout << "f()" << endl;
}
//输出f()
void f(int a)
{
cout << "f(a)" << endl;
}
//输出uf(a)
3.参数类型顺序不同
// 3、参数类型顺序不同
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
//输出f(int a,char b)
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}
//输出f(char b, int a)
原理--名字修饰
为什么C++支持函数重载而C语言不支持呢?
这是由于两者的编译器不同导致的,由于Windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单易懂,下面我们使 用了g++演示了这个修饰后的名字。通过下面我们可以看出gcc的函数修饰后名字不变,g++的函数修饰后变成【_Z+函数长度 +函数名+类型首字母】。
采用C语言编译器编译后结果
结论:函数名字的修饰没有发生改变。
采用C++编译器编译后结果
结论:函数名字的修饰发生改变。
通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修 饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
注意:如果参数个数 或 类型 或 类型顺序相同,只有返回值不同不构成函数重载。
大家对函数命名有兴趣可以阅读这篇文章:C/C++ 函数调用约定,希望对你有用。