回答
这里有几个经验法则您的选项之间进行选择时非常有用:
如果不需要修改的对象被传递到函数,考虑是否的大小对象小于或等于指针的大小。如果是这样,按价值传递;否则,通过const引用传递。
如果你做需要修改传入函数的对象,考虑参数是否可选(即null是一个有效的参数)。如果是这样,通过指针;否则,通过非const引用。
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)
这是否更好是有争议的。我会决定你在团队中的感受和一致性。
很好的解释,但在复杂的IDE传递指针为时代的缘故的可读性似乎是一种可疑的做法。 – Duck 2009-11-23 02:33:38
这是Google的做法。他们对很多事情有非常强烈的想法......比如使用不完整的构造函数和'init'方法...我有时会怀疑他们是用C还是C++编程 – 2009-11-23 07:53:58
还可以让你可以做
无效X(常量的std :: string & X)
X( “你好”);
没有const它不会工作。
为什么不呢?我没有看到你在做什么,你可以扩展吗? – 2009-11-23 02:16:44
@Newton Falls: 我认为他的意思是说“临时值rvalues不能绑定到非常量引用” – 2009-11-23 14:04:06
这是一个偏好,因为我可以说这是一个偏好:
void align_left();
// vs.
void alignLeft();
既然你想通过非const的引用来传递参数,那么这样做。我不喜欢通过指针。该约定通常具有其他含义(即许多程序员看到一个指针,并认为该参数可能不是必需的,然后必须检查文档)。所以你在约定中通常会使参数名称表明它会改变参数。
t_result getDate(t_string& outString) const;
该名称表示该突变。如果您在代码库中很少通过ref,这可能有点欺骗性,但它最终是“很好”的,并且具有足够的积极影响。关于风格,很多都回归到一致性。随着程序的真正扩展,(IMO)这确实可以帮助 - 只要确保程序的目的是清晰的,风格是一致的(至少在编写庞大的代码库之前,您会喜欢阅读样式文档)。
- 1. 通过引用传递const值的C++
- 2. 通过const引用传递Qt类
- 3. 通过const引用传递的C++
- 4. 引用问题传递const对象
- 5. 通过const引用传递一个对象?
- 6. 通过const引用复制传递C++对象构造函数
- 7. 通过值或通过引用const传递std :: chrono :: duration?
- 8. 在C++中,通过引用传递一个const布尔值是不是很好?
- 9. C++:错误传递的const引用
- 10. 将值传递给const引用参数?
- 11. 在C++中将临时对象作为非const引用传递
- 12. 返回的std ::配对与由非const引用传递
- 13. 它通过const引用传递shared_pointer线程吗?
- 14. 对非const对象的const引用
- 15. 尝试引用与const成员通过引用传递时删除的函数
- 16. Java是通过值传递还是通过引用传递?
- 17. 传递右值参数的非const左值引用参数
- 18. 通过引用传递与值传递
- 19. 我是否正确传递参数并通过引用传递?
- 20. C++:将枚举作为值或作为const引用传递是更好吗?
- 21. C++通过Const引用并通过Const返回引用
- 22. 通过引用传递C++
- 23. C++通过引用传递?
- 24. cpp通过引用传递
- 25. PHP通过引用传递?
- 26. Java通过引用传递
- 27. C++通过引用传递
- 28. 通过引用传递流
- 29. JFrame通过引用传递
- 30. 通过引用传递LPCWSTR
重复:请参阅http://stackoverflow.com/questions/1322517/passing-a-modifiable-parameter-to-c-function/1322547#1322547 – ChrisW 2009-11-23 02:27:02