“通过引用传递”到底是什么意思?
谁有权决定?
编辑:显然,我没有成功地很好地表述我的问题。
我不是在问Java的参数传递是如何工作的。我知道看起来像一个保存对象的变量实际上是一个保存对象引用的变量,并且该引用是通过值传递的。这里(在链接线程和其他线程中)和其他地方有很多关于该机制的精细解释。
问题是关于术语“通过引用”的技术含义。(结束编辑)
我不确定这是否是SO的正确问题,如果不是,请道歉,但我不知道更好的地方。这里的其他问题已经说了很多,例如Java是“按引用传递”还是“按值传递”?通过引用传递还是按值传递?,但我还没有找到这个术语含义的权威答案。
我认为“通过引用传递”意味着“将引用(通常是指针)传递给对象”,因此被调用方可以修改调用方看到的对象,而“通过值传递”意味着复制对象,并让被调用方对副本感兴趣(明显的问题:如果对象包含引用,深复制或浅副本怎么办)。
唱FW出现了很多 地方说“通过引用”意味着,这里有一些论点认为它意味着更多,但定义仍然读作
一种参数传递模式,其中对实际参数的引用(或者,如果想要在政治上不正确,则使用指针)传递到正式参数中;当被调用方需要正式参数时,它会取消引用指针以获取它。
我没有找到很多地方为这个术语提供更强的定义,在这个页面上,我发现“形式参数的左值设置为实际参数的左值”,如果我理解正确,这里使用相同的定义(“形式参数只是作为实际参数的别名。
事实上,我发现使用更强定义的唯一地方是反对在Java中,对象通过引用传递的概念的地方(这可能是由于我缺乏google-fu)。
所以,如果我把事情弄清楚了,就通过引用
class Thing { ... }
void byReference(Thing object){ ... }
Thing something;
byReference(something);
根据第一个定义将大致对应于(在C中)
struct RawThing { ... };
typedef RawThing *Thing;
void byReference(Thing object){
// do something
}
// ...
struct RawThing whatever = blah();
Thing something = &whatever;
byReference(something); // pass whatever by reference
// we can change the value of what something (the reference to whatever) points to, but not
// where something points to
从这个意义上说,说Java通过引用传递对象就足够了。但根据第二个定义,通过引用或多或少意味着
struct RawThing { ... };
typedef RawThing *RawThingPtr;
typedef RawThingPtr *Thing;
void byReference(Thing object){
// do something
}
// ...
RawThing whatever = blah();
RawThingPtr thing_pointer = &whatever;
byReference(&thing_pointer); // pass whatever by reference
// now we can not only change the pointed-to (referred) value,
// but also where thing_pointer points to
由于Java只允许你有指向对象的指针(限制了你可以用它们做什么),但没有指针到指针,从这个意义上说,说Java通过引用传递对象是完全错误的。
所以
- 我是否充分理解了上述引用传递的定义?
- 周围还有其他定义吗?
- 是否有共识哪个定义是“正确的”,如果是,哪个定义?