函数重载
来源:互联网 发布:git 小乌龟 mac 编辑:程序博客网 时间:2024/06/05 01:07
这篇文章,我将谈谈我自己对函数重载的简单认识。
一开始,我们得明白,函数重载是什么??为什么要函数重载??函数重载可以做哪些
事??函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函
数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减
少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。
首先我先解释名字空间这个概念。还是实例吧。
#include<iostream>using namespace std;int main(){ cout<<"hello world"<<endl; return 0;}
这里std就是一个命名空间,标准输入输出流对象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命名空间里添加内容,然而一般不那么做。
下边进入正题。
在.c文件中,写出下边一段的代码:
#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;}
背后的故事》中提到程序从编译到运行出结果的过程中的几个阶段。其中有一个阶段提
到生成符号表。我们来看一下上边的函数成的符号表。符号表是在.map文件里,在vs里默认不显示符号表文件。要想显示出来,这样设置:
工程名右击--->属性---->链接器----->调试---->生成映射文件选择是。
其实吧,上边两个函数在c中根本编译不通过(报错:Add函数已有主体)就无法生成符
号表。所以,我们去掉一个函数,让程序编译通过,看看函数名在符号表中的命名。
通过这个我们可以得出,函数在符号表中的命名就是函数名前边加个下划线。所以如果
一个程序中出现了同名函数,他们在符号表中的命名一样,这样调用时就出现了冲突。
要是上边的一段程序在cpp文件中运行,来看看情况。
这里我们可以看出,虽然两个函数的函数名一样,但是他们在符号表中生成的名称不一
样。‘?’表示名称开始,‘?’后边是函数名“@@YA”表示参数表开始,后边的3个字符分别
表示返回值类型,两个参数类型。“@Z”表示名称结束。
由于两个函数生成的符号表中的名称不一样,所以是可以编译通过的。
思考:如果在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提供的。下边我们来看一下在linux虚拟机下生成的符
号表文件。cpp文件在linux虚拟机里需要用g++编译。安装g++很简单。一句命令就好。
yum install gcc gcc-c++
安装好了之后就可以了。
运行程序之后,使用命令:objdump a.out -t > test.out
-t是表示生成符号表,最后是将生成的符号表放在test.out文件。打开test.out文件,就会
发现,整形数相加的函数生成的符号就是 _Z3Addii。_Z表示符号表名称开始。‘3’表示函
数名的字符个数。i是int的缩写。是的,linux下生成符号表中的符号完全不同于wiindows
下。
到这里,文章一开始的几个问题都应该明白了。在c++里才有函数重载,c里并没有,但
是c可以使用回调函数来实现功能相近的函数。
好了,关于函数重载就到这里。有问题私我~~邮箱:1521107105@qq.com
- 重载之函数重载
- 函数重载
- 重载函数
- 函数重载
- 函数重载
- 函数重载
- 函数重载
- 函数重载
- 函数重载
- 函数重载
- 函数重载
- 函数重载
- 函数重载
- 重载函数
- 重载函数
- 函数重载
- 重载函数
- 函数重载
- search-a-2d-matrix
- ListView删除item时总是删除最后一条数据!
- IOS-63-禁用右滑返回的两种方式
- 美团点评 spark性能优化指南-高级篇
- php常用到的例子
- 函数重载
- null和undefined的区别?
- Android开发之6.0运行时权限处理
- MyBatis入门第3天--高级映射与查询缓存
- Java中字符串常量和字符串变量的区别
- CocoaChina上给出的好的开源项目
- css之FILTER:progid:DXImageTransform.Microsoft.Gradient使用
- mysql免安装版配置常见问题整理
- 一些c函数