函數聲明時為參數指定默認值,調用時可省略該參數。語法:void func(int a=0, int b=1);
void func(int m=0, int n=1) {
cout << "m=" << m << " n=" << n << endl;
}
int main() {
func(); // m=0 n=1
func(3); // m=3 n=1
func(3,5); // m=3 n=5
}
class A {
int w, h;
public:
void set(int w=20, int h=3); // 聲明處指定默認值
void count(bool flag=false);
};
void A::set(int width, int height) { w=width; h=height; }
void A::count(bool val) {
cout << (val ? "面積:" : "半面積:") << (val ? w*h : w*h/2) << endl;
}
int main() {
A a;
a.set(); // 使用默認 20,3
a.count(); // 半面積: 30
a.set(5,2); // 覆蓋
a.count(true); // 面積: 10
}
| 特性 | 缺省參數 | 函數重載 |
|---|---|---|
| 本質 | 單一函數,調用時補全參數 | 多個同名函數,編譯時區分 |
| 參數變化 | 只能從右向左連續省略 | 類型、個數、順序任意組合 |
| 代碼體積 | 僅一份函數體 | 每個版本獨立函數體 |
| 可讀性 | 調用處隱含默認值,易被忽略 | 顯式區分,意圖清晰 |
open(file) vs open(host,port))// 錯誤:虛函數缺省參數按靜態類型綁定
class Base { virtual void f(int x=10); };
class Derived : public Base { void f(int x=20) override; };
Base* p = new Derived();
p->f(); // 調用 Base::f,x=10 而非 20!
缺省參數是編譯時語法糖,善用可減少樣板代碼,但需警惕虛函數默認值的靜態綁定特性。