这两个内联函数有什么区别?
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);
答案 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并且您不想更改参数对象。有些情况下现代编译器会进行复制。谈论移动构造函数/赋值运算符实现的c++11实现,您可能会感兴趣。