c++ - 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],但作为函数参数:否。
解决方案
所以我认为你的误解已经过分了
d = arr[0];
你认为d
那是指,arr[0]
但事实并非如此。相反,它分配给所指的arr[0]
任何内容。d
在 C++ 中,一旦一个引用被绑定,它就不能被重新绑定。任何分配给引用的尝试总是分配给引用所指的内容,它永远不会使引用引用其他东西。
推荐阅读
- regex - 从 sed 手工制作匹配示例
- jquery - '目标' _blank 不在新窗口中打开
- amazon-cognito - 未配置自定义身份验证 lambda 触发器
- bash - unix shell 脚本 - jot -r 1 1 4 是什么意思?我可以用 seq 替换 jot 吗?
- python - 如何正确排序此字符串
- search - 有没有办法在初始化后使用谓词修改获取的结果?
- rascal - 包含过大文本时,树形图无法呈现框
- c++ - 我想为嵌套列表实现 QAbstractListModel 并将其从 c++ 传递给 qml
- arrays - 异步调用后数据未呈现在 html 文件中
- r - 在 R 中使用 anova 测试找到多项式的最佳次数