c++_重载函数_底层

发布于:2024-04-07 ⋅ 阅读:(68) ⋅ 点赞:(0)

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