C ++:按值传递对象的原因

在Java中,包含正确对象的所有变量实际上都是引用(即指针)。 因此,以这些对象作为参数的方法调用总是“通过引用”。 调用修改对象状态的方法也会影响原始对象(在调用者方)。

C ++是不同的:这里的参数可以通过值传递或通过引用传递。 对通过值传递的对象调用增变器方法会使原始对象不受影响。 (我想通过值调用创建对象的本地副本)。

所以我对Java的第一个反应 - 从Java到C ++ - 是:总是在使用对象作为参数时使用指针。 这给了我所期待的来自Java的行为。

但是,如果不需要修改方法体中的对象,也可以使用“按值调用”。 有人会这样做的原因吗?


使用对象作为参数时始终使用指针

不,在C ++中总是通过引用传递,除非可以用nullptr作为有效参数调用函数。 如果函数不需要修改参数,则通过const引用传递。

按值传递参数有几个用途。

如果你的函数需要创建一个参数的副本,最好通过传值来创建这个副本,而不是在函数中创建一个副本。 例如:

void foo( widget const& w )
{
  widget temp( w );
  // do something with temp
}

反而使用

void foo( widget w )  // copy is made here
{
  // operate on w itself
}

这样做也有利于编译器在可能的情况下移动widget ,这通常比创建副本更高效。


你错了,你应该通过指针。 如果你想通过引用传递,那么...只需传递参考:

void foo(int& x)
{
   x = 3;
}

int main()
{
   int a = 0;
   foo(a);
   assert( a == 3 );
}

另外,请注意,按值传递可确保您的变量不能在被调用的上下文中更改。 虽然通过const引用传递...


如果您通过值将对象传递给函数,那么该函数可以自由地将这些对象用作“工作”变量,而不会影响调用者。

链接地址: http://www.djcxy.com/p/20727.html

上一篇: C++: Reasons for passing objects by value

下一篇: C++ function parameters: use a reference or a pointer (and then dereference)?