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

qqi*_*row 5 c++

谷歌C++风格指南中,它说:

定义函数时,参数顺序为:输入,然后输出.

谷歌基本上建议功能参数排序如下:

void foo(const Foo& input1, const Foo& input2, Foo* output);
Run Code Online (Sandbox Code Playgroud)

但是,我的同事建议将产出放在第一位.因为这样,foo可以接受默认值,大多数时候输出不会使用默认值.例如:

void foo(Foo* output, const Foo& input1, const Foo& input2 = default);
Run Code Online (Sandbox Code Playgroud)

我觉得他说的很有道理.或者,从可读性,性能等方面来看,我们在这里缺少什么?为什么风格指南建议输出应该是最后一个?

Omn*_*ity 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);
Run Code Online (Sandbox Code Playgroud)