Java相当于C ++拷贝赋值运算符

时间:2013-10-17 13:55:58

标签: java c++ operator-keyword

我正在尝试理解用C ++编写的这个操作符函数并将其转换为Java。

Class& Class::operator=(const Class& In) {

   properties = In.properties;

   return *this;

}

这是否只是复制类对象的实例和属性?我已经写了一些东西:

public static Class copy(Class obj) {
    //returns new instance of Class individual
    Class copy =  new Class(obj.row_num, obj.col_num, obj.input_length, obj.output_length, obj.max_arity, obj.function_length, obj.levels_back);
    copy.genes = obj.genes.clone();
    return copy;
}

我是否在正确的轨道上?非常感谢你的帮助。

3 个答案:

答案 0 :(得分:3)

&符号&指定C ++中的引用。需要提供类似于Java对象提供的“开箱即用”的行为,因为Java通过引用来管理对象。

传递引用时,C ++中没有复制。实际上,避免复制是使用const引用作为函数参数的主要原因。

您显示的代码也不会执行复制:它会根据“已分配”的值更改其状态。在Java中建模的最接近的方法是提供一个assign(Class other)方法,该方法可以更改当前状态以匹配传入的对象的状态:

Class assign(Class other) {
    this.properties = other.properties;
    return this;
}

您将需要使用此方法代替C ++的赋值,如下所示:

Class clOne(args1);
Class clTwo(args2);
clOne = clTwo;      // Using the assignment operator

成为这个:

Class clOne = new Class(args1);
Class clTwo = new Class(args2);
clOne.assign(clTwo); // Using the assignment method instead of the operator

答案 1 :(得分:2)

  

我是否在正确的轨道上?

有点儿。但并不完全。 C ++区分重新分配现有对象和创建新对象。

Java没有。您无法重新分配Java 1 中的现有对象(但 当然可以重新分配引用)。在Java中,为了复制一个对象(而不是分配对它的引用),通常使用复制构造函数:

Class(Class other) {
    // Copy members of `other` into `this`.
}

然后按如下方式使用它:

Class x = new Class(something here);
Class y = new Class(x); // copy

特别是,这是所有Java容器实现的。我依赖clone。首先,clone should only be used if the class implements the tag interface Cloneable。其次,clone’s design is arguably brokenits use is not recommended


1 那么你当然可以重新分配一个对象的成员(除非它们是final),你可以通过提供来模仿C ++的拷贝赋值运算符方法assign来做到这一点。但是,这不是Java中传统的处理方式(虽然它可能在某些特殊情况下有它的位置)。

答案 2 :(得分:2)

你几乎走在正确的轨道上。当直接从一个对象分配(复制)到另一个对象时,使用C ++中的复制赋值运算符。由于Java对象只能通过引用访问,因此这些赋值是没有意义的。为了完全匹配C ++语义,Java等价物将是:

public Class copy(Class obj) {
    row_num = obj.row_num;
    col_num = obj.col_num;
    // etc., etc.
    genes = obj.genes.clone();
    return this;
}