簡體   English   中英

Java相當於C ++拷貝賦值運算符

[英]Java equivalent of C++ copy assignment operator

我試圖理解用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;
}

我在正確的軌道上嗎? 非常感謝您的幫助。

Ampersand &用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

我在正確的軌道上嗎?

的種類。 但並不完全。 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 首先, 只有在類實現標記接口Cloneable時才應使用clone 其次, clone的設計可以說是破壞了不建議使用它


1當然,您可以重新分配對象的成員(除非它們是final ),並且您可以通過提供方法assign來模仿C ++的復制賦值運算符。 但是,這不是Java中常規的處理方式(盡管它可能在某些特殊情況下有它的位置)。

你幾乎走在正確的軌道上。 當直接從一個對象分配(復制)到另一個對象時,使用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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM