2009-11-23 53 views
0

我碰到过这个。是否更好地通过引用对非const传递引用进行const传递?

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

按照风格指南,只有常量引用是允许作为参数。 (这就是我所理解的)

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

评论?

+0

重复:请参阅http://stackoverflow.com/questions/1322517/passing-a-modifiable-parameter-to-c-function/1322547#1322547 – ChrisW 2009-11-23 02:27:02

回答

5

这里有几个经验法则您的选项之间进行选择时非常有用:

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

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

6

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)

这是否更好是有争议的。我会决定你在团队中的感受和一致性。

+0

很好的解释,但在复杂的IDE传递指针为时代的缘故的可读性似乎是一种可疑的做法。 – Duck 2009-11-23 02:33:38

+2

这是Google的做法。他们对很多事情有非常强烈的想法......比如使用不完整的构造函数和'init'方法...我有时会怀疑他们是用C还是C++编程 – 2009-11-23 07:53:58

1

还可以让你可以做

无效X(常量的std :: string & X)

X( “你好”);

没有const它不会工作。

+1

为什么不呢?我没有看到你在做什么,你可以扩展吗? – 2009-11-23 02:16:44

+0

@Newton Falls: 我认为他的意思是说“临时值rvalues不能绑定到非常量引用” – 2009-11-23 14:04:06

1

这是一个偏好,因为我可以说这是一个偏好:

void align_left(); 
// vs. 
void alignLeft(); 

既然你想通过非const的引用来传递参数,那么这样做。我不喜欢通过指针。该约定通常具有其他含义(即许多程序员看到一个指针,并认为该参数可能不是必需的,然后必须检查文档)。所以你在约定中通常会使参数名称表明它会改变参数。

t_result getDate(t_string& outString) const; 

该名称表示该突变。如果您在代码库中很少通过ref,这可能有点欺骗性,但它最终是“很好”的,并且具有足够的积极影响。关于风格,很多都回归到一致性。随着程序的真正扩展,(IMO)这确实可以帮助 - 只要确保程序的目的是清晰的,风格是一致的(至少在编写庞大的代码库之前,您会喜欢阅读样式文档)。