通过引用混淆?

时间:2016-11-18 00:38:57

标签: c++ pass-by-reference raw-pointer

考虑这个例子:

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

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

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

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

5 个答案:

答案 0 :(得分:4)

你说你没有复制my_variable,但pointer不是reference,它们是两套不同的类型。

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

答案 1 :(得分:1)

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

对于int,float和simple vars,只要不需要在函数内部更改传递的参数,传递值就不会更贵。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

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