为什么C++支持重载,C语言不支持
2018-03-30 15:43
513 查看
我们都知道C++语言支持重载,而C语言不支持
可是为什么C++中可以支持函数重载,而在C语言中不支持呢?
函数重载
首先来看,什么是函数重载:在同一作用域类,一组函数的函数名相同,参数列表不同(个数不同/类型不
同),返回值可同可不同。简单的说就是函数名相同,参数列表不同
其实是这样,C++在编译时会对函数名进行优化,对于参数不同的同名函数对应的优化后的函数为_Z
[fun][list]
例如上面那段代码在linux下编译成目标文件,再使用nm指令查看符号信息如下图:
【深入了解】了解更多关于C++函数名称修饰规则
扩展阅读
C&C++的起源历史
C++历史: C&C++的起源历史
语言的发展是一个逐步递进的过程,C++ 是直接从 C 语言发展过来的,而 C 语言是从 B 语言发展过来的,B 语言是 BCPL 的一个解释性后代,BCPL 是 Basic CPL。其中最有趣的是 CPL 中 C 的由来,由于当时这个语言是剑桥大学和伦敦大学合作开发的,在伦敦的人员加入之前,C 表示剑桥,伦敦人员加入之后,C 表示 Combined 组合。还有一种非正式的说法,C 表示 Christopher,因为 Christopher 是 CPL 背后的主要动力。
最初导致C++诞生的原因是在Bjarne博士等人试图去分析UNIX的内核的时候,这项工作开始于1979年4月,当时由于没有合适的工具能够有效的分析由于内核分布而造成的网络流量,以及怎样将内核模块化。同年10月,Bjarne博士完成了一个可以运行的预处理程序,称之为Cpre,它为C加上了类似Simula的类机制。在这个过程中,Bjarne博士开始思考是不是要开发一种新的语言,当时贝尔实验室对这个想法很感兴趣,就让Bjarne博士等人组成一个开发小组,专门进行研究。
当时不是叫做C++,而是C with class,这是把它当作一种C语言的有效扩充。由于当时C语言在编程界居于老大的地位,要想发展一种新的语言,最强大的竞争对手就是C语言,所以当时有两个问题最受关注:C++要在运行时间、代码紧凑性和数据紧凑性方面能够与C语言相媲美,但是还要尽量避免在语言应用领域的限制。在这种情况下,一个很自然的想法就是让C++从C语言继承过来,但是我们的Bjarne博士更具有先见之明,他为了避免受到C语言的局限性,参考了很多的语言,例如:从Simula继承了类的概念,从Algol68继承了运算符重载、引用以及在任何地方声明变量的能力,从BCPL获得了//注释,从Ada得到了模板、名字空间,从Ada、Clu和ML取来了异常。
缺省参数
命名空间 C++命名空间
命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个集团的声明放在同一个命名空间中。
named-namespace-definition:
unnamed-namespace-definition:
namespace-body:
可是为什么C++中可以支持函数重载,而在C语言中不支持呢?
函数重载
首先来看,什么是函数重载:在同一作用域类,一组函数的函数名相同,参数列表不同(个数不同/类型不
同),返回值可同可不同。简单的说就是函数名相同,参数列表不同
其实是这样,C++在编译时会对函数名进行优化,对于参数不同的同名函数对应的优化后的函数为_Z
[fun][list]
N:代表函数名长度 fun:函数名 list:所有参数的首字母
例如上面那段代码在linux下编译成目标文件,再使用nm指令查看符号信息如下图:
【深入了解】了解更多关于C++函数名称修饰规则
扩展阅读
C&C++的起源历史
C++历史: C&C++的起源历史
语言的发展是一个逐步递进的过程,C++ 是直接从 C 语言发展过来的,而 C 语言是从 B 语言发展过来的,B 语言是 BCPL 的一个解释性后代,BCPL 是 Basic CPL。其中最有趣的是 CPL 中 C 的由来,由于当时这个语言是剑桥大学和伦敦大学合作开发的,在伦敦的人员加入之前,C 表示剑桥,伦敦人员加入之后,C 表示 Combined 组合。还有一种非正式的说法,C 表示 Christopher,因为 Christopher 是 CPL 背后的主要动力。
最初导致C++诞生的原因是在Bjarne博士等人试图去分析UNIX的内核的时候,这项工作开始于1979年4月,当时由于没有合适的工具能够有效的分析由于内核分布而造成的网络流量,以及怎样将内核模块化。同年10月,Bjarne博士完成了一个可以运行的预处理程序,称之为Cpre,它为C加上了类似Simula的类机制。在这个过程中,Bjarne博士开始思考是不是要开发一种新的语言,当时贝尔实验室对这个想法很感兴趣,就让Bjarne博士等人组成一个开发小组,专门进行研究。
当时不是叫做C++,而是C with class,这是把它当作一种C语言的有效扩充。由于当时C语言在编程界居于老大的地位,要想发展一种新的语言,最强大的竞争对手就是C语言,所以当时有两个问题最受关注:C++要在运行时间、代码紧凑性和数据紧凑性方面能够与C语言相媲美,但是还要尽量避免在语言应用领域的限制。在这种情况下,一个很自然的想法就是让C++从C语言继承过来,但是我们的Bjarne博士更具有先见之明,他为了避免受到C语言的局限性,参考了很多的语言,例如:从Simula继承了类的概念,从Algol68继承了运算符重载、引用以及在任何地方声明变量的能力,从BCPL获得了//注释,从Ada得到了模板、名字空间,从Ada、Clu和ML取来了异常。
缺省参数
// 全缺省参数 int Add1 (int a = 0, int b = 0) { return a + b; } // 半缺省参数 int Add2 (int a, int b = 0) { return a + b; }
命名空间 C++命名空间
命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个集团的声明放在同一个命名空间中。
named-namespace-definition:
namespace identifier { namespace-body }
unnamed-namespace-definition:
namespace { namespace-body }
namespace-body:
declaration-seq
相关文章推荐
- 为什么c++支持重载而C语言不支持重载
- C语言为什么不支持重载,而C++支持
- 为什么c++支持重载而c不支持?
- C++为什么要同时支持指针和引用
- 为什么c++中重载流操作符要用友元函数
- Objective-C runtime之消息(二)--为什么iOS不支持重载
- C编程笔录(一)1.3: 为什么C不支持函数重载,而C++支持?
- c++(重载、覆盖、隐藏)&&什么情况下,类的析构函数应该声明为虚函数?为什么?
- C语言、C++:为什么要内存对齐?
- 说说C语言与C++的有些区别(一)----为什么C语言没有BOOL类型,而C++有;枚举类型的区别;左值
- C/C++数组为什么不支持整体赋值操作
- C++语言笔试题目 C++中为什么用模板类&& 类中如何使用const &&函数重载,我们靠什么来区分调用的那个函数?靠返回值判断可以不可以
- 【c++】模板为什么不支持分离编译
- 神奇的C语言七:为什么C++要抛弃printf?
- C++ 为什么模板不支持分离编译?
- C++学习笔记:为什么不要重载逻辑与和逻辑或&& || 操作符
- C++为什么不支持某些东西
- C# PDF Page操作——设置页面切换按钮 C# 添加、读取Word脚注尾注 C#为什么不能像C/C++一样的支持函数只读传参 web 给大家分享一个好玩的东西,也许你那块就用的到
- 有C++、Java、C#,为什么还要学C语言?
- 为什么C++没有内建支持多线程