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

时间:2009-11-23 01:28:26

标签: c++ pass-by-reference

我遇到了这个。

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

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

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

评论

3 个答案:

答案 0 :(得分:7)

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

澄清一下,这是一个解释其论点根源的例子。

Car c;
foo(c);

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

void foo(Car c);  
void foo(const Car &c);  OR 
void foo(Car &c); 

现在考虑

Car c;
foo(&c);

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

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

答案 1 :(得分:5)

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

如果需要修改传递给函数的对象,请考虑对象的大小是否小于或等于指针的大小。如果是这样,按值传递;否则,通过const引用。

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

答案 2 :(得分:2)

它还可以让你做到

void x(const std :: string& x)

X( “你好”);

没有const它就行不通。