這個函數是否覆蓋了函數?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) {}
或只有當參數的數量或類型不同時纔會發生重載函數?
這個函數是否覆蓋了函數?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) {}
或只有當參數的數量或類型不同時纔會發生重載函數?
第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
最後,你問
或者只發生 時參數的數量或類型 不同重載函數?
是的,這是正確的,但int
,int*
和int&
是不同的類型。當然,在1或3的情況下,在大多數情況下,它將是不明確的調用,但在某些情況下,編譯器可以告訴你是哪一個。例如
void f(int);
void f(int&);
f(3)//calls f(int)
int x = 3;
f(x); //ambiguous call;
雖然第一和第二會導致左值模糊,但他們超負荷。而4日是第一次的重新定義:
爲什麼不在輸出/代碼中包含stackoverflow?我發現ideone是一個具有特殊編譯/調試功能的pastebin,但在這個答案消失之前,你的鏈接可能會失效。 – 2011-03-16 16:38:34
1和2只含糊地R值...或會,這也適用於左值?對於所有的答案我現在迷惑,我想在想着C++ – 2011-03-16 16:39:00
指出,如果在函數之間的區別是,一個具有參數通過值和其他通過引用傳遞其不超載。怎麼樣通過指針?我的結論是沒有任何重載函數,我是否正確? – Kobe 2011-03-16 16:42:48
第一和第二會引起歧義! – Nawaz 2011-03-16 16:35:40
@Nawaz:不一定 – 2011-03-16 16:39:18
注意頂級const。 – 2011-03-16 16:39:47