重载(上)——函数签名和重载

函数签名:函数的名称及其参数类型组合在一起,就定义了一个唯一的特性,称为函数签名。(不包括返回类型)

在编写包含函数调用的语句时,编译器就会使用该调用创建一个函数签名。再把它与函数原型/或定义中可用的函数签名集比较。如果找到匹配的函数名,就建立所调用的函数。

重载:多个相同函数名,不容的参数个数或者类型的形式叫做函数的重载。

attention:重载和引用参数

#include <iostream>
double larger(double a,double b);
long& larger(long& a,long& b);
using namespace std;
void main()
{

cout<<"lager of 1.5 and 2.5 is"<<larger(1.5,2.5)<<endl;
int value1=35;
int value2=45;
cout<<"lager of "<<static_cast<long>value1<<" and "<<static_cast<long>value2<<" is "<<larger(value1,value2)<<endl;
getchar();

}
double larger(double a,double b)
{
cout<<"double version:";
return a>b?a:b;
}
long& larger(long& a,long& b)
{
cout<<"long ref version:";
return a>b?a:b;
}

本来第二个进行了static_cast<long>之后输出期望是 "long ref version" ,为什么会是这个结果呢?

参数不是value1和value2,而是包含相同值的临时位置,这两个值转换为long类型。在幕后,编译器没有准备使用临时地址来初始化引用,这太冒险了。larger()中的代码可以自由控制它对引用参数进行的操作,在理论上,两个引用参数都可以修改和返回。因为以这种方式使用临时位置不是很明智,所以编译器不使用。

该如何处理这个问题?

1 可以把value1 value2申明为long类型

2 如果环境不允许这么做,还可以把引用参数申明为const:   long& larger(const long& a,const long& b). 一定要在函数原型和定义处同时修改,通知编译器不能修改参数,于是编译器就允许调用这个版本,而不是参数为double的版本。

原文地址:https://www.cnblogs.com/Daringoo/p/4392514.html