一个对象只需要复制它需要复制的东西。尽管这个问题被标记为与语言无关,并且您提到了 C++,但我更喜欢用 C# 术语来解释(因为这是我最熟悉的)。但是,概念是相似的。
值类型就像结构。它们直接存在于对象实例中。因此,当你复制对象时,你别无选择,只能复制值类型。因此,您通常不必担心这些。
引用类型就像指针,这就是它变得棘手的地方。根据引用类型的不同,您可能需要也可能不需要深拷贝。一般的经验法则是,如果引用类型(作为对象的成员)依赖于外部对象的状态,则应该克隆它。如果不是,也永远不会,它不必是。
另一种思考方式是,从外部传入您的对象的对象可能不应该被克隆。您的班级生成的对象应该是。
好吧,我撒谎了,我将使用一些 C++,因为它最能解释我的意思。
class MyClass {
int foo;
char * bar;
char * baz;
public: MyClass(int f, char * str) {
this->foo = f;
bar = new char[f];
this->baz = str;
}
};
有了这个对象,就有两个字符串缓冲区需要处理。第一个,bar
,由类本身创建和管理。当你克隆对象时,你应该分配一个新的缓冲区。
baz
,另一方面,不应该。事实上,你不能,因为你没有足够的信息来这样做。应该只复制指针。
当然,foo
这只是一个数字。复制它,没有什么可担心的:)
总之,直接回答您的问题:
- 99%的时候,没有。只有一种复制方法是有意义的。然而,这种方式各不相同。
- 不是直接的。记录它是一个好主意,但任何内部的东西都应该保留在内部。
- 只是“深拷贝”。您应该(编辑:几乎)永远不要尝试克隆您无法控制的对象或指针,因此可以免除规则:)