【发布时间】:2014-07-17 10:33:48
【问题描述】:
我记得在 Java 中看到过一些 clone() 用法,现在我在一些 C++ 代码中注意到了它。我也在 StackExchange 上注意到它们:
Copying a Polymorphic object in C++
那么,拥有克隆方法是一个“好主意”吗?还是复制构造函数就足够了?
【问题讨论】:
-
只想要浅拷贝和深拷贝之间可能存在语义差异,在这种情况下,克隆将是对深拷贝所有内容的显式调用,因此它是不同的副本而不是“引用” ' 到共享对象,具体取决于您如何实现赋值运算符和复制构造函数
-
带有垃圾收集器的语言对复制对象的需求要少得多。例如,它们可以安全地存储指向集合中对象的指针,而不必担心所有权和确定性清理。所以他们没有任何类似于copy ctor的东西。因此,如果程序员想要提供复制语义,那么他必须编写一个显式方法来生成副本。通常称为 clone()。
-
@einpoklum 不,复制构造函数被假定为用户代码的深层复制。
-
我看到有些人不允许赋值和复制构造函数,因此你必须调用
clone来获取对象的副本,但这实际上取决于你想要定义和遵守的合同跨度> -
多态性的问题是你不知道在编译时被复制的确切类型,这是复制构造函数所需要的。因此,一个克隆方法,为了安全起见,可能带有禁用的复制构造函数。查找:对象切片。
标签: c++ clone copy-constructor idioms