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)?