函數簽名:函數的名稱及其參數類型組合在一起,就定義了一個唯一的特性,稱為函數簽名。(不包括返回類型)
在編寫包含函數調用的語句時,編譯器就會使用該調用創建一個函數簽名。再把它與函數原型/或定義中可用的函數簽名集比較。如果找到匹配的函數名,就建立所調用的函數。
重載:多個相同函數名,不容的參數個數或者類型的形式叫做函數的重載。
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的版本。