2-4:C++快速入门之函数重载

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2-4:C++快速入门之函数重载相关的知识,希望对你有一定的参考价值。

C++函数重载简单点说就是函数重名问题。还记得我们在学习C语言时必然会做的一个练习——写一个计算器,其中,加减乘除需要使用到不同的函数(当然可以使用回调函数解决),函数名不能相同,但是在C++中就不一样了。

(1)函数重载的概念

C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数形参列表必须不同(个数不同或类型不同或顺序不同),它常用于处理功能类似,但数据类型不同的问题

int Add(int left,int right)
{
	return left+right;
}
double Add(doube left,double right)
{
	return left+right;
}

(2)名字修饰

为什么C++支持函数重载,C语言则不支持?

A:C/C++编译运行过程

C/C++程序的生成需要经历预处理,编译,汇编,链接这四个步骤,本人在Linux文章中,详细用Linux展示了这一具体过程,如需了解请移步

Linux基础开发工具

在这个四个步骤中,链接操作显得额外重要,因为实际项目是由多个头文件和源文件组成的,如果test.cpp中调用了sum.cpp中的add函数,在链接前,test.o中是没有add函数的地址的,因为它是在sum.cpp中定义的,其地址在sum.o中。所以在链接时,链接器看到test.o调用了add函数,但是里面没有它的地址,而在声明中已经告诉了编译器是有这样一个add函数的,所以它就会到sum.o的符号表中找到add函数的地址,然后将其连接在一起

B:C/C++找寻函数时的区别

接上文,它要去链接就必须去找这个函数。
使用下面的文件,分别使用gccg++进行编译,再用objdump -S进行反汇编,观察
在这里插入图片描述
1.gcc编译C语言

在这里插入图片描述
可以发现:Linux下采用gcc编译后,函数名字仍旧是之前的那个,未进行任何修饰
在这里插入图片描述

2.gcc编译C++
在这里插入图片描述
可以发现:Linux下采用g++编译后,函数名字的修饰发生改变,编译器按函数参数类型的信息添加到函数名字之后
在这里插入图片描述

(3)总结

  • C语言无法支持重载,是因为同名函数无法区分,C++支持重载,是通过函数修饰规则进行区分,只要参数不同,修饰出来的名字就不同。所以函数重载要求参数不同,与返回值无关。
  • 有关C/C++函数名字的修饰规则请移步

C++的函数重载

  • C++对函数是进行了修饰的,所以当其编译好成为动态库后,对于C项目来说就不能使用了,所以为了能照顾C项目,想把某些函数按照C的风格进行编译,也就是不进行修饰,那么就加入extern "C"
extern "C" int Add(int x,int y);
int main()
{
	Add(1,2);
	return 0;
}

以上是关于2-4:C++快速入门之函数重载的主要内容,如果未能解决你的问题,请参考以下文章

C++快速入门(命名空间,输入输出,缺省函数,函数重载)

从C快速入门C++ 一.命名空间引用函数重载...

C++入门篇之关键字,命名空间,输入输出和函数重载

C++ 入门超详解!

C++ 入门超详解!

C++基础——C++面向对象之重载与多态基础总结(函数重载运算符重载多态的使用)