是否有任何理由不将参数作为const &
而不是按值发送,如果它不会被更改且不会复制?我的理解是const
by value参数与没有const
(并且不会相互重载)相同,因此它仍然会被复制。
我知道最好通过const &
发送大型对象,但我不知道这条线的位置。或者,如果即使是小参数也应按值发送,如果,则不会更改或复制它们。
注意::我试图搜索这个,但主题相当含糊,所以我没有找到任何好的答案,如果已经回答了这个问题我很抱歉(发现很多关于何时使用const
何时使用的问题const &
但不是关于价值与const &
对于不明显大的对象的优势。
答案 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)
根据经验,您应该传递基本类型,例如指针,int
,bool
,float
,double
(非常量)值,以及对象类型,如std::string
,std::vector
和自定义类(const)引用。作为此规则的一个例外,有一些轻量级类专门设计为按值传递,例如智能指针。
通过const值传递值,例如void foo(const double bar)
没有任何意义 - 为什么不允许foo
修改bar
的副本?将参数声明为const在这里没有用。
通过引用传递基元也没什么意义。在幕后,当通过引用传递参数时,指针按值传递。复制指针通常和复制基本类型(例如int
)一样昂贵,类型const int&
的参数对大多数C ++程序员来说都很奇怪。
答案 2 :(得分:3)
除非界面需要它,否则原语应按值传递。否则,const&是一种更好的做法。