您的位置:首页 > 编程语言 > C语言/C++

为什么C++有函数重载

2015-06-15 10:02 447 查看
为什么C++支持函数重载?

1、首先,我们需要了解的是,在c中,要求在同一个作用域中,函数名唯一。就是不允许函数同名。

而在C++中,要求同一个作用域中函数签名唯一。函数签名是函数名+参数列表。就是说允许函数名相同但参数列表不同的函数存在。可见,函数重载跟返回类型没什么关系。

2、那么为什么C++允许函数签名唯一呢?

代码段在被编译器编译的时候,会根据函数名生成函数的调用地址。

C编译器编译之后,函数名不变。

而C++编译器编译之后,函数名就会发生命名置换。比如说代码中的函数是

int function(int a,int b,double c)
	{
		cout<<a<<b<<c<<endl;
	}


gcc编译,命名置换后,会变成_Z8functioniid。

其中_Z是gcc编译器的保留字,不同的编译器,生成的保留字也会不一样,8是函数名的字符数量,iid则是参数列表的缩写。

经过这样一个操作时候,即使是函数名相同,但只要参数列表不同,那么编译之后生成的函数名实际上是不同的。

3、需要注意的是,函数名会发生命名置换,同样,函数调用时也会发生置换。比如说:

int main()
	{
		function(2,5,2.36);
	}



这时,如果在C++中发生调用,不会出现问题。可是,如果是在C中调用,那么C的编译器是找不到经过C++编译器命名置换的函数地址的。因为C编译器没有命名置换,他调用的还是function这个函数名。于是出现了extern "C"这个关键字是告诉C++编译器不用命名替换,用C编译器的方式去编译。

extern "C"
{
int function(int a,int b,double c) { cout<<a<<b<<c<<endl; } int main() { function(2,5,2.36); }};

这样就不会出现问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: