重载(上)——函数签名和重载
函数签名:函数的名称及其参数类型组合在一起,就定义了一个唯一的特性,称为函数签名。(不包括返回类型)
在编写包含函数调用的语句时,编译器就会使用该调用创建一个函数签名。再把它与函数原型/或定义中可用的函数签名集比较。如果找到匹配的函数名,就建立所调用的函数。
重载:多个相同函数名,不容的参数个数或者类型的形式叫做函数的重载。
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的版本。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步