C++学习笔记->函数重载
来源:互联网 发布:js图片过渡效果 编辑:程序博客网 时间:2024/05/16 11:57
一、定义:
函数重载是指在同一个作用域中一组具有相同函数名,不同参数列表的函数;参数列表不同既可以是类型的不同,也可以是参数个数的不同(函数的返回类型不能用于区别重载函数)。
二、作用:
重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,对代码阅读有利。
比如:具有相同函数名的两个求和函数,其中一个函数的输入参数是整型,另一个函数的输入参数是浮点型,那么我们用同一个函数名既可以实现整型数的加减,也可以实现浮点数的加减;如果没有重载机制的话,我们想要实现整型和浮点型的加减,就需要编写两个不同名字的函数来实现,这样就需要为同一个功能的函数定义不同的名字,函数重载的重要性由此可见一斑。
三、实现原理
1、编译器如何解决命名冲突?
编译器在编译函数事,根据函数的返回类型+函数名+参数列表将函数名映射为不同的值,具体规则不同编译器有不同的规则。但是,既然返回类型也考虑在映射机制中,这样不同返回类型的函数映射之后函数名肯定不同,但是为什么不将函数的返回类型考虑到函数重载中呢?---原因是为了保持解析函数或调用函数时,独立于上下文;考虑这个例子:
float sqrt(float);
double sqrt(double);
void f(double da,float fla)
{
float fl = sqrt(da); //调用sqrt(double)
double d = sqrt(da); //调用sqrt(double)
fl = sqrt(fla); //调用sqtr(float)
d = sqrt(fla); //调用sqrt(float)
}
可以看到,如果在函数重载中考虑返回值,将会引起不必要的麻烦!
2、函数调用时如何解决重载函数命名冲突?
为了估计哪个重载函数最适合需要按照以下规则来判断:
(1)精确匹配:参数匹配而不做转换,或者做微小的转换,如数组名到指针,函数名到指向函数的指针,T到const T ;
(2)提升匹配:即整数提升(如bool到int、char到int、short到int、float到double);
(3)使用标准转换匹配:如int到double、double到int、
(4)使用用户自定义转换
(5)使用省略号匹配:类似printf中省略号参数
如果在最高层有多个匹配函数找到,则调用将被拒绝。
3、编译器如何解析重载函数调用?
编译器在实现调用重载函数解析机制的时候,首先找出同名的候选函数,然后从候选函数中找出最符合的,如果找不到就报错。
- 【C++】【学习笔记】【006】函数的重载
- C++primer学习笔记-----6.4函数重载
- (C/C++学习笔记)函数模板遇上函数重载
- 【C++】学习笔记四十二——函数重载
- C++学习笔记->函数重载
- C++学习笔记 函数重载
- C++学习笔记--函数重载
- 学习笔记:C++ 函数重载
- C++ Template学习笔记之函数模板(7)——重载函数模板
- C++ Template学习笔记之函数模板(7)——重载函数模板
- 【从C到C++学习笔记】内联成员函数/成员函数重载及缺省参数
- 【菜鸟C++学习笔记】25.函数重载
- C++学习笔记_6:函数的重载
- C++函数的重载的学习笔记
- C++函数模板重载学习笔记
- javase学习笔记---函数的重载
- PHP学习笔记之:函数重载
- C++学习笔记(十二):重载函数
- 在win下svn环境中制作patch供linux下使用
- JSTL标签库之Core
- android原生browser分析(二)--界面篇
- c++ 16进制输出
- nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) alread
- C++学习笔记->函数重载
- 【Lucene4.8教程之三】搜索
- LeetCode 143 Reorder List
- SQL查询效率优化
- SQL注入攻击及其防范浅谈
- python在终端上中文乱码问题的小结
- 亚马逊AWS在线系列讲座——如何在AWS云平台上构建千万级用户应用
- C++引用和指针的区别
- LeetCode 138 Copy List with Random Pointer