计算机科学中,“克隆”指对一个对象制作一个完全相同的副本,其常常在基于原型编程中的编程范型或者面向对象程序设计(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)部分