函数重载
这篇文章,我将谈谈我自己对函数重载的简单认识。
1开始,我们得明白,函数重载是甚么??为何要函数重载??函数重载可以做哪些 事??函数重载是指在同1作用域内,可以有1组具有相同函数名,不同参数列表的函 数,这组函数被称为重载函数。重载函数通经常使用来命名1组功能相似的函数,这样做减 少了函数名的数量,避免了名字空间的污染,对程序的可读性有很大的好处。 首先我先解释名字空间这个概念。还是实例吧。
#include<iostream>
using namespace std;
int main()
{
cout<<"hello world"<<endl;
return 0;
} 这里std就是1个命名空间,标准输入输出流对象cin,cout都包括在std这个名字空间 里,而std又包括在iostream这个头文件中。固然了。我们也能够自定义名字空间。 看下边的实例。
#include<iostream>
namespace A
{
int a = 10;
int b = 20;
}
namespace A //表示在A命名空间里增加内容
{
int c = 0;
}
int main()
{
std::cout<<a<<std::endl;
std::cout<<c<<std::endl;
return 0;
} 固然了,我们也能够在std命名空间里添加内容,但是1般不那末做。 下边进入正题。 在.c文件中,写出下边1段的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Add(int x,int y)
{
return x + y;
}
float Add(float x,float y)
{
return x + y;
}
int main()
{
Add(10,20);
Add(10.0f,20.0f);
system("pause");
return 0;
}
背后的故事》中提到程序从编译到运行出结果的进程中的几个阶段。其中有1个阶段提 到生成符号表。我们来看1下上边的函数成的符号表。符号表是在.map文件里,在vs里默许不显示符号表文件。要想显示出来,这样设置: 工程名右击--->属性---->链接器----->调试---->生成映照文件选择是。 其实吧,上边两个函数在c中根本编译不通过(报错:Add函数已有主体)就没法生成符 号表。所以,我们去掉1个函数,让程序编译通过,看看函数名在符号表中的命名。
通过这个我们可以得出,函数在符号表中的命名就是函数名前边加个下划线。所以如果 1个程序中出现了同名函数,他们在符号表中的命名1样,这样调用时就出现了冲突。 要是上边的1段程序在cpp文件中运行,来看看情况。
这里我们可以看出,虽然两个函数的函数名1样,但是他们在符号表中生成的名称不1 样。‘?’表示名称开始,‘?’后边是函数名“@@YA”表示参数表开始,后边的3个字符分别 表示返回值类型,两个参数类型。“@Z”表示名称结束。 由于两个函数生成的符号表中的名称不1样,所以是可以编译通过的。 思考:如果在cpp文件里调用c文件里的函数,这样可以不???
//cpp文件
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
extern int Add(int x,int y);
int main()
{
int ret = Add(10,20);
getchar();
return 0;
}
//c文件
int Add(int x,int y)
{
return x + y;
} 其实,这段程序编译通过,连接不通过,报错是没法解析的外部符号。由于在c文件中的 符号名是_Add,而在cpp文件中生成的其实不是(看上图)。所以在cpp文件里调用c文件 里的函数,其实不能成功。 处理这类问题的解决办法是: 将cpp文件里的声明语句改成:
extern "C" int Add(int x,int y); 这就是告知编译器声明的函数是c提供的。下边我们来看1下在linux虚拟机下生成的符 号表文件。cpp文件在linux虚拟机里需要用g++编译。安装g++很简单。1句命令就好。 yum install gcc gcc-c++ 安装好了以后就能够了。 运行程序以后,使用命令:objdump a.out -t > test.out -t是表示生成符号表,最后是将生成的符号表放在test.out文件。打开test.out文件,就会 发现,整形数相加的函数生成的符号就是 _Z3Addii。_Z表示符号表名称开始。‘3’表示函 数名的字符个数。i是int的缩写。是的,linux下生成符号表中的符号完全不同于wiindows 下。 到这里,文章1开始的几个问题都应当明白了。在c++里才有函数重载,c里并没有,但 是c可使用回调函数来实现功能相近的函数。 好了,关于函数重载就到这里。有问题私我~~邮箱:1521107105@qq.com (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |