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 而不是 dummy,很明显原来的不会改变。但是,如果只是更改了一个对象的 属性 (对象仍然相同),我假设修改是在原始对象上进行的。
但不是。似乎 d = arr[0];只是一个副本。
为什么?
我知道,这种情况可以用指针来完成:void foo(dummy** d){...} 但我想知道这种引用行为的原因。如果引用以经典方式定义,则为 "real":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
。换句话说,它制作了一个副本。
抱歉新手问题。 :)
引用函数参数连接到一个对象,但对引用的修改对原始对象没有影响。
简化代码:
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){...} 但我想知道这种引用行为的原因。如果引用以经典方式定义,则为 "real":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
。换句话说,它制作了一个副本。