参数的最佳实践是什么?

7

当你能够选择时,将参数作为指针传递而不是值通常被认为是更好的选择?显然这在很大程度上取决于具体情况,但当有选择时,使用指针更好吗?

这是否仅仅是出于内存的原因?

如果是这样,那么更好的传递方式是指针还是引用?


http://cpp-next.com/archive/2009/09/your-next-assignment/ - sehe
如果这被标记为C ++,为什么不使用引用而不是指针? - David Rodríguez - dribeas
5个回答

10

一些常规的经验法则:

如果需要修改它,请传递指针或引用。如果值可能为null,传递指针,否则传递引用。

如果对象很大,请传递const指针或const引用,具体取决于null是否是合法值。

如果使用指针,请优先使用智能指针而不是裸指针。

否则,请按值传递。


2
“成本更高”是一个相对的术语。问题在于,复制值是否比复制指向该值的指针更耗费资源,以及这是否重要。就我个人而言,如果超过8个字节左右,我倾向于传递指针或引用。 - Andy Thomas
这也可能意味着“任何需要非平凡复制构造函数”的东西,尽管通常这意味着“大”尺寸。 - Kerrek SB
我在“复制成本更高”中暗示了这一点,但应该表达得更明确。尺寸通常是复制成本的原因,但它不是唯一的因素。 - Andy Thomas
传递指针/引用和传递const指针/引用有什么区别?如果对象“大”,为什么更倾向于使用其中一个? - Dollarslice
@SirYakalot:如果你通常会通过值传递参数,但决定改为通过指针或引用传递(出于某种原因),那么你更倾向于使用const引用而不是非const引用。这是因为当你通过值传递参数时,函数无法修改调用者的值的副本。因此,为了保持相同的语义,通过const引用传递参数,因为通过非const引用传递参数,函数可能会改变调用者的值。希望这样说得清楚。 - John Dibling
@SirYakalot - 对于你的第二个问题,复制指针或引用通常是一个廉价的、恒定时间复制四或八个字节,不管它所指向的对象的大小和复制的成本如何。 - Andy Thomas

2

在C++中,当你按值传递时,它会调用自定义类的复制构造函数。如果你正在传递向量或大型数据结构,则这可能非常昂贵。

你应该使用const和引用来避免复制,同时仍保护值。否则,对于像int这样的较小的东西使用值通常是合理的。


0

永远不要传递指针,这是最佳实践。

  1. 使用const引用传递以避免复制的成本。

  2. 如果希望函数修改原始数据,则通过引用传递。

  3. 否则,请通过值传递。

  4. 指针不应该被裸传(没有所有权语义),指针也不应该在智能指针或容器类之外保留。

  5. 仅当对象可能为NULL且明确未传递所有权(通过大量文档)时,才应传递指针。

我唯一期望看到指针的情况是无法使用引用时(例如它可能为空),而这几乎永远不会发生(除非深度嵌套在容器方法中)。


7
永远不应该使用“never”这个词。有些情况下,你需要传递指针,特别是当NULL可能是函数的有效参数时,使用引用可能没有意义;不能使用智能指针。 - Nawaz
3
最佳实践不能包罗万象,因此“绝不”是适当的。最好从“绝不”做起,一旦你理解了语言,再学习例外情况。 - Martin York
洛基:最佳实践这个词汇并不意味着“总是”。有一些情况下,最佳实践实际上是更糟糕的实践。 - Nawaz
这就是所谓的“最佳实践”。最好“永远不要”这样做。但是,“最佳实践”并不意味着总是这样,它只是表示最好“永远不要”这样做。直到你明白何时不应该这样做。因此,最好“永远不要”这样做。 - Martin York
2
@Andy Thomas-Cramer:我更喜欢不使用指针(但有时不得不使用),但最佳实践仍然是永远不要使用它们。 :-) - Martin York
显示剩余6条评论

0

这取决于您传递的参数类型。如果参数大小合理(再次由您决定)较低,则可能希望按值传递。

对于大型结构体/数组,始终最好通过指针或引用进行传递。除此之外,如果参数不应该被修改,则还可以添加const


0
通常我会使用引用(可能是const引用)来传递输入参数,而使用指针来传递输出参数。
这样一来,很容易就能看出哪些参数是输入参数,哪些是输出参数(被调用者会修改它们的内容)。
当然,对于像int、long等小型类型,我不会费心去使用引用。

输入参数可以通过引用或指针传递。带有const限定符的指针或引用表示输入参数。非const限定符的指针或引用表示输出参数或const不正确性。 - Andy Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接