2017-03-09 151 views
0
public class Program { 
    IntegSet i1, i2, i3, i4; 
    i1 = new IntegSet(); 
    i2 = new IntegSet(1,2,5); 
    i3 = new IntegSet(); 
    i4 = new IntegSet(i2); 
} 

我的計劃的目的是使整臺。Java的拷貝構造函數

public class IntegSet{ 
    private final int MAXALLOWEDSETVALUE=2000; 
    private boolean [] data = new boolean[MAXALLOWEDSETVALUE+1]; 

我有這樣的第一個功能,我認爲這是好的。

public IntegSet(int... elts) { 
    int index = 0; 
    for(int iteration = 0; iteration < elts.length; iteration++) { 
     index = elts[iteration]; 
     data[index] = true; 
    } 
} 

但對於此功能

public IntegSet(IntegSet source){ 
    this.data = source.data; 
} 

這是一個拷貝構造函數?我對這是如何工作有點困惑。而從這個函數的區別:

public void setTo(IntegSet source){} 

在那裏我應該用這個稱呼它:

i3.setTo(i3.subtract(i1)) 

謝謝

+3

如果'data'可以修改,你需要'Arrays.copyOf(數據,data.length)'取而代之的是'data'只是一個參考,如果原來的'IntSet'改變了,那麼新的也是。另外,我認爲你的原始構造函數是錯誤的。如果我將'{1,3,5}'傳遞給你的構造函數,你的'IntSet'會設置ints {0,1,2},因爲你從'0'循環到'elts.length'。 – Moira

+1

或簡單地'this.data = source.data.clone()'。 – Andreas

+0

好吧,我編輯了我原來的構造函數。你也可以解釋一下我應該使用Arrays.copyof(data,data.length)還是clone()?我知道我需要有兩個函數setTo(IntegSet源)和複製構造函數。複製構造函數是否正確?如果是這樣,複製構造函數和setTo有什麼區別?謝謝 – Coder117

回答

1

拷貝構造函數是一個對象,允許你構造製作一個現有對象的副本。

我想你可能在原來的問題一個錯字,但我猜你是問:

public IntegSet(IntegSet source){ 
    this.data = source.data; 
} 

是拷貝構造函數。

拷貝構造函數和 公共無效setTo(INTSET源)之間的差異{}

是您setTo功能其實並沒有對你的源輸入參數任何東西。它根本不創建新的對象。它甚至不會將引用分配給調用對象。

I3 = I1;

這將設置I1等於I3的參考的參考。 到i3的數據所做的任何更改現在會影響I1也,反之亦然。

I3 =新IntegSet(I1);

這將產生使用拷貝構造i1的副本,並允許在每個對象(I1和I3)的數據成員的改變無關。

在拷貝構造函數的內部代碼應該使用數組克隆功能,如:

this.data = source.data.clone(); 
+0

謝謝,我還沒有真正編碼我的setTo函數。如果我想要它與i3.setTo(i3。減(i1))我怎麼能開始編碼? – Coder117

+0

setTo函數可以實現等效於複製構造函數。 public void setTo(IntegSet source){this.data = source.data.clone(); }在沒有getter的情況下訪問「data」實例成員是不好的做法(因爲您將「data」設置爲private),所以您可能希望實現返回類型爲boolean [] – user681574

+0

的「getData」函數謝謝你,他們都是一樣的,但我需要2個不同的功能,因爲這兩個表達是不同的? 'i3.setTo(i3.subtract(i1))vs'i4 = new IntegSet(i2);' – Coder117