Java 与传递参数的 C++

Java vs C++ for passing arguments

本文关键字:C++ 参数 Java      更新时间:2023-10-16

我开始对Java和C++如何传递参数进行一些混合。

这是正确的吗:

Java 使用按值调用进行传递,该值实际上是引用(而不是实际的数据/对象)。所以地址的副本是制作的?

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

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

但不复制?

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

如果你通过指针,你仍然会创建一个副本(当然,它是指针的副本,但仍然是副本)。

你的总结是正确的。

我个人认为,在将 Java 与C++进行比较时,将 Java 视为等同于按值传递指针时的C++。在 Java 中,您只是看不到指针,也无法操作指针。

Java 的摘要是正确的。 实际上,它也适用于非引用类型。

嗯,在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。

但是,在爪哇中

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++ 中的所有参数都是按值传递的——对象的值或引用的值——区别只在于你如何操作值。

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

这是

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