2

考虑这个例子:

void MyFunction(int &x){...}

void MyOtherFunction(int *x){...}

int main()
{
  int my_variable = 10;
  MyFunction(my_variable);
  MyOtherFunction(&my_variable);
}

我是否说这两种方法都通过引用传递变量(即不创建副本),唯一的区别是 MyOtherFunction 正在接收指针?

4

5 回答 5

4

你说得对,你不复制my_variable,但指针不是引用,它们是两组不同的类型。

例如,指针可以为 null,您可以调用MyOtherFunction(nullptr).

于 2016-11-18T00:42:00.387 回答
1

你说的对。在这两个调用中,您都通过引用传递变量。然而,这个 C++ 中的引用术语与 C 中的相同术语不同。

在 C 中,当有人说他通过引用传递了一个参数时,这意味着它传递了一个指向变量的指针。

在 C++ 中,引用具有新的含义。它们是语言规范的一部分。因此,当有人说他通过引用传递参数时,通常意味着相应的参数被声明为引用。:)

于 2016-11-18T00:46:48.283 回答
1

通过引用传递是 的别名orignal object。指针传递会创建额外的变量来保存original object.

于 2016-11-18T01:05:50.963 回答
1

是的,没有副本。传递一个指针意味着你可以传递一个空指针,而使用一个引用你必须传递一个有效的对象。

对于 int、float 和 simple var,按值传递并不会更昂贵,前提是您不需要在函数内部更改传递的参数。

于 2016-11-18T00:43:47.770 回答
1

在您的示例中,您从不复制my_variable(尽管您在调用时复制了一个指针void MyOtherFunction(int *x){...},但这很好)。

这两个函数之间的重要区别在于它MyFunction(int &x)是一个正确的 C++ 引用,并且永远不会为 null(在普通代码中),而您可以传递 nullptr MyOtherFunction(int *x),并且必须在运行时进行检查。指针版本也可以根据需要在内部重新分配MyOtherFunction

于 2016-11-18T00:43:56.253 回答