函数重载概念
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。
构成函数重载的条件
- 同名函数的形参列表(参数个数或类型或顺序必须不同)。
- 如果函数的名称和参数完全相同,仅仅是返回值类型不同,是无法进行函数重载的。
- 重载的函数应该在相同的作用域下。
int ADD(int x, int y)
{
return x + y;
}
int ADD(double x, double y)
{
return x + y;
}
int ADD(int x, int y)
{
return x + y;
}
int ADD(int y, int x)
{
return x + y;
}
int f()
{
cout << "hello" << endl;
}
int f(int a)
{
cout << "hello" << a << endl;
为什么c语言不支持函数重载c++支持?
编译器编译过程
- 预处理:头文件展开,宏替换,条件编译,去掉注释。
- 编译:检查语法,生成汇编代码。
- 汇编:汇编代码转化为二进制代码。
- 链接:如果在当前文件有函数的定义,那么编译时就填上地址了,如果在当前文件只有函数的声明,那么定义就在其他xxx.cpp中,编译时没有地址,只能链接的时候去其他xxx.0符号表中根据函
数修饰名字去找,这是链接的重要工作。
c语言下
**fun.h**
void fun();
void fun(int a);
**fun.c**
void fun()
{
cout << 10 << endl;
}
void fun(int a)
{
cout << 10 << a << endl;
}
**text.c**
**fun.h**
int main
{
fun();
fun(1);
return 0 ;
}
在汇编的时候,是没有函数的地址的,要在链接时才补上。
- c语言不支持函数重载是因为重载函数的函数名字相同,在func.o符号表中存在歧义和冲突,链接的时候也存在歧义和冲突,因为在c语言中是直接使用函数名字去表示和查找的。
而在c++中,存在函数命名规则,不是直接用函数名字来标识和查找函数。
c++函数命名规则在linux下
_Z+函数命名长度+函数名字+参数首字母 刚fun()和fun(1)函数在linux下
- 有了函数命名规则只要参数不同,func.o符号表里面重载函数就不存在二义性和冲突了,链接的时候,text.o的main函数去调用2个重载函数查找地址是也是明确的。
|