为什么C++有函数重载
2015-06-15 10:02
447 查看
为什么C++支持函数重载?
1、首先,我们需要了解的是,在c中,要求在同一个作用域中,函数名唯一。就是不允许函数同名。
而在C++中,要求同一个作用域中函数签名唯一。函数签名是函数名+参数列表。就是说允许函数名相同但参数列表不同的函数存在。可见,函数重载跟返回类型没什么关系。
2、那么为什么C++允许函数签名唯一呢?
代码段在被编译器编译的时候,会根据函数名生成函数的调用地址。
C编译器编译之后,函数名不变。
而C++编译器编译之后,函数名就会发生命名置换。比如说代码中的函数是
gcc编译,命名置换后,会变成_Z8functioniid。
其中_Z是gcc编译器的保留字,不同的编译器,生成的保留字也会不一样,8是函数名的字符数量,iid则是参数列表的缩写。
经过这样一个操作时候,即使是函数名相同,但只要参数列表不同,那么编译之后生成的函数名实际上是不同的。
3、需要注意的是,函数名会发生命名置换,同样,函数调用时也会发生置换。比如说:
这时,如果在C++中发生调用,不会出现问题。可是,如果是在C中调用,那么C的编译器是找不到经过C++编译器命名置换的函数地址的。因为C编译器没有命名置换,他调用的还是function这个函数名。于是出现了extern "C"这个关键字是告诉C++编译器不用命名替换,用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); }};
这样就不会出现问题了。
相关文章推荐
- C++实现显示MP3文件信息的方法
- c++学习整理
- 快速排序,c++ 模板技术表述,完全兼容标准库!!!
- tinyxml非常好的实例 --c++解析XML
- 大话设计模式C++版——工厂模式在COM中的典型应用
- 大话设计模式C++版——工厂模式在COM中的典型应用
- c++ string 和 stl算法
- Convert a String In C++ To Upper or Lower Case
- 插入排序算法,c++ 模板技术表述,完全兼容标准库容器!!!
- [c++]字符串类各种操作的实现以及遇到的bug
- c++ 封装库 给c# 调用
- 浅谈C语言C++中可变参数问题!!!
- C++ Circle类
- C++ 64位自定义随机数生成器的使用 <random> 参照C++11
- 经典C语言程序编码-利润计算
- 【C语言】《C程序设计语言》通读摘录
- boost asio学习笔记 [1] - 同步通讯
- 【C语言】程序内存四区
- Tower of Hanoi by C++
- Effective C++ 条款01解读: 视C++为一个语言联邦