c语言不允许同名函数
cpp可以,但是要求构成
什么是函数重载
是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题
重载函数的实现
要求
1.函数名相同,参数不同-- ---类型不同,顺序不同(看得是类型,不是形参的名字),个数不同
2.返回值不同不能构成重载
3.不同命名空间不构成重载
函数名相同,参数不同
void f(int a,char b)
{
cout << "void f(int a,char b)" << endl;
}
//参数顺序不同
void f(char a, int b)
{
cout << "void f(int a,char b)" << endl;
}
//参数类型不同
void f(char a, char b)
{
cout << "void f(int a,char b)" << endl;
}
//参数个数不同
void f(char a, char b, char c)
{
cout << "void f(int a,char b)" << endl;
}
不同命名空间不构成重载
//不构成函数重载
namespace wang1
{
void func(int x){}
}
namespace wang2
{
void func(double x) {}
}
函数重载和缺省放一起
函数重载与缺省无关
但是要注意调用不要存在歧义
//构成函数重载
void func(int a)
{
cout << "void func(int a)" << endl;
}
void func(int a,int b = 1)
{
cout << "void func(int a,int b = 1)" << endl;
}
int main()
{
//调用存在歧义
func(1);
}
重载函数的调用_自动识别
重载函数
//重载函数
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
调用,会自动识别类型
//调用
int main()
{
cout << Add(1, 2) << endl;
cout << Add(1.2, 2.6) << endl;
return 0;
}
C++支持函数重载的原理
--名字修饰(name Mangling)
底层:函数名修饰规则
为什么C++支持函数重载,而C语言不支持函数重载呢
程序运行的四个阶段
在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接、
在过程中会生成一个符号表:函数名和地址的映射/变量和地址的映射
c语言用函数名充当符号表中对应的名字,所以不能重名,一旦重名,符号表就乱了
c++的解:数名修饰规则
只有声明没有定义会找不到地址(地址在符号表里面找)
程序运行的过程
test.cpp->test.i->test.s->test.o->a.out/xx.exe
预处理阶段
头文件展开/宏替换/去掉注释/条件编译
条件编译解决问题:跨平台
例:#ifdef__WIN32
预处理以后文件会从test.cpp被处理成test.i
编译
编译:检查语法,生成汇编代码(指令级代码)
call语句的本质是跳转
编译以后从文件test.i被处理成test.s
汇编
汇编:将汇编代码生成二进制的机器码
汇编以后从文件test.s被处理成test.o
链接
链接:合并连接,生成可执行程序
链接以后生成可执行程序
a.out/xx.exe