首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 基礎

C++ 函數重載完整指南

     編輯:C++ 基礎

核心概念:同名異參

在同一作用域內,**函數名相同、參數列表不同**(型別、個數、順序任一不同),即構成重載。回傳型別**不參與**重載區分。

經典範例:通用 swap

void Swap(int* a, int* b) {
    int t = *a; *a = *b; *b = t;
}
void Swap(float* a, float* b) {
    float t = *a; *a = *b; *b = t;
}
void Swap(char* a, char* b) {
    char t = *a; *a = *b; *b = t;
}
void Swap(bool* a, bool* b) {
    bool t = *a; *a = *b; *b = t;
}

int main() {
    int n1=100, n2=200; Swap(&n1, &n2); cout << n1 << ", " << n2 << endl; // 200, 100
    float f1=12.5, f2=56.93; Swap(&f1, &f2); cout << f1 << ", " << f2 << endl; // 56.93, 12.5
    char c1='A', c2='B'; Swap(&c1, &c2); cout << c1 << ", " << c2 << endl; // B, A
    bool b1=false, b2=true; Swap(&b1, &b2); cout << b1 << ", " << b2 << endl; // 1, 0
    return 0;
}

呼叫端無需記憶 swapInt、swapFloat 等不同名稱,統一用 Swap,編譯器依實參型別自動匹配。

重載規則總結

編譯器如何實現重載:Name Mangling

C++ 編譯器將重載函數編碼為唯一符號名(如 _Swap_int_int、_Swap_float_float),連結階段解析呼叫。這是**編譯期靜態綁定**(靜態多態),非執行期動態派發。

最佳實踐與誤區

  • ✅ **語義一致**:重載函數應執行「邏輯相同、型別不同」的操作(如 print、max、swap)。
  • ❌ **濫用重載實現無關功能**:void open(File)、void open(Window)、void open(Heart) 會讓維護者崩潰。
  • ⚠️ **預設參數與重載衝突**:f(int a, int b=10) 與 f(int a) 呼叫 f(5) 時產生歧義,避免混用。
  • ⚠️ **隱性轉換導致匹配混淆**:f(int)、f(double) 呼叫 f(3.14f)(float)可能匹配 double 版本,需理解標準轉換序列排名。

成員函數重載

類別內同樣支援重載,包含建構函數重載(詳見建構函數章節)。

總結

函數重載讓介面更直覺、命名空間更乾淨。遵循「同名同義、參數異型」、避開預設參數陷阱、理解匹配優先序,即能駕馭這項 C++ 核心特性。

  1. 上一篇文章:
  2. 下一篇文章:
  • --热点文章
  • Copyright © 程式碼之家 All Rights Reserved
    條件是否構成重載說明
    參數個數不同✅f() vs f(int)
    參數型別不同✅f(int) vs f(float)
    參數順序不同✅f(int, float) vs f(float, int)
    僅參數名稱不同❌f(int a) vs f(int b) 同一函數
    僅回傳型別不同❌int f() vs float f() 編譯錯誤
    const/volatile 修飾參數✅f(int) vs f(const int) 可重載
    引用 vs 值參數✅f(int&) vs f(int) 可重載