函數多載允許同名函數共存,透過**參數型別/個數/順序**區分。建構函數同樣支援多載,讓物件可用不同方式初始化。本文說明多載構成條件、兩大常見誤區 (僅回傳型別不同、預設參數造成模糊)、以及建構函數多載實例。
class Point {
public:
int x, y;
Point() { x = 0; y = 0; } // 無參數版
Point(int a, int b) { x = a; y = b; } // 雙參數版
void output() { cout << x << endl << y << endl; }
};
int main() {
Point pt1; // 呼叫 Point()
Point pt2(5, 5); // 呼叫 Point(int, int)
pt2.output(); // 輸出 5, 5
}
編譯器依實引數型別/個數選擇對應建構函數,這就是**多載解析**。
void output(); // (1)
int output(); // (2) 錯誤:無法構成多載
呼叫 output() 時,編譯器無法判斷要用哪個,故**禁止**。
void output(int a, int b = 5); // (1)
void output(int a); // (2)
呼叫 output(5) 時:
a=5 並使用預設 b=5。a=5。**呼叫模糊 → 編譯錯誤**。
outputSingle, outputPair)。class Point {
public:
int x, y;
// 方案 1:預設參數合併 (最簡潔)
Point(int a = 0, int b = 0) : x(a), y(b) {}
// 方案 2:委派建構 (C++11)
// Point() : Point(0, 0) {}
// Point(int a, int b) : x(a), y(b) {}
// 方案 3:explicit 防止隱含轉換
// explicit Point(int a, int b) : x(a), y(b) {}
};
推薦方案 1:單一建構函數涵蓋無參/單參/雙參情況,無多載模糊風險。
函數多載以「參數列表不同」為核心判斷標準。**回傳型別不同不構成多載**、**預設參數易造成模糊**是兩大必須避開的坑。建構函數多載雖方便,但善用預設參數或委派建構往往比寫多個多載版本更清晰、維護成本更低。