Google C ++样式指南。为什么输入然后输出参数排序?

时间:2015-01-14 01:53:35

标签: c++

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);

我认为他所说的有意义。或者,从可读性,性能等方面来看,我们在这里缺少什么?为什么样式指南建议输出应该是最后一个?

1 个答案:

答案 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);