For faster navigation, this Iframe is preloading the Wikiwand page for 克隆 (编程学).

克隆 (编程学)

此条目需要补充更多来源。 (2020年4月4日)请协助补充多方面可靠来源改善这篇条目无法查证的内容可能会因为异议提出而被移除。致使用者:请搜索一下条目的标题(来源搜索:"克隆 (编程)"网页新闻书籍学术图像),以检查网络上是否存在该主题的更多可靠来源(判定指引)。

电脑科学中,“克隆”指对一个对象制作一个完全相同的副本,其常常在基于原型编程中的编程范型或者面向对象程式设计(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)部分
{{bottomLinkPreText}} {{bottomLinkText}}
克隆 (编程学)
Listen to this article

This browser is not supported by Wikiwand :(
Wikiwand requires a browser with modern capabilities in order to provide you with the best reading experience.
Please download and use one of the following browsers:

This article was just edited, click to reload
This article has been deleted on Wikipedia (Why?)

Back to homepage

Please click Add in the dialog above
Please click Allow in the top-left corner,
then click Install Now in the dialog
Please click Open in the download dialog,
then click Install
Please click the "Downloads" icon in the Safari toolbar, open the first download in the list,
then click Install
{{::$root.activation.text}}

Install Wikiwand

Install on Chrome Install on Firefox
Don't forget to rate us

Tell your friends about Wikiwand!

Gmail Facebook Twitter Link

Enjoying Wikiwand?

Tell your friends and spread the love:
Share on Gmail Share on Facebook Share on Twitter Share on Buffer

Our magic isn't perfect

You can help our automatic cover photo selection by reporting an unsuitable photo.

This photo is visually disturbing This photo is not a good choice

Thank you for helping!


Your input will affect cover photo selection, along with input from other users.

X

Get ready for Wikiwand 2.0 🎉! the new version arrives on September 1st! Don't want to wait?