一个简单的问题,我在这里找不到答案。
我的理解是在调用期间将参数传递给函数,例如
void myFunction(type myVariable)
{
}
void main()
{
myFunction(myVariable);
}
对于int
,float
等简单数据类型,函数按值调用。
但如果myVariable
是一个数组,则只传递起始地址(即使我们的函数是值函数调用)。
如果myVariable
是一个对象,也只传递对象的地址而不是创建副本并传递它。
回到这个问题。 C ++是通过引用还是值传递对象?
答案 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
的不同语法。这不是传递给一个从数组产生指针的函数的行为,实际上是每个可能的操作(仅排除少数像sizeof
)does 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。数组是指针。