gpt4 book ai didi

java vs C++ 通过引用传递

转载 作者:可可西里 更新时间:2023-11-01 18:40:30 24 4
gpt4 key购买 nike


我对以下内容感到困惑:
在 C++ 中,我们可以通过引用将参数传递给函数(已将其声明为指针或引用变量),如果我们在函数内部修改它,则更改会在函数返回时反射(reflect)给调用者。
这在 Java 中没有发生,我不确定我是否理解为什么。

例如这是来自对象 X 的方法

public boolean aMethod(int id, myClass aClass)
{
//do some logic
aClass = new MyClass();
//configure argument object aClass
return true;
}

调用代码中:

//some code processing
myClass obj = null;
if(X.aMethod(2,obj))
{
obj.methodA();//start using the object
}

我在 C++ 中使用它,即返回一个结果,通知函数参数可以使用,但在 java 中这不起作用。
我进入 if(X.aMethod(2,obj)) 分支,但 obj 为空。为什么为空?
我不是在方法 aMethod(int id, myClass aClass) 中使用 new 从堆中分配了一个内存地址吗?我不是在函数中传递 obj 的“地址”吗?我期望在调用代码中正确构造和使用 obj。我是否误解了有关 Java 内存的某些内容?

最佳答案

Java 按值传递所有内容 - 包括引用

这意味着如果你传递了一个对象,你可以修改那个对象的属性,它们会在你返回后继续存在,但你不能替换整个对象与一个全新的对象,因为您实际上不能修改引用 - 只能修改引用指向的内容。

在你的 aClass = 之前行:

Outside the function:

obj ---> <foo>

Inside the function:

aClass ---> <foo>

在你的 aClass = 之后行:

Inside the function:

aClass ---> <bar>

Outside the function:

obj ---> <foo>

这里要注意的关键是 aClass不指向 obj - 它指向 <foo> .您没有传递 obj 的地址, 你传递的是什么 obj 的地址指向。因此,当您更改 aClass 时指向,不触及 obj .


作为另一种思考方式:

在 Java 中,

Bar foo = new Bar();

相当于C++,

Bar *foo = new Bar();

因此当你通过 foo给一个函数,你没有传递 foo 的地址- 您正在传递分配对象的地址。 Java 没有 & -C/C++ 执行的运算符样式的引用传递。

关于java vs C++ 通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3869570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com