本節書摘來自異步社群出版社《c++覆轍錄》一書中的第1章,第1.4節,作者: 【美】stephen c. dewhurst(史蒂芬 c. 杜赫斯特),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
函數重載和形參預設值之間其實并無幹系。不過,這兩個獨立的語言特征有時會被混淆,因為它們會模塑出文法上非常相像的函數用法接口。當然,看似一樣的接口其背後的抽象意義卻大相徑庭:
// ...
c1 a;
a.f1(0);
a.f1();<code>`</code>
型别<code>c1</code>的設計者決定給予函數<code>f1()</code>一個形參的預設值。這樣一來,<code>c1</code>的使用者就有了兩個選擇:要麼顯式地給函數<code>f1()</code>一個實參,要麼通過不指定任何實參的方式隐式地給函數<code>f1()</code>一個實參0。是以,上述兩個函數調用産生的動作序列12是完全相同的。
c2 a;
a.f2(0);
a.f2();<code>`</code>
型别c2的實作則有很大不同。其使用者的選擇是根據給予的實參數目調用兩個雖然名字都叫<code>f2()</code>,卻是完全不同的函數中的某一個。在我們早先那個<code>c1</code>型别的例子裡,兩個函數調用産生的動作序列是完全相同的,但在這個例子裡它們産生的卻是完全不同的動作序列了。這是因為兩個函數調用的結果是調用了不同的函數。
通過對成員函數<code>c1::f1()</code>和<code>c2:f2()</code>取址,我們就拿到了有關這兩種接口之間最本質的不同點的直接證據: