本节书摘来自异步社区出版社《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>取址,我们就拿到了有关这两种接口之间最本质的不同点的直接证据: