首页 > 解决方案 > c++ 引用函数参数似乎包含原始对象的副本,而不是充当“真正的引用”

问题描述

对不起新手的问题。:)

引用函数参数连接到一个对象,但对引用的修改对原始对象没有影响。

简化代码:

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 而不是 dummy,很明显原来的不会改变。但是,如果只是更改了对象的属性(对象仍然相同),我假设修改是在原始对象上进行的。但不是。似乎 d = arr[0]; 只是一个副本。为什么?

我知道,这种情况可以用指针来完成: void foo(dummy** d){...} 但我想知道这种引用行为的原因。如果以经典方式定义引用是“真实的”:dummy &a=arr[0],但作为函数参数:否。

标签: c++pass-by-reference

解决方案


所以我认为你的误解已经过分了

d = arr[0];

你认为d那是指,arr[0]但事实并非如此。相反,它分配给所指的arr[0]任何内容。d

在 C++ 中,一旦一个引用被绑定,它就不能被重新绑定。任何分配给引用的尝试总是分配给引用所指的内容,它永远不会使引用引用其他东西。


推荐阅读