我正在尝试理解用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;
}
我是否在正确的轨道上?非常感谢你的帮助。
答案 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 broken和its 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;
}