码迷,mamicode.com
首页 > 其他好文 > 详细

函数签名和重载

时间:2015-04-04 18:19:44      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

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的版本。

函数签名和重载

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!