70

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

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

void myFunction(type myVariable)
{
}

void main()
{
    myFunction(myVariable);
}

对于简单的数据类型,如int,float等,该函数按值调用。

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

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

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

4

5 回答 5

63

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

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

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

于 2014-01-19T10:14:20.847 回答
21

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

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

数组有点复杂。数组不能按值传递,像这样的参数类型int arr[]实际上只是不同的语法int *arr。这不是传递给从数组中生成指针的函数的行为,几乎所有可能的操作(除了少数类似的操作sizeof)都是这样做的可以传递对数组的引用,但这明确注释为引用:(int (&myArray)[100]注意与号)。

于 2014-01-19T10:18:06.643 回答
7

C++ 使得值传递和引用传递两种范式成为可能。

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

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

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

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

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

于 2014-01-19T10:22:07.090 回答
0

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

于 2019-08-03T12:57:19.950 回答
-7

C++ 按值传递非指针 (int*) 或引用 (int&) 的参数。您不能在被调用函数中修改调用块的 var。数组是指针。

于 2014-01-19T10:17:52.573 回答