在Google C++ Style Guide中,它说:
定义函数时,参数顺序为:输入,然后输出。
Google基本上建议使用函数参数排序,如:
void foo(const Foo& input1, const Foo& input2, Foo* output);
然而,我的同事建议将产出放在第一位。因为这样,foo可以接受默认值,大多数时候输出不会使用默认值。例如:
void foo(Foo* output, const Foo& input1, const Foo& input2 = default);
我认为他所说的有意义。或者,从可读性,性能等方面来看,我们在这里缺少什么?为什么样式指南建议输出应该是最后一个?
答案 0 :(得分:8)
这不是Google风格指南的问题,原因是不允许使用默认参数:
https://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Default_Arguments
我们不允许使用默认功能参数,但有限情况除外,如下所述。如果合适的话,用函数重载模拟它们。
赞成
通常你有一个使用默认值的函数,但偶尔你想要覆盖默认值。默认参数允许一种简单的方法来执行此操作,而无需为罕见的异常定义许多函数。与重载函数相比,默认参数具有更清晰的语法,并且具有更少的样板,并且在“必需”之间有更明确的区别。和'可选'参数。
缺点
函数指针在存在默认参数时会引起混淆,因为函数签名通常与调用签名不匹配。向现有函数添加默认参数会更改其类型,这可能会导致代码获取其地址时出现问题。添加函数重载可以避免这些问题。此外,默认参数可能会导致代码更庞大,因为它们会在每个调用站点进行复制 - 而不是重载函数,其中"默认值为"仅出现在函数定义中。
决策
虽然上面的缺点不是那么繁重,但它们仍然超过了函数重载的默认参数的(小)好处。因此,除了下面描述的,我们要求明确指定所有参数。
一个特殊的例外是当函数是.cc文件中的静态函数(或未命名的命名空间)时。在这种情况下,由于功能的使用是如此本地化,因此不适用。
此外,构造函数中允许使用默认函数参数。上面列出的大多数缺点都不适用于施工人员,因为他们无法取得他们的地址。
另一个特殊的例外是当默认参数用于模拟可变长度的参数列表时。
// Support up to 4 params by using a default empty AlphaNum.
string StrCat(const AlphaNum &a,
const AlphaNum &b = gEmptyAlphaNum,
const AlphaNum &c = gEmptyAlphaNum,
const AlphaNum &d = gEmptyAlphaNum);