考虑这个例子:
void MyFunction(int &x){...}
void MyOtherFunction(int *x){...}
int main()
{
int my_variable = 10;
MyFunction(my_variable);
MyOtherFunction(&my_variable);
}
我是否说这两种方法都通过引用传递变量(即不创建副本),唯一的区别是 MyOtherFunction 正在接收指针?
考虑这个例子:
void MyFunction(int &x){...}
void MyOtherFunction(int *x){...}
int main()
{
int my_variable = 10;
MyFunction(my_variable);
MyOtherFunction(&my_variable);
}
我是否说这两种方法都通过引用传递变量(即不创建副本),唯一的区别是 MyOtherFunction 正在接收指针?
你说的对。在这两个调用中,您都通过引用传递变量。然而,这个 C++ 中的引用术语与 C 中的相同术语不同。
在 C 中,当有人说他通过引用传递了一个参数时,这意味着它传递了一个指向变量的指针。
在 C++ 中,引用具有新的含义。它们是语言规范的一部分。因此,当有人说他通过引用传递参数时,通常意味着相应的参数被声明为引用。:)
通过引用传递是 的别名orignal object
。指针传递会创建额外的变量来保存original object
.
是的,没有副本。传递一个指针意味着你可以传递一个空指针,而使用一个引用你必须传递一个有效的对象。
对于 int、float 和 simple var,按值传递并不会更昂贵,前提是您不需要在函数内部更改传递的参数。
在您的示例中,您从不复制my_variable
(尽管您在调用时复制了一个指针void MyOtherFunction(int *x){...}
,但这很好)。
这两个函数之间的重要区别在于它MyFunction(int &x)
是一个正确的 C++ 引用,并且永远不会为 null(在普通代码中),而您可以传递 nullptr MyOtherFunction(int *x)
,并且必须在运行时进行检查。指针版本也可以根据需要在内部重新分配MyOtherFunction
。