c++中引用和按引用传递参数的区别
C++ difference between a reference and a pass-by-reference argument
我的问题与以下继承自ifstream的Bifstream成员函数有关。Read需要一个char指针。我给它(char*)&target。target是一个引用,所以我给它的是一个对int的引用的引用。为什么会这样呢?
bool cBifstream::ReadInt( int& target ){
if( !this->is_open() ){
return false;
}
this->read( (char*)&target, sizeof(int) );
}
这是我使用的其他工作代码的一个片段。
int size;
is.read((char*)&size, sizeof(int));
语法相同,但这次变量是int型,而不是对int型的引用。
目标宣言:cBifstream a("test2");
int b;
a.ReadInt(b);
编辑:谢谢你的回复。有一件事我还是不明白。
this->read( (char*)target, sizeof(int) ); (all i did here was remove the ampersand)
这个更改导致我的程序崩溃。然而,target是对int型的引用,所以上面的代码应该可以工作,因为
int size;
is.read((char*)&size, sizeof(int));
。
您正在获取引用的地址-这会产生target
所引用的变量的地址。引用是它所引用的变量的别名,在任何地方都没有语法上的间接关系——因此对引用执行的任何操作都会影响被引用的变量。
int x;
int & y=x;
使用上述方法,您对y
所做的任何操作都将与对x
所做的操作完全相同
代码&target
没有给您对引用的引用,它给您引用指向的原始对象的地址。因此,您已经采取了int*
并将其转换为char*
(使用c风格强制转换)。
对于所有意图和目的而言,引用只不过是创建引用的对象。这包括获取引用的地址。
相关文章:
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 在 C 和 C++ 中作为函数参数,int **a 和 int a[][] 之间有什么确切的区别
- 可变参数模板和省略号有什么区别?
- 为什么C++不允许两个同名的函数/类模板,区别仅在于非类型模板参数(整型)的类型?
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- 使用 std::move 将参数传递给函数,如果该参数声明为按值传递或使用移动操作数 &&,是否有区别?
- 折叠表达式和参数包:static_assert 内 Args&& 和 Args 之间的区别
- 将函数作为参数传递的两种方式之间的区别
- 如果我提前将参数声明为变量而不是将它们内联写入函数调用,那有什么区别(在内存方面)?
- C++:在函数参数的上下文中,"const T &"和"T &&"有什么区别?
- 为什么相同的函数签名只有区别,另一个通过 const 获取参数是重新定义?
- 将参数传递给 std::thread, C++ 的区别
- 将函数的引用和 lambda 表达式作为参数传递时有什么区别?
- 在结构C++,构造函数中的默认值和默认参数有什么区别
- 对于属性上的 NOTIFY 信号,如果我给它一个参数有什么区别?
- 作为参数的"new Foo()"和"&Foo()"之间的区别
- 将参数传递给C 中的基类构造函数之间的区别
- 系统堆栈中的两个函数的递归调用(将不同数量的数组作为参数传递)有什么区别
- 使用std :: enable_if作为函数参数与模板参数有什么区别?
- 在C++容器中,作为模板参数提供的分配器和作为构造函数参数提供的分配程序之间的区别