内联函数和复制构造函数

时间:2014-01-18 21:40:08

标签: c++ c++11

这两个内联函数有什么区别?

inline void setValue(ClassName& value);

VS

inline void setValue(ClassName value);

基本上,编译器如何处理这两种情况g ++ / MSComp?

类似的情况,但有原语:

inline void setValue(const float value);
inline void setValue(float& value);
inline void setValue(float value);

3 个答案:

答案 0 :(得分:2)

inline主要是一个链接器指令,因此在这里没有任何区别w.r.t.论证传递。安全地忽略了

void setValue(ClassName& value);

通过引用获取传入的对象,从而编辑实际的传入对象,而

void setValue(ClassName value);

通过值获取它,因此使用原始对象的副本。对此 local 变量所做的更改对调用方的传入参数无关紧要。

通过引用和值传递的含义对于内置(原始)类型也是如此。这两个变体void setValue(float value);void setValue(const float value);对调用者没什么意义,因为无论如何你都在复制值,对于调用者const并不重要,尽管在函数的实现站点上,它禁止对复制的本地value进行意外编辑,因为它是函数内的const

答案 1 :(得分:1)

第二个内联不会更改原始对象的值,因为它将首先被复制,并且复制的对象的值将被更改。

对于基元类型,只有引用一(第二)可以改变value原语。

答案 2 :(得分:1)

来自你的评论:

  

让我们说速度至关重要,我不想随时复制构造函数。我会选择哪种方法?

当然没有副本!使用引用,即使它是const并且您不想更改参数对象。有些情况下现代编译器会进行复制。谈论移动构造函数/赋值运算符实现的实现,您可能会感兴趣。