複製 (程式設計)

電腦科學中,「複製」指對一個對象製作一個完全相同的副本,其常常在基於原型編程中的程式設計範式或者物件導向程式設計(OOP)中用到。

淺拷貝

在大多數程式語言中(但除了:Ruby等一些語言),例如doublefloatintlong等一些原始型別僅僅將它們的值儲存於電腦主記憶體中的某處(通常為呼叫棧中)。給它進行一次簡單賦值,你可以將變數的內容複製到另外一個變數中:

在Java或C++中進行基本類型的複製:

int original = 42;
int copy = 0;

copy = original;

許多OOP程式語言(包括JavaD語言ECMAScriptC♯)利用對象參照。對象參照與其他語言中的指標類似,其使得對象可以被指標所傳遞而完整的對象不被複製。

以下是在Java語言中的範例,當使用簡單賦值「拷貝」一個對象時:

Object original = new Object();
Object copy = null;

copy = original; // 不复制对象仅仅复制其引用

這段代碼並沒有複製對象,變數「original」與「copy」實際上指向相同的對象。在C++中,以下是相同效果代碼:

Object* original = new Object();
Object* copy = NULL;
copy = original;

這段代碼指明複製對象的是一個「指標」,而非對象本身。

複製過程

製造與對象相同的一個副本而非僅僅製造它的參照的過程被稱為複製。在大多數程式語言中,程式語言和庫可以便利一些複製的過程。在Java語言中,Object類包含了clone()方法英語Clone (Java method),此方法僅僅複製對象並返回一個指向被複製對象的參照。由於此方法位於Object類中,程式設計師得以在所有定義於Java的類別中使用複製方法(雖然為了正常使用,其需要根據其應用於不同的層級進行覆寫)。

在Java語言中進行對象的複製:

Object originalObj = new Object();
Object copyObj = null;

copyObj = originalObj.clone(); // 复制对象并分配一个指向“copyObj”的引用

一般而言,C++中的對象像基本類型一樣執行,所以複製一個C++對象可以使用「=」(分配)設定運算子。C++語言中所有的類中存在一個預設的設定運算子,但其效果可能被運算子多載所影響。使用此方法時可能存在危險(參見對象切片英語Object slicing)。防止對象切片的方法的方法之一是使用與Java所有的類中的clone()方法來實現,並使用指標(請注意C++中不存在內建的clone()方法)。

C++中對象複製的範例:

Object originalObj;
Object copyObj(originalObj); // 创建名为copyObj的originalObj拷贝

C++中使用指標進行對象複製的範例(防止對象切片請參見[1]):

Object* originalObj = new Object;
Object* copyObj = nullptr;

copyObj = new Object(*originalObj); // 创建originalObj的拷贝并将其地址分配给copyObj

參考文獻

  1. ^ 參見en.allexperts.com頁面存檔備份,存於互聯網檔案館)的問答(Q&A)部分