6.4. 缺省参数

Tip

我们不允许使用缺省函数参数,少数极端情况除外。尽可能改用函数重载。

优点:

当您有依赖缺省参数的函数时,您也许偶尔会修改修改这些缺省参数。通过缺省参数,不用再为个别情况而特意定义一大堆函数了。与函数重载相比,缺省参数语法更为清晰,代码少,也很好地区分了「必选参数」和「可选参数」。

缺点:

缺省参数会干扰函数指针,害得后者的函数签名(function signature)往往对不上所实际要调用的函数签名。即在一个现有函数添加缺省参数,就会改变它的类型,那么调用其地址的代码可能会出错,不过函数重载就没这问题了。此外,缺省参数会造成臃肿的代码,毕竟它们在每一个调用点(call site)都有重复(acgtyrant 注:我猜可能是因为调用函数的代码表面上看来省去了不少参数,但编译器在编译时还是会在每一个调用代码里统统补上所有默认实参信息,造成大量的重复)。函数重载正好相反,毕竟它们所谓的「缺省参数」只会出现在函数定义里。

结论:

由于缺点并不是很严重,有些人依旧偏爱缺省参数胜于函数重载。所以除了以下情况,我们要求必须显式提供所有参数(acgtyrant 注:即不能再通过缺省参数来省略参数了)。其一,位于 .cc 文件里的静态函数或匿名空间函数,毕竟都只能在局部文件里调用该函数了。其二,可以在构造函数里用缺省参数,毕竟不可能取得它们的地址。其三,可以用来模拟变长数组。


  1. // 通过空 AlphaNum 以支持四个形参
    string StrCat(const AlphaNum &a,
    const AlphaNum &b = gEmptyAlphaNum,
    const AlphaNum &c = gEmptyAlphaNum,
    const AlphaNum &d = gEmptyAlphaNum);