C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
c++ reference function parameter seems to contain a copy of the original object, not acts as a "real reference"
对不起,新手问题。 :)
引用函数参数连接到对象,但对引用的修改对原始对象没有影响。
简单代码:
struct dummy{
int i;
};
dummy arr[4];
// fill array
for(int n=0;n<4;n++){
arr[n].i = n;
}
void foo(dummy& d){
d = arr[0];// d.i == 0, so far so good
d.i += 10; // d.i == 10, but arr[0] is still 0
}
...
dummy p;
foo(p);
p.i += 5; // p.i == 15, but arr[0] is still 0
如果我使用 int 而不是 dommmy,很明显原始版本不会改变。但是,如果只更改了对象的属性(对象仍然相同(,则我假设修改是在原始对象上进行的。 但不是。似乎 d = arr[0];只是一个副本。 为什么?
我知道,这种情况可以用指针来完成:void foo(dummy** d({...},但我想知道这种引用行为的原因。如果引用以经典方式定义,则引用是"真实的":dummy &a=arr[0],但作为函数参数:no。
所以我认为你的误解已经结束了
d = arr[0];
你认为这d
指的是arr[0]
但事实并非如此。相反,它将arr[0]
分配给d
所指的任何内容。
在C++中,一旦引用被绑定,就无法重新绑定。任何分配给引用的尝试总是分配给引用所引用的内容,它永远不会使引用引用其他内容。
一旦初始化,引用就无法重新绑定。函数中的引用d
是指用于调用函数的dummy p
。当你写的时候
d = arr[0];
。这并不能使d
提到arr[0]
.相反,它将arr[0]
分配给p
。换句话说,它制作了一个副本。
相关文章:
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- 不断"Attempting to reference a deleted function"
- 点运算符 (.) 是"real"运算符吗?
- std::iterator::reference 必须是引用吗?
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 常量参数"real"常量吗?
- 为什么在使用 SDL2 时仍然收到'undefined reference'链接器错误?
- OpenCV undefined reference to 'cv::imread(cv::String const&, int)'
- Libcurl c++ "undefined reference to" (Windows/MinGW/g++)
- C++返回类型 T(&)[] 与使用 reference = T(&)[] 作为返回类型
- const auto & 和 auto & if reference 对象之间的区别是 const
- 尝试使用 extern "C" 调用 C 中的C++方法,得到"undefined reference to"对象的链接器错误
- 以前的'namespace reference { }'声明
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"