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

use*_*058 47 c++ pass-by-reference pass-by-value pass-by-pointer

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

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

void myFunction(type myVariable)
{
}

void main()
{
    myFunction(myVariable);
}
Run Code Online (Sandbox Code Playgroud)

对于像int,float等等的简单数据类型,函数由值调用.

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

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

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

Osw*_*ald 38

除非函数签名另行指定,否则参数将按值传递:

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

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

  • 我认为在谈到这个问题时我们应该仔细考虑.按值传递意味着*"你得到的是参数的值"*,并通过引用传递意味着*"你得到的是参数"*的参考/别名,独立于编译器的实际功能(复制,移动) ,删除副本,传递指针,传递引用等).我发布了这条评论,因为我认为*通过*传递值*带*复制*和*通过引用*传递*没有复制*是误解的常见来源,从C开始(没有通过引用传递,模仿它与指针),C++和Java. (3认同)

小智 16

C++总是为您提供选择:所有类型T(数组除外,见下文)都可以通过生成参数类型来传递值T,并通过引用传递参数类型T &,引用到T.

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

数组有点复杂.数组不能通过值传递,参数类型int arr[]实际上只是不同的语法int *arr.这不是传递给一个从数组产生指针的函数的行为,实际上每个可能的操作(只排除少数几个sizeof)就是这样做的.一个可以通过一个参考到一个阵列,但是这明确地标注为参考:int (&myArray)[100](注意号).

  • +1指出`int arr[]`实际上只是`int *arr`。这清楚地表明了为什么按值传递数组似乎与其他类型 T 的工作方式不同,因为实际上,如果您要编写“int *arr”,它所做的正是您所期望的。 (2认同)

mcv*_*vkr 5

C ++使得按值传递和按引用传递都成为可能。

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

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

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

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

当您将指针作为参数传递时,您自己就可以实现按引用传递范例,就像在C中一样。因为当您在指定地址中修改对象时,您正是在调用者函数中修改了该对象。