[英]function overloading with const parameters
函數重載可能發生在具有相同參數數量的兩個成員函數之間,如果其中一個成員函數聲明為const。
但是如果一個函數有一個const參數,另一個函數具有相同類型的非const參數呢? 它適用於引用和指針嗎? 如果C ++提供它,它為什么提供? 如果你知道,請與我分享原因。
以下是幫助您理解上述場景的示例。
void fun(const int i)
{
cout << "fun(const int) called ";
}
void fun(int i)
{
cout << "fun(int ) called " ;
}
int main()
{
const int i = 10;
fun(i);
return 0;
}
輸出:編譯器錯誤: redefinition of 'void fun(int)'
void fun(char *a)
{
cout<<"non-const fun() called";
}
void fun(const char *a)
{
cout<<"const fun() called";
}
int main()
{
const char *ptr = "GeeksforGeeks";
fun(ptr);
return 0;
}
輸出:const fun()調用
為什么在C ++中允許第二個?
第一個參數是頂級 const
。 這意味着函數不能更改參數的值,但調用者並不關心:被調用者獲取參數的副本 ,因此如果參數具有頂級 const
,則它是實現細節。 請注意以下工作:
void f(int); // forward declare
void g(){ f(42); }
void f(int const i){ /*...*/ } // define above declared function
對於第二組重載, const
不再是頂級的。 它描述被調用者是否可以更改指針指向的內容 。 作為來電者,您確實關心這一點。 它不僅僅是一個實現細節了。
首先,解釋為什么不允許第一個代碼而第二個代碼沒問題。
const int
和int
作為參數,你傳遞任何相關的類型, double
, int
或其他任何可以轉換為int的東西, const int
和int
都可以接受傳入值,實際上沒有區別。 如果編譯器允許定義兩者,那么調用哪一個? 你不知道,也不知道編者。 所以代碼的第一部分是不允許的。
說到第二個例子,引用和指針有所不同。 因為你不能傳遞const int*
來初始化int *
而且都不能使用const int
來初始化int&
。 因此,如果您定義兩個具有相同返回類型的函數,一個是“const version” 指針或引用參數,另一個不是,這會產生影響。 另一個問題出現了,如果我傳遞一個int
對象 (或稱為變量,相同含義)或int *
指針,然后匹配哪一個(當參數是指針或引用時 )? 答案是“非常規”的。 如果你想將“const版本”與非const對象或非指向const指針匹配,你可能需要const_cast
,我試圖弄清楚。
回到你的問題:
但是如果一個函數有一個const參數,另一個函數具有相同類型的非const參數呢? 它適用於引用和指針嗎?
是的,它在某種程度上僅適用於參考和指針。
和
如果C ++提供它,它為什么提供?
說不出來。 我沒有太多經驗。
有關詳細信息,請閱讀C ++ Primer 5th的相關部分部分。 屏幕截圖鏈接如下:
順便說一下,雖然我是新手。 但是第一個答案是什么是int const i
? 我不明白“ 它是一個實現細節 ”究竟意味着什么。 沒有冒犯,只是無法理解那部分答案。 :d
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.