通过引用混淆传递

Pass by reference confusion?

本文关键字:引用      更新时间:2023-10-16

考虑这个例子:

void MyFunction(int &x){...}
void MyOtherFunction(int *x){...}
int main()
{
  int my_variable = 10;
  MyFunction(my_variable);
  MyOtherFunction(&my_variable);
}

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

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

例如,一个指针可以为空,你可以调用MyOtherFunction(nullptr)

是的,没有复制。传递指针意味着可以传递一个空的ptr,而使用引用则必须传递一个有效的对象。

对于int型、float型和简单的变量,如果不需要在函数内部更改传递的形参,则按值传递的开销不会更大。

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

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

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

在C语言中,当有人说他通过引用传递了一个参数时,意思是传递了一个指向变量的指针。

在c++中,

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

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