在C++中,在函数定义的时候,可以为形参指定一个默认值,也称作缺省值.如果在调用这个函数时没有传参,那么函数在执行的时候就采用该实参的缺省值,否则使用实参的值.
例如:
#include
using namespace std;
void Add(int x, int y = 10)
{
cout << x + y << endl;
}
int main()
{
Add(1);
return 0;
}
此处在调用时值传递了一个参数,这个参数会赋值给第一个形参,第二个形参没有赋值,就会使用默认的10进行运算.
假如我们为两个参数都指定值:
#include
using namespace std;
void Add(int x, int y = 10)
{
cout << x + y << endl;
}
int main()
{
Add(1,2);
return 0;
}
注意:当要给部分参数赋默认值时,要从右边到左边依次给参数赋默认值.如下:
void Add(int x, int y = 10,int z = 10)
{
cout << x + y + z << endl;
}
int main()
{
Add(1);
return 0;
}
void Add(int x, int y = 10,int z = 10)
{
cout << x + y + z << endl;
}
int main()
{
Add(10,20);
return 0;
}
注意:
- 在函数的定义和声明中不能同时包含缺省参数,不然会发生冲突,在一个完整的项目中,缺省参数最好是出现在函数的声明中.
- 缺省参数必须从右到左依次给,不能间隔着给.
- 缺省值只能是全局变量或者是常量,但是在很多情况下,缺省值都是常量为主.
- C语言不支持函数带有缺省值.
在人们的自然语言中,一句话往往在不同的语境中会有不同的含义,特定的语境会有特殊的含义,即这句话被重载了.
函数重载的概念:函数重载是函数的一种特殊状况,C++允许在同一个作用域中声明几个功能类似的同名函数.这些同名函数的形参列表(形参个数 或者 形参类型 或者 形参顺序 )不同.
形参类型不同:
#include
using namespace std;
void Add(double x, double y)
{
cout << x + y << endl;
}
void Add(int x, int y )
{
cout << x + y << endl;
}
int main()
{
Add(10,20);
Add(1.2, 3.4);
return 0;
}
形参个数不同:
#include
using namespace std;
void Add(int x, int y)
{
cout << x + y << endl;
}
void Add(int x, int y,int z)
{
cout << x + y + z << endl;
}
int main()
{
Add(10, 20,30);
Add(10,20);
return 0;
}
形参顺序不同:
#include
using namespace std;
void Add(char x, int y)
{
cout << x + y << endl;
}
void Add(int x, char y)
{
cout << x + y << endl;
}
int main()
{
Add('a', 20);
Add(10,'a');
return 0;
}
注意: 如果两个函数的形参列表相同,只是返回值不同是无法构成重载的.
请看下面这种函数重载与缺省参数写法:看是否会报错呢??
int Func(int x = 10)
{
return x;
}
void Func()
{
cout << "this is Func()" << endl;
}
int main()
{
Func();
return 0;
}
编译是无法通过的,因为Func()调用时,不知道到底是调用无参函数,函数调用有缺省值的函数.
为什么C++支持函数重载呢?
因为C++编译器修饰函数之后会变成
[_Z+函数名所占用字符个数+函数名+类型首字母]
,例如我在test.c文件下写了这样一段代码:#include
float Func(int x,float y) { return x - y; } int Add(int x,int y) { return x + y; } int main() { float x = Func(3,2.1); int y = Add(1,2); printf("lf",x); printf("%d",y); return 0; } 接着在linux环境下使用C和C++两种编译器,查看最后生成的
.o
文件
使用C语言编译方式:
- 那么最后通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。