複製 (程式設計)

計算機科學中,「克隆」指對一個對象製作一個完全相同的副本,其常常在基於原型編程中的編程范型或者面向對象程序設計(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)部分