簡體   English   中英

使用const參數重載函數

[英]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 intint作為參數,你傳遞任何相關的類型, doubleint或其他任何可以轉換為int的東西, const intint都可以接受傳入值,實際上沒有區別。 如果編譯器允許定義兩者,那么調用哪一個? 你不知道,也不知道編者。 所以代碼的第一部分是不允許的。

說到第二個例子,引用和指針有所不同。 因為你不能傳遞const int*來初始化int *而且都不能使用const int來初始化int& 因此,如果您定義兩個具有相同返回類型的函數,一個是“const version” 指針引用參數,另一個不是,這會產生影響。 另一個問題出現了,如果我傳遞一個int 對象 (或稱為變量,相同含義)或int *指針,然后匹配哪一個(當參數是指針引用時 )? 答案是“非常規”的。 如果你想將“const版本”與非const對象或非指向const指針匹配,你可能需要const_cast ,我試圖弄清楚。

回到你的問題:

但是如果一個函數有一個const參數,另一個函數具有相同類型的非const參數呢? 它適用於引用和指針嗎?

是的,它在某種程度上僅適用於參考和指針。

如果C ++提供它,它為什么提供?

說不出來。 我沒有太多經驗。

有關詳細信息,請閱讀C ++ Primer 5th的相關部分部分。 屏幕截圖鏈接如下:

  1. https://imgur.com/tnqrxVY
  2. https://imgur.com/hF1MjUH
  3. https://imgur.com/Fg2zeEw

順便說一下,雖然我是新手。 但是第一個答案是什么是int const i 我不明白“ 它是一個實現細節 ”究竟意味着什么。 沒有冒犯,只是無法理解那部分答案。 :d

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM