在函式呼叫時,若某些參數的值固定不變,每次都傳遞相同數值會顯得冗贅。C++ 提供了參數預設值機制,讓編譯器在編譯期自動填入預設值,大幅簡化程式碼撰寫。
參數預設值必須放在函式宣告(declaration)處,而非定義(definition)處。
// 正確:預設值在宣告中
void Foo(int x = 0, int y = 0);
// 錯誤:預設值在定義中
void Foo(int x = 0, int y = 0) {
// ...
}
原因分析:
若函式有多個參數,只有尾部參數能設定預設值,否則呼叫時會產生歧義。
// 正確
void Foo(int x, int y = 0, int z = 0);
// 錯誤:中間參數有預設值但後面沒有
void Foo(int x = 0, int y, int z = 0);
預設值雖能提高易用性,但濫用會降低程式碼可讀性,甚至導致函式多載產生歧義。例如:
#include <iostream>
using namespace std;
void output(int x);
void output(int x, float y = 0.0);
void output(int x) {
cout << "output int " << x << endl;
}
void output(int x, float y) {
cout << "output int " << x << " and float " << y << endl;
}
int main() {
int x = 1;
float y = 0.5;
// output(x); // 錯誤:ambiguous call
output(x, y); // 正常:output int 1 and float 0.5
return 0;
}
呼叫 output(x) 時,編譯器無法判斷是呼叫單參數版本,還是雙參數版本並使用預設值,因而報錯。實務上應謹慎使用預設值,避免與多載函式衝突。
C++ 允許使用 operator 關鍵字重新定義運算子行為,使自訂型別(如複數、矩陣、字串)能像內建型別一樣使用運算子。
// 一般函式寫法
Complex Add(const Complex& a, const Complex& b);
// 運算子多載寫法
Complex operator+(const Complex& a, const Complex& b);
呼叫方式差異:
Complex a, b, c;
c = Add(a, b); // 一般函式
c = a + b; // 運算子多載,參數出現在運算子左右兩側
*this。| 運算子類別 | 建議重載形式 |
|---|---|
| 所有一元運算子 | 成員函式 |
= () [] -> | 只能為成員函式 |
+= -= /= *= &= |= ^= %= >>= <<= | 成員函式 |
| 所有其他運算子 | 全域函式(常搭配 friend) |
原則上,涉及物件狀態改變的賦值類運算子宜為成員函式;對稱性運算子(如 +、==、<<)宜為全域函式,以保持左右運算元地位對等。