C ++是按值还是引用传递对象?

时间:2014-01-19 10:10:39

标签: c++ pass-by-reference pass-by-value pass-by-pointer

一个简单的问题,我在这里找不到答案。

我的理解是在调用期间将参数传递给函数,例如

void myFunction(type myVariable)
{
}

void main()
{
    myFunction(myVariable);
}

对于intfloat等简单数据类型,函数按值调用。

但如果myVariable是一个数组,则只传递起始地址(即使我们的函数是值函数调用)。

如果myVariable是一个对象,也只传递对象的地址而不是创建副本并传递它。

回到这个问题。 C ++是通过引用还是值传递对象?

5 个答案:

答案 0 :(得分:37)

参数按值传递,除非函数签名另有说明:

  • void foo(type arg)中,arg按值传递,无论type是简单类型,指针类型还是类类型,
  • void foo(type& arg)中,arg通过引用传递。

对于数组,传递的值是指向数组的第一个元素的指针。如果在编译时知道数组的大小,也可以通过引用传递数组:void foo(type (&arg)[10])

答案 1 :(得分:16)

C ++总是为您提供选择:所有类型T(数组除外,见下文)可以通过使参数类型T按值传递,并通过通过参数类型T &,引用到 - T进行引用。

如果参数类型未明确注释为引用(type &myVariable),则无论具体类型如何,始终都会按值传递。对于用户定义的类型(这就是复制构造函数的用途)。同样对于指针,即使复制指针也不会复制指向的内容。

阵列有点复杂。数组不能通过值传递,参数类型如int arr[]实际上只是int *arr的不同语法。这不是传递给一个从数组产生指针的函数的行为,实际上是每个可能的操作(仅排除少数像sizeofdoes that。一个可以传递一个引用到数组,但这明确注释为引用:int (&myArray)[100](注意&符号)。

答案 2 :(得分:4)

C ++使得两者都按值传递并且可以通过引用范例传递。

您可以在下面找到两个示例用法。

http://www.learncpp.com/cpp-tutorial/72-passing-arguments-by-value/

http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

数组是特殊结构,当您将数组作为参数传递时,指向第一个元素地址的指针将作为值传递,并且数组中的元素类型。

当您将指针作为参数传递时,您可以自己实现传递引用范例,如C中所示。因为当您修改指定地址中的对象时,您将完全修改调用方函数中的对象。

答案 3 :(得分:0)

在C ++中,声明为类,结构或联合的类型被视为“类类型”。这些是按值传递的,或者可以说使用副本构造函数的副本传递给了函数。当我们实现二叉树时,这很明显,其中递归函数中几乎总是有Node *类型的参数对二叉树起作用。这是为了便于对该节点的修改。如果要按原样传递节点(即不是指针类型),则对节点的修改将是对本地副本的修改。即使在向量的情况下,在传递向量副本的同时也将传递给函数,为避免这种情况,我们使用了引用&。

答案 4 :(得分:-7)

C ++通过值传递没有指针(int *)或引用(int&)的参数。您无法修改被调用函数中调用块的var。数组是指针。