目录:
概念
函数重载是指在同一个作用域内可以有多个同名函数
要求
函数名相同,参数要不同(以下三种情况满足一种即可),作用域要相同
- 类型顺序不同(其实本质也是类型不同)
- 参数个数不同
- 参数类型不同
举例子:
④之所以是错的,因为参数的类型顺序仍然是int 和 char,仅仅是参数名改变了并不算函数重载
⑤之所以是错的,因为他们不在同一个作用域当中
小坑:以下的两个函数是否构成函数重载?
int Add(int a, int c)
{
return a + c;
}
int Add(int a, int c, int d = 3)
{
return a + c + d;
}
答:只要满足函数名相同,参数不同,作用域相同,就可以满足函数重载
只不过以上的两个函数在调用的时候会存在调用歧义的报错
C++能支持函数重载的原因
在C语言中,不支持函数重载,而在C++中却支持
抛出问题:函数具体是根据什么调用的?
结论:函数是根据函数名来找指定的函数地址,然后根据地址去调用函数的
在C语言中
void func(int a, char c)和 void func ( char c, int a)
函数名都是func,参与函数名修饰规则的就只有函数名
在C++中
修改了函数名的修饰规则,在名字中引入了参数的类型
不同平台的不同编译器的修饰规则都不同
在Linux中,
G++中:
f ( 1 , char c) 的函数名为:_Z1fic
f ( char c , 1 ) 的函数名为:_Z1fci
解析:_Z是函数名的前缀(不必在乎),1是指名字的字节数(名字的长度),f是函数名,i是int,c是char
为什么连名字的长度都要引入函数名修饰规则?
因为一个项目中,可能会出现很多个函数,如果我要找名字长度为1的函数,那我只需要到_Z1开头的函数中找就可以了,可以找的更快
在windows中
在VS编译器中
猜测:YA前面的是前缀 , X代表返回值,H是int,D是char,没必要深入研究,只需要知道不同的编译器修饰规则不同即可
同名函数真正区分的地方其实是最后的类型缩写
C++中,因为修改了函数名的修饰规则,所以就能够区分同名而不同参数的函数,于是就支持了函数重载
注意:返回值不同不能算是函数重载(毕竟函数名修饰规则并没有把函数名也算进去)
例:
若支持,则以下情况将不知道该调用哪个,将无法解决
int Add (int a , int b)
{
return a + b;
}
void Add(int a, int b)
{
cout << a << b << endl;(打印a和b)
}