重载函数
重载函数
为什么c++里面函数可以重载呢 ? 为什么c里面就不可以呢 ?
我们先来创建一个.cpp程序。
这里只需要.后面是cpp就可以了,前面是自己起的名字。
我们可以来简单的写一写重载函数。
这里就可以看出,重载函数的类型是不同的。
这里下面的报错说Add重定义,说明这两个函数没有构成重载,仔细观察一下这两个函数,它们的形参类型好像是相同的,形参的个数也是相同的啊。不同的一点就是返回值的类型是不相同的。这说明了函数重载和返回值有关系吗 ? 没关系。
这个时候我在第二个函数里面加了个形参,现在这两个函数的区别就是第一个函数有两个形参,第二个函数有三个参数,这个时候程序运行起来了,而且没有报错,说明这两个函数构成了函数重载。进一步说明了函数重载和它的形参个数也有关系。个数不同也是能构成函数重载的。
这个时候又来了两个函数,看一下这两个函数的区别,第一个函数两个形参,第二个函数也是两个形参,唯一的区别就是两个形参的类型不一样,而且第一个函数的int 类型的形参在第一个位置,而第二个函数的形参在第二个位置,这个时候程序也是能跑起来的,说明这两个函数也可以函数重载,说明形参的类型以及位置对函数重载也是有关系的。
以上就是重载函数的几种情况。
接下来就说一说为什么c++可以进行重载函数,而c不可以进行重载函数。
可以看到在c里面写重载函数就会直接报错。
上述第一个图是c的,下面的图是c++的,可以看一下箭头指向的地方,c和c++的是不一样的。c语言中就只有_Add,而c++里面有挺长一串东西(箭头指向的地方)。这里是因为Windows的一些配置,所以比较难理解,我们可以切换到Linux环境下面来看一下。
这是在Linux上面写的一段代码。我们接下来转一下汇编。
这个是c语言下转化成汇编的样子。
这个是c++下转成汇编的样子。
我们可以看出这两个东西不是一模一样的代码,为什么在gcc和g++下面跑起来怎么看着有点不太一样啊,我们可以这样理解,c++对函数的名字进行了一些修饰,让它变得有点与众不同了,就拿上面的例子来说,c就直接是函数名,没什么好说的。而c++是<_Z4funcid> 这些东西都是什么呢 ?
_Z可以理解为是一种前缀。
4是func函数名的长度。
id 是 int double 两个函数形参的类型(注意类型的位置也是很重要的哦)
对比上面的例子是不是就可以很好的理解为什么c++可以重载函数,c不可以重载函数了。
再来看一个例子
这是c的转成汇编的样子。
这是c++的转成汇编的样子。
强调一下上面的 <_z5func1Pid> 这里面的 Pid 分成 Pi 和 d
Pi 是 int* 类型的
d 是double类型的
这里我们就可以更近一步的理解重载函数。我们可以理解为c++对函数名字进行了一些修饰。而c就是单纯的函数名。