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、编译器如何解析重载函数调用?

      编译器在实现调用重载函数解析机制的时候,首先找出同名的候选函数,然后从候选函数中找出最符合的,如果找不到就报错。




0 0