首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 函數重載判別:const 修飾值參數不構成重載,引用/指標則可

     編輯:程式設計疑難解答

問題:`void f(int)` 與 `void f(const int)` 能否構成重載?

結論:值參數的 `const` **不參與** 函數簽名,無法重載


void f(int x);       // 簽名: f(int)
void f(const int x); // 簽名: f(int)  → 相同,編譯錯誤:重複定義

原因:呼叫端傳遞的是 **右值/值副本**,`const` 只限制函式內部不可修改參數,不影響呼叫約定與名稱修飾。

可重載的情況:引用/指標參數的 `const`


void f(int& x);        // 簽名: f(int&)
void f(const int& x);  // 簽名: f(const int&) → 不同,**可重載**

void g(int* p);
void g(const int* p);  // 亦可重載

此時 `const` 影響 **型別系統**,`int&` 與 `const int&` 為不同型別,可區分 `lvalue`/`const lvalue`。

實際呼叫匹配規則


void f(int&);        // 1
void f(const int&);  // 2

int a = 1;
f(a);        // 呼叫 1 (非 const lvalue 精確匹配)
f(10);       // 呼叫 2 (右值只能綁定 const lvalue reference)
f(static_cast(a)); // 呼叫 2

最佳實踐建議

  1. **值參數勿加 `const`** 於宣告 (定義處可加 `const` 防誤改),避免誤以為能重載。
  2. **引用參數盡量 `const`** (`const T&`),除非需修改實參,這才能構成有意義的重載 (如 `push_back(T&&)` vs `push_back(const T&)`)。
  3. 若需區分「可修改/不可修改」語意,**用引用/指標 + const**,而非值參數。

記住:**值參數的 `const` 是實作細節,不屬於介面契約;引用/指標的 `const` 才是型別一部分,可用於重載區分。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved