浅析C++中的函数重载

 更新时间:2023年08月08日 11:02:58   作者:悲伤的鱼香肉丝er  
这篇文章主要介绍了浅析C++中的函数重载,在C++中,可以为两个或两个以上的函数提供相同的函数名称,只要参数类型不同,或者参数类型相同而参数个数不同,又或者参数类型参数个数相同,参数次序不同,称为函数重载,需要的朋友可以参考下

一、什么是函数重载?

函数重载简介:在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 -- 表示指针,后面的代号表明指针类型

例:

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

3.判断函数重载的依据

可以确认为函数重载:

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

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

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

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

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

例:

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

到此这篇关于浅析C++中的函数重载的文章就介绍到这了,更多相关C++函数重载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++中declspec(dllexport)和declspec(dllimport) 的用法介绍

    C++中declspec(dllexport)和declspec(dllimport) 的用法介绍

    这篇文章介绍了C++中declspec(dllexport)和declspec(dllimport) 的用法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C语言简明讲解队列的实现方法

    C语言简明讲解队列的实现方法

    队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。在队尾添加元素,在队头删除元素
    2022-04-04
  • c语言中static的用法详细示例分析

    c语言中static的用法详细示例分析

    以下是对c语言中static函数的用法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • 浅谈char*类型返回值和字符串常量

    浅谈char*类型返回值和字符串常量

    下面小编就为大家带来一篇浅谈char*类型返回值和字符串常量。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++中Digraphs、Trigraphs和Tokens的深入讲解

    C++中Digraphs、Trigraphs和Tokens的深入讲解

    这篇文章主要给大家介绍了关于C++中Digraphs、Trigraphs和Tokens的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • 图解AVL树数据结构输入与输出及实现示例

    图解AVL树数据结构输入与输出及实现示例

    这篇文章主要为大家介绍了C++图解AVL树数据结构输入与输出操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C语言详细讲解strcpy strcat strcmp函数的模拟实现

    C语言详细讲解strcpy strcat strcmp函数的模拟实现

    这篇文章主要介绍了怎样用C语言模拟实现strcpy与strcat和strcmp函数,strcpy()函数是C语言中的一个复制字符串的库函数,strcat()函数的功能是实现字符串的拼接,strcmp()函数作用是比较字符串str1和str2是否相同
    2022-05-05
  • C语言实现打印杨辉三角的方法详细(三种方法)

    C语言实现打印杨辉三角的方法详细(三种方法)

    杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。本文将介绍三种可以实现打印杨辉三角的办法,感兴趣的可以试一试
    2022-01-01
  • C++连接并使用MySQL数据库

    C++连接并使用MySQL数据库

    这篇文章主要为大家详细介绍了C++连接并使用MySQL数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • 纯c实现异常捕获try-catch组件教程示例

    纯c实现异常捕获try-catch组件教程示例

    这篇文章主要为大家介绍了纯c实现异常捕获try-catch组件教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论