去哪里找c语言超限大佬怎么还不滚去终极区?

C++的出现就是为了给C语言填坑的,C++大佬们把C语言做的不够好的地方和认为不合理的地方都进行了改进或增加了一些新的东西。在C语言中,函数是不允许重名的。开发C++的大佬呢就觉得很不合理,例如一个交换函数swap,要交换不同类型的值,swap就只能叫做swap1或者swap2。为了不这么麻烦,大佬就在C++里新增了叫函数重载的概念。

重载最简单的理解就是函数可以同名使用,编译器根据传参类型,判断应该调用哪个函数。就用swap举例,当传参时是两个int类型的实参,编译器就会去找有没有两个形参为int类型的swap函数,同理其他类型也是一样。

◆函数形参部分至少有一个类型不相同的参数才能构成重载
◆函数形参个数和顺序不能相同(不是参数名,而是参数类型顺序不能相同
◆函数重载与函数名和返回类型无关

那么C++是如何支持重载的?为什么C语言不支持重载?

如果了解编译,会知道编译其实就是将代码翻译成机器指令的一个过程。这个过程大概分为4个过程:
1.预处理:头文件展开、宏替换、去掉注释、条件编译
2.编译:检查语法、转换成汇编代码
3.汇编:将汇编代码转换为机器指令
4.链接:链接库、找调用函数定义的地址,链接合并到一起

编译器在进行编译和汇编时会生成一个东西叫符号表,符号表记录了函数的定义和函数地址的映射,也就是会去记录函数的函数名和函数的地址。当进行到链接时编译器会通过符号表去找函数名来链接函数的对应地址
这也是为什么C语言不支持重载而C++可以重载的重要原因,为了更好演示,我将使用Linux来进行观察C语言和C++对相同代码的函数,在汇编指令下的命名处理:
首先我已经准备好了两份.c和.cpp的文件,因为C++是兼用c语言的,所以两份代码是完全相同的,但是因为C语言重载报错,先将重载屏蔽掉。我们主要是观察两份代码的汇编指令对函数名的处理。

先将C语言文件编译成汇编指令:
可以看到,c语言调用func函数使用的函数名还是原来的名称。
为了不冲突,先将C语言的汇编指令文件删除,重新对cpp生成一份汇编指令文件。
观察Cpp的汇编指令,发现func不叫func了它改名字了,当然我也不知道g++的命名规则,func被改成了_Z4funcid这个名字,不管前面的Z4是什么,起码我知道id是什么,i就代表了int,d代表的是double,也就是我们func函数的两个参数类型的首字母缩写。
ok,现在我们将重载放出来,单独对cpp进行编译。观察两个重载的命名规则:

为什么c语言不支持函数重载,就是因为c语言在将代码转换成汇编代码时,用的是原来的名字,而两个同名的函数却分配了不同的地址。当函数调用时编译器会通过找函数名链接函数的对应地址,因为有两份同名的函数,C语言的编译器分不清到底是要调用哪一个函数,也就分不清需要调用哪一个地址。
而C++是如何解决这个问题的?C语言因为使用了原来的函数名作为符号表链接的名称,导致没有办法重载。C++就干脆直接不用原来的名称了,重新对汇编的函数进行特殊的处理,这样在找符号名称时就不会产生冲突。

本内容为PUDN经合法授权发布,文章内容为作者独立观点,不代表PUDN立场,未经允许不得转载。

  • google c++ 语法,很实用。 对c++代码规范很有好处。

  • C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换...

  • 面向对象另外一个核心概念是多态性。所谓多态,是指一个名字(或符号)具有多种含义。这对仿真客观世界以及提升...举个例子来说,考虑复数的加法,很明显,c1+c2这样的语法比ComplexAdd(c1,c2)这样的语法要清晰易解。

  • C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换...

  • C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换...

  • 在C语言的基础上,学习C++编程,此60道实例详解的讲解了C++编程基本语法知识,通过这些实例把握C++编程的基本语法

  • 在学习c++语法时做的笔记

  • C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、  析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型...

  • 吕鑫老师VS2015 C++语法与数据结构 1-30天教程源码及课件 。

  • 摘要:VC/C++源码,其它分类,Appwizard C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、  析构函数先后调用顺序,如何在派生类构造函数中向基类的...

  • c++的众多语法进行归类整理,对其中在实际项目开发中常用语法进行了特别说明,对于c++初学者特别有帮助

  • 本书以C++语法和MFC类库编程的重点、难点内容为主线,从实践应用的角度,结合经典的实例阐述C++类的特性,深入剖析VC++,特别是MFC编程的体系结构,使有初级基础的读者能够快速掌握VC++的MFC程序设计思想和C++的语言...

  •  C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、  析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,...

  • c++ 编程思想》本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省...

  • 本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

  • 本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

  • 本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

  • 本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

  • 本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

  • 本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...

我要回帖

更多关于 超限大佬怎么还不滚去终极区 的文章

 

随机推荐