2013-12-22 60 views
1

我需要一些幫助來理解編譯器如何選擇重載的C++函數。如何選擇適用於C++的重載函數?

當給一個函數:

type func(type1 x, type2 y); 
type func(type3 x, type2 y); 

編譯器如何確定哪些功能選擇?

我知道所選擇的功能是根據其適用性而定的,但是如何知道哪個功能可以成功使用。

例如:

鑑於這些函數重載函數:

char* average(int i, float f, double d); 
double average(double d, float f, int i); 
double fabs(double d); 

考慮到這些變量:

int i1, i2, i3; 
float f1, f2, f3; 

什麼數據類型是這些函數調用的返回值?爲什麼?

average(i1, i2, i3); 
average(f1, f2, f3); 
fabs(average(f1,f2,f3)); 
+3

好了,你可以通過只運行代碼... –

+0

找到答案你的具體實例和對於長的答案,你可以看看標準的那一段與類型轉換和促銷活動和重載決議涉及。作爲C++的新手,我不推薦它。 – chris

+0

就你而言,編譯器根據名稱單獨選擇函數,因爲你的函數具有不同的名稱。 – dasblinkenlight

回答

0

爲了編譯函數調用時,編譯器必須首先執行名稱查找,這對於功能可涉及argument-dependent lookup(ADL)。 如果這些步驟產生多個候選功能,則執行重載分辨率以選擇實際將被調用的功能。 通常,其參數最接近參數的候選函數是被調用的函數。

至於你的情況:

1 - >char* average(int i, float f, double d);

2 - >double average(double d, float f, int i);

在您的兩個功能

這裏有完全地不同的參數列表。第一個平均值是int,float,double,第二個是double,float,int

因此,編譯器根據參數決定首先調用哪個方法。 如果您使用參數(int, float, double)調用方法,則重載版本將採用第一種方法,如果您使用參數(double, float, int)調用方法,則重載版本採用第二種方法。

選擇是否在編譯時決定調用哪個重載方法(換句話說,方法的簽名)。 因此,編譯器已經知道要調用的方法的簽名。

雖然重載方法,我們必須牢記以下規則記:

  • 重載方法必須改變參數列表,
  • 重載方法可以改變返回類型。
  • 重載的方法可以改變訪問修飾符。
  • 可以在同一個類或子類中重載一個方法。
+0

謝謝,但根據什麼變化? 我的意思是,如果我用(int,float,double)聲明一個函數,我可以用(int,int,float)來調用它嗎?這種隱式轉換的規則是什麼? –

+0

它不是由你來調用一個你想要的值的函數。轉換按照定義的規則進行。 正如我在上面解釋過的那樣**候選函數的參數最接近匹配參數** 當您聲明一個帶參數列表'(int,float,double)'的函數時,並且在調用如果你放置了'(int,int,float)',編譯器首先檢查具有參數'(int,int,float)'的函數定義,然後如果它沒有找到這些參數,它會進行下一個最佳匹配,即' int,float,double)'在你的情況下進行隱式轉換。 – analyticalpicasso

+0

我希望你能理解一些東西。 – analyticalpicasso

1

返回值取決於所做的函數調用。例如,你的第一個函數調用會返回值double,因爲第二個平均函數被調用。

函數重載僅根據參數而發生,與返回類型無關。您不能僅僅基於它們具有不同的返回類型來重載兩個函數。函數應該根據參數的不同而有所不同,以使函數重載起作用。