目录

一、什么是函数重载?

二、函数重载的规则

1.编译器的工作

2.函数重载的原理

2.判断函数重载的依据


一、什么是函数重载?

函数重载简介:在C++中,可以为两个或两个以上的函数提供相同的函数名称,只要参数类型不同,或者参数类型相同而参数个数不同,又或者参数类型参数个数相同,参数次序不同,称为函数重载。

举例:

int my_max(int a,int b)
{return a>b?a:b;
}char my_max(char a, char b)
{return a>b?a:b;
}double my_max(double a,double b)
{return a>b?a:b;
}int main()
{cout<<my_max(12,23)<<endl;cout<<my_max(12.23,23.34)<<endl;cout<<my_max('a','b')<<endl;return 0;
}

二、函数重载的规则

1.编译器的工作

当一个函数名在同一个域中被声明多次,两个函数的参数表中参数个数或者类型顺序不同,则认为是函数重载。

注意:调用者与函数之间的关系在编译时就被绑定在一起,其地址关联。

2.函数重载的原理

编译器如何知道与哪个函数关联?为什么C语言不能进行函数重载,而C++可以?

编译器是如何知道调用者与哪个函数关联的呢?——通过名字粉碎(名字修饰)技术 。

“C”和“C++”函数是在编译链接时通过修饰名来识别,而修饰名就是编译器在编译函数定义或声明时生成的字符串,修饰名由函数名、类名、调用约定、返回类型、参数等共同决定的。

那调用约定有哪些呢?

_stdcall 回调 :是Pascal缺省的调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。

C调用约定(_cdecl):按从右到左的顺序压参数入栈,由调用者把参数弹出,对于传送参数的内存栈是由调用者来维护的,因此实现可变参数的函数只能使用该调用约定。

_fastcall快速调用:通过寄存器传递参数(实际上,它是用ECX和EDX传送前两个双字或更小的参数,剩下参数仍然自右至左压栈传送,被调用的函数在返回前清理传送参数的内存栈),它的主要特点就是速度快

thiscall:仅仅应用于C++类中的成员函数,this指针存放于ECX寄存器,参数自右向左压

C语言为什么不能实现函数重载?

C语言编译函数名修饰约定规则:C语言修饰函数名非常简单,_cdecl是C/C++的缺省调用方式,调用约定前面添加下划线前缀即可,例:_functionname

例:

C语言编译时无法通过修饰名区分调用者与函数之间的关系

而在C++中函数名修饰约定规则是:(1)以“?”标识函数名开始,后跟函数名(2)函数名后面以“@@YA”标识参数表的开始,后跟参数表(3)参数表以代号表示(4)参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前(5)参数表后以@Z标识整个名字的结束,如果该函数无参数,则以“Z”标识结束。

常用代号如下:

X -- void

D -- char

E -- unsigned char

F -- short

H -- int

I -- unsigned int

J -- long

K -- unsigned long

M -- float

N -- double

_N -- bool

PA -- 表示指针,后面的代号表明指针类型

例:

编译链接时,把参数类型,函数返回类型作为命名的一部分,编译器编译时可以区分调用哪个函数。

2.判断函数重载的依据

可以确认为函数重载:

(1)函数名相同,参数类型不同

(2)参数类型相同,参数个数不同

(3)参数类型相同,参数个数相同,参数次序不同

不能作为判断函数重载的依据的:

(1)参数表相同,返回类型不同

例:

当调用函数时,有时候不需要返回值,编译器不知道调去用哪个函数,所以返回类型不能作为判断重载的依据。

C++中的函数重载详解(名字粉碎技术)相关推荐

  1. C语言结构体中定义函数指针详解

    C语言结构体中定义函数指针详解 结构体指针函数应用场景之一--驱动程序编写 结构体的一些基本用法 形式1:先定义结构体类型,再定义变量 形式2:在定义类型的同时定义变量 形式3:直接定义变量,用无名结 ...

  2. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  3. c++ memset 语言_C++中memset函数用法详解

    本文实例讲述了C++中memset函数用法.分享给大家供大家参考,具体如下: 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常 ...

  4. php dump函数详解,php中var_dump()函数的详解说明

    本文章给大家全面的介绍一下关于php中var_dump()函数用法详解,大家可参考参考. var_dump()void var_dump ( mixed expression [, mixed exp ...

  5. C++中发声函数Beep详解

    一.目的 1.想知道Beep是什么 二.参考 1.C++中发声函数Beep详解 https://blog.csdn.net/v1t1p9hvbd/article/details/71523218 ①总 ...

  6. python中setattr()函数用法详解

    setattr() 函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的. getattr()用法详见博文:python中getattr()函数用法详解_IT之一小佬的博客-CSDN ...

  7. python中index函数_详解python中的index函数用法

    1.函数的创建 def fun(): #定义 print('hellow') #函数的执行代码 retrun 1 #返回值 fun() #执行函数 2.函数的参数 普通参数 :要按照顺序输入参数 de ...

  8. C++语言函数重载详解和示例

    C++ 函数重载的概念 在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同.例如把变量的值写入文件,变量的类型int.long.double.char,需要通过参数把变量传入函数.在 ...

  9. python中squeeze函数_详解pytorch中squeeze()和unsqueeze()函数介绍

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

最新文章

  1. 用什么心态对待水平糟糕的程序员[不靠谱的程序员、思路紊乱的程序员]?
  2. 计算机网络应用基础 王建珍,计算机网络应用基础
  3. 涉密机房建设方案如何规划?
  4. JDK1.7和JDK1.8对于异常的支持
  5. 从零开始来看一下Java泛型的设计
  6. nanshan 钥匙在您那儿的
  7. 数据结构之哈夫曼编码
  8. rocketmq存储消息mysql_消息中间件—RocketMQ消息存储(一)
  9. Mac SDK环境变量配置
  10. SQL语句 操作实例
  11. Power BI 学习六:报表中视觉对象元素
  12. 傅里叶级数构建信号要求频率有正有负_电子科大学长说—信号与系统考研例题详解重点习题...
  13. java坦克大战(1.0)
  14. Java系统答辩提问问题_宿舍管理系统答辩问题总结
  15. qca4004 linux wifi,物联网 WIFI 一键配置原理(smartconfig) ESP8266/QCA4004
  16. 针对网络层的DoS攻击
  17. 液晶LCD1602驱动代码
  18. 临沂中考计算机试题,2017临沂中考信息技术题库带答案
  19. Springmvc开发流程(入门)
  20. 万智牌天使恩典oracle,万智牌幻灭时刻限制赛单卡再评价(上)

热门文章

  1. Java函数知识大全
  2. galera mysql ubuntu_Ubuntu14.04安装Mysql Galera Cluster
  3. 武汉坚守第三十三天——信任危机起风波,出手控价安民心
  4. 很多网站被挂马确找不到代码,arp挂马原理剖析
  5. 【C++ 科学计算】C++ 计算总平方和、残差平方和
  6. VS2017创建Qt界面程序
  7. Chocolatey离线安装步骤
  8. Windows电脑查看当前连接的wifi密码(以往连接过的)
  9. 隐私存储好手段,安全空间一触即达,忆捷FU68指纹加密U盘体验
  10. linux-安全加固(三)