重載(上)——函數簽名和重載


函數簽名:函數的名稱及其參數類型組合在一起,就定義了一個唯一的特性,稱為函數簽名。(不包括返回類型)

在編寫包含函數調用的語句時,編譯器就會使用該調用創建一個函數簽名。再把它與函數原型/或定義中可用的函數簽名集比較。如果找到匹配的函數名,就建立所調用的函數。

重載:多個相同函數名,不容的參數個數或者類型的形式叫做函數的重載。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM