5

关于 Java 和 C++ 如何传递参数,我已经开始有点困惑了。

它是否正确:

Java 使用按值调用传递,值实际上是引用(不是实际的数据/对象)。所以复制地址?

默认情况下,C++ 按值传递,但值不是引用,而是实际数据。如果您想通过引用使用&或指针来模拟真实调用?

总之,Java 会复制参数,但它是引用的副本。&C++ 通常会复制实际的底层数据,但不会复制引用(除非您使用或指针)?

4

5 回答 5

3

C++(03)总是复制一份,除非你通过引用传递。(理论上......在实践中,可能会发生复制省略,但这与问题无关)

如果您通过指针传递,您仍然会制作副本(当然,它是指针的副本,但仍然是副本)。

于 2012-06-20T15:31:04.557 回答
2

你的总结是正确的。

我个人发现,在将 Java 与 C++ 进行比较时,当非原始类型作为指针按值传递时,将 Java 视为 C++ 的等价物更简单。在 Java 中,您只是看不到,也无法操作指针。

于 2012-06-20T15:53:38.217 回答
1

Java 的总结是正确的。事实上,它也适用于非引用类型。

于 2012-06-20T15:42:16.357 回答
0

那是对的。另请注意,Java 实际上确实为原始类型(int、char、double、float、short、long、boolean 和 byte)制作了副本,但不是原始类型的数组(int[]、char[] 等)仍然通过引用传递)或包装类(例如 Integer 和 Double,它们是包含原始类型的对象)。如果它是原始类型并且调用函数的参数副本将保持不变,您可以对函数内部参数的本地副本执行任何您想要的操作。

于 2012-06-20T15:53:13.783 回答
0

好吧,在 Java 和 C++ 中,传递参数时都有两个选项:按值传递(PbV)和按引用传递(PbR)。 Java 通过值传递所有初步对象,并通过引用传递所有其他对象。 而 C++ 通过值传递所有内容,除非您需要通过引用传递。

  1. 按值传递

在Java和C++中,按值传递就是对传递的对象进行复制,你在函数中对对象所做的事情不会对函数外的原始对象产生任何影响。例如,

void foo(aTemp)
{
aTemp = 2;
}
....
int a = 1;
foo(a)
std::cout << a;

输出为 1;

  1. 通过引用传递

通过引用传递不会复制对象,它会复制对象的引用。例如

void foo(&aTemp)
{
aTemp = 2;
}
....
int a = 1;
foo(a)
std::cout << a;

输出将是 2。

  1. 更复杂的情况

到目前为止,java和c++之间没有太大的区别。但是,如果将传入的对象分配给一个新对象,情况就会有所不同。例如在 C++ 中,

 void foo(&aTemp)
 {
 myClass b(2);
 aTemp = b;
 }
 ...    
 myClass a(1);
 foo(a)
 std::cout << a;

输出将是 2。

然而,在 Java

void foo(aTemp)
{
myClass b = new myClass(2);
aTemp = b;
}
...
myClass a = new myClass(1);
foo(a)
std::cout << a;

输出将为 1。

这里的输出不同是由 java 和 c++ 中的 "=" 不同造成的

在 c++ 中,如果你不以不规则的方式覆盖“=”,myClass b 的值将被复制到指向 a 的 aTemp 中。

而在Java中,当你做aTemp = b时,你将对象b的地址分配给了aTemp,所以aTemp不再指向原来的a,无论你对aTemp做什么,它都不会对a产生长期影响。

所以总而言之,Java 和 C++ 中的所有参数都是按值传递的——对象的值或引用的值——区别只在于你如何操作值。

这是我从我的正常工作中学到的,希望对你有帮助。

于 2017-10-13T08:40:43.840 回答