如何在方法调用中复制-C++;和Java的区别
我有一些C语言的代码++如何在方法调用中复制-C++;和Java的区别,java,c++,methods,call,Java,C++,Methods,Call,我有一些C语言的代码++ struct Node { int x; Node(int x) : x(x) {} friend std::ostream & operator << (std::ostream &o, const Node &n) { o << n.x; return o; } }; void Foo(Node n) { n.x--; cout &l
struct Node {
int x;
Node(int x) : x(x) {}
friend std::ostream & operator << (std::ostream &o, const Node &n) {
o << n.x;
return o;
}
};
void Foo(Node n) {
n.x--;
cout << "Foo: " << n << endl;
}
void Foo2(Node &n) {
n.x--;
cout << "Foo2: " << n << endl;
}
int main() {
Node n(5);
cout << n << endl;
Foo(n);
cout << n << endl;
Foo2(n);
cout << n << endl;
return 0;
}
…现在我在Java中也达到了同样的效果
class Node {
public int x;
Node(int x) {
this.x = x;
}
@Override
public String toString() {
return Integer.toString(x);
}
}
public class NodeHomevork {
static void Foo(Node n) {
n.x--;
System.out.println("Foo: " + n);
}
static void Foo2(Node n) {
Node n2 = new Node(n.x);
n2.x--;
System.out.println("Foo2: " + n2);
}
public static void main(String[] args) {
Node n = new Node(5);
System.out.println(n);
Foo(n);
System.out.println(n);
Foo2(n);
System.out.println(n);
}
}
但我不知道如何在不使用Foo2中的new关键字的情况下实现Foo2。如果你有任何想法,我会很感激任何帖子,谢谢。 < P> C++中,当你向FoO2下一个参数时,你的对象被复制。在Java中,可以使用clone()方法: Foo2代码:
static void Foo2(Node n)
{
Node n2 = n.clone();
n2.x--;
System.out.println("Foo2: " + n2);
}
或:
并通过Foo2(n.clone())调用代码>
但是我认为你应该使用第一个选项,因为在C++代码中你的克隆是在方法里面。 <代码> java < /Cord>是一个引用类型语言。当您想要创建变量时,无法避免new
C#
具有struct
s值类型。这意味着您可以创建struct
s的变量,而无需使用new。另一方面,C++
完全是一种值类型语言,C++
性能优越的原因之一是由于值类型。可能吗?如果没有,高度相关。唯一需要补充的是,java中只存在引用的pass-by值。您可以将new
移动到其他地方。最干净的解决方案是向类中添加一个静态方法,如Node newinstancepromexisting(Node Node Node)
,这样Foo2
就会说Node n2=Node.newinstancepromexisting(n)代码>。java C++不是C++,C++不是java。不要尝试用java作为模型来编写C++代码,也不要试图用C++作为模型来编写java代码。我所说的是Java和C++是两种不同的语言,试图通过逐行翻译来实现从一个到另一个的转换是不起作用的。通常当你重写<代码>克隆< /代码>时,你可以提高它对公共< />代码的访问权限。
class Node implements Cloneable
{
public int x;
Node(int x) { this.x = x; }
@Override
public String toString() { return Integer.toString(x); }
@Override
protected Node clone() throws CloneNotSupportedException
{
Node copy = null;
copy = (Node)super.clone();
return copy;
}
}
static void Foo2(Node n)
{
Node n2 = n.clone();
n2.x--;
System.out.println("Foo2: " + n2);
}
@Override
public Node clone() throws CloneNotSupportedException { ... } //public!
static void Foo2(Node n)
{
n.x--;
System.out.println("Foo2: " + n);
}