通过引用混淆传递
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
的地址。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何引用基类的派生类?