是否更好地通过引用通过引用进行const传递?

use*_*855 0 c++ pass-by-reference

我遇到过这个.

http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Reference_Arguments#Reference_Arguments

根据样式指南,只允许const引用作为参数.(这就是我的理解)

虽然,我似乎不喜欢这种方法.

评论?

RC.*_*RC. 7

Google建议只使用const引用,因为他们觉得在函数修改对象时传递指针更清晰.这可能是真的,但我更喜欢只在null是可接受的值时才使用指针.

为了澄清,这里有一个例子来解释他们论证的根源.

Car c;
foo(c);
Run Code Online (Sandbox Code Playgroud)

c是否被函数修改取决于它是如何声明的,只是查看调用本身并没有给出关于可能发生什么的很多指示.

void foo(Car c);  
void foo(const Car &c);  OR 
void foo(Car &c); 
Run Code Online (Sandbox Code Playgroud)

现在考虑

Car c;
foo(&c);
Run Code Online (Sandbox Code Playgroud)

传递了对象的地址后,更容易看到(从调用者的角度来看)该函数是否可能正在更改您的对象.当然,它并不能保证它是一个指向const对象的指针,但从代码审查者的角度来看,当函数传递指针时,更容易检测到这个对象可能会被更改.当严格执行Google的建议时,通过指针传递的对象总是可变的,而不通过指针传递的任何东西都是const.(通过const&或b/c传递值)

这是否更好是值得商榷的.我会决定你的团队感受和保持一致.

  • 这是谷歌的做法.他们对很多事情有很强烈的想法......例如使用不完整的构造函数和`init`方法......我有时想知道他们是用C还是C++编程的 (2认同)

Jam*_*lis 6

在决定您的选项时,以下是一些经验法则:

如果你没有需要修改被传递到函数对象,考虑对象的大小是否小于或等于指针的大小.如果是这样,按值传递; 否则,传递const引用.

如果确实需要修改传递给函数的对象,请考虑参数是否可选(即null是有效参数).如果是这样,通过指针; 否则,通过非const引用.