函数参数作为Const参考

时间:2011-07-22 15:15:09

标签: c++

是否有任何理由不将参数作为const &而不是按值发送,如果它不会被更改且不会复制?我的理解是const by value参数与没有const(并且不会相互重载)相同,因此它仍然会被复制。

我知道最好通过const &发送大型对象,但我不知道这条线的位置。或者,如果即使是小参数也应按值发送,如果,则不会更改或复制它们。

注意::我试图搜索这个,但主题相当含糊,所以我没有找到任何好的答案,如果已经回答了这个问题我很抱歉(发现很多关于何时使用const何时使用的问题const &但不是关于价值与const &对于不明显大的对象的优势。

3 个答案:

答案 0 :(得分:24)

将只读参数作为const引用传递通常没有任何问题,对于任何类型的重量级类来说,这肯定是最有效的方法。

你可能想要考虑通过复制传递基本类型,因为这使得引用实际上可能导致更多成本而不仅仅是复制(例如,复制只适合一个寄存器,而参考可能用指针等实现。)。

此外,您可以按值传递std::shared_ptr和迭代器,它们是为此而制作的。

至于传递const-value,这是一个实现细节。像这样使用它:

// Declaration:
int foo(int n, double d); // No "const"! Constness is not part of the interface.

// Definition
int foo(int n, const double d) // implementation detail
{
  while (n--) { if (d > n) return n; }
}

在实现中,您可能会也可能不会选择直接使用参数变量并修改它们(如n),或者您可以选择将它们视为只读(如d) ,并适当地声明参数。

答案 1 :(得分:14)

根据经验,您应该传递基本类型,例如指针,intboolfloatdouble(非常量)值,以及对象类型,如std::stringstd::vector和自定义类(const)引用。作为此规则的一个例外,有一些轻量级类专门设计为按值传递,例如智能指针。

通过const值传递值,例如void foo(const double bar)没有任何意义 - 为什么不允许foo修改bar的副本?将参数声明为const在这里没有用。

通过引用传递基元也没什么意义。在幕后,当通过引用传递参数时,指针按值传递。复制指针通常和复制基本类型(例如int)一样昂贵,类型const int&的参数对大多数C ++程序员来说都很奇怪。

答案 2 :(得分:3)

除非界面需要它,否则原语按值传递。否则,const&是一种更好的做法。

boost::is_fundamental

Identifying primitive types in templates

相关问题