2011-03-16 152 views
4

這個函數是否覆蓋了函數?C++中的重載函數

void f(int a, int b) {} 
void f(int& a, int& b) {} 
void f(int* a, int* b) {} 
void f(const int a, const int b) {} 

或只有當參數的數量或類型不同時纔會發生重載函數?

回答

7

第1,2,3號是。 Number 4重新聲明編號1.

您會發現,頂級const限定符不會影響函數聲明。他們改變你使用它們的函數定義內的方式,但它仍然是同樣的功能

void f(int); 
void f(const int); //redeclares 
void f(const int x) //same as above 
{ 
    x = 4; //error, x is const 
} 

這一點,另一方面是罰款

void f(const int); 
void f(int x) //same as above 
{ 
    x = 4; //OK Now 
} 

注意,非頂級consts確實參與重載解析。例如。

void f(int & x) 
void f(const int & x) //another function, overloading the previous one 

最後,你問

或者只發生 時參數的數量或類型 不同重載函數?

是的,這是正確的,但intint*int&是不同的類型。當然,在1或3的情況下,在大多數情況下,它將是不明確的調用,但在某些情況下,編譯器可以告訴你是哪一個。例如

void f(int); 
void f(int&); 
f(3)//calls f(int) 
int x = 3; 
f(x); //ambiguous call; 
+0

第一和第二會引起歧義! – Nawaz 2011-03-16 16:35:40

+1

@Nawaz:不一定 – 2011-03-16 16:39:18

+1

注意頂級const。 – 2011-03-16 16:39:47

3

雖然第一和第二會導致左值模糊,但他們超負荷。而4日是第一次的重新定義:

http://ideone.com/lRFQi

+0

爲什麼不在輸出/代碼中包含stackoverflow?我發現ideone是一個具有特殊編譯/調試功能的pastebin,但在這個答案消失之前,你的鏈接可能會失效。 – 2011-03-16 16:38:34

+0

1和2只含糊地R值...或會,這也適用於左值?對於所有的答案我現在迷惑,我想在想着C++ – 2011-03-16 16:39:00

+0

指出,如果在函數之間的區別是,一個具有參數通過值和其他通過引用傳遞其不超載。怎麼樣通過指針?我的結論是沒有任何重載函數,我是否正確? – Kobe 2011-03-16 16:42:48