一个对象只需要复制它需要复制的内容。虽然这个问题被标记为语言无关,而且你提到了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
只是一个数字。只需复制它,没有其他需要担心的问题 :)
总之,直接回答您的问题:
1. 99% 的情况下,不需要。只有一种合理的复制方式。但这种方式会有所变化。
2. 不直接。记录它是一个好主意,但任何内部内容都应该保持内部。
3. 只需使用“深复制”。你几乎永远不应该尝试克隆你无法控制的对象或指针,所以它不适用于规则 :)