【问题标题】:Java equivalent of C++ copy assignment operatorJava 等价于 C++ 复制赋值运算符
【发布时间】:2013-10-26 01:30:18
【问题描述】:

我正在尝试理解这个用 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;
}

我在正确的轨道上吗?非常感谢您的帮助。

【问题讨论】:

    标签: java c++ operator-keyword


    【解决方案1】:

    我在正确的轨道上吗?

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

    Java 没有。您不能重新分配给 Java1 中的现有对象(但您当然可以重新分配引用)。在 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】:

      您几乎走在正确的轨道上。 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;
      }
      

      【讨论】:

        【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-16
          • 1970-01-01
          • 1970-01-01
          • 2017-11-21
          • 2015-08-04
          • 2020-11-18
          • 1970-01-01
          相关资源
          最近更新 更多