Java 与传递参数的 C++
Java vs C++ for passing arguments
我开始对Java和C++如何传递参数进行一些混合。
这是正确的吗:
Java 使用按值调用进行传递,但该值实际上是引用(而不是实际的数据/对象)。所以地址的副本是制作的?
C++默认情况下,按值传递,但值不是引用,而是实际数据。如果要通过引用模拟真实调用,请使用&
或指针?
总之,Java会复制参数,但它是引用的副本。C++通常会复制实际基础数据的引用(除非您使用&
或指针),
C++(03) 总是复制,除非你通过引用传递。(理论上...在实践中,可能会发生复制省略,但这与问题无关)
如果你通过指针,你仍然会创建一个副本(当然,它是指针的副本,但仍然是副本)。
你的总结是正确的。
我个人认为,在将 Java 与C++进行比较时,将 Java 视为等同于按值传递指针时的C++。在 Java 中,您只是看不到指针,也无法操作指针。
Java 的摘要是正确的。 实际上,它也适用于非引用类型。
嗯,在Java和C++中,传递参数时有两个选项:按值传递(PbV)和按引用传递(PbR)。Java 按值传递所有预备对象,并通过引用传递所有其他对象。而C++按值传递所有内容,除非您需要按引用传递。
- 按值传递
在Java和C++中,传递值都是复制传递的对象,你在函数中对对象所做的不会对函数之外的原始对象产生任何影响。例如,
void foo(aTemp)
{
aTemp = 2;
}
....
int a = 1;
foo(a)
std::cout << a;
输出将为 1;
- 按引用传递
,而是创建对象引用的副本。例如
void foo(&aTemp)
{
aTemp = 2;
}
....
int a = 1;
foo(a)
std::cout << a;
输出将为 2。
- 更复杂的情况
到目前为止,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,它们是包含基元类型的对象)。 如果函数是基元类型,则可以对函数内参数的本地副本执行任何操作,并且调用函数的参数副本将保持不变。
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用