Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在方法调用中复制-C++;和Java的区别_Java_C++_Methods_Call - Fatal编程技术网

如何在方法调用中复制-C++;和Java的区别

如何在方法调用中复制-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

我有一些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 << "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);
}