我想知道为什么MemberwiseClone被定义为受保护.这意味着只有派生类型才能访问它.如果将其定义为公共问题,会出现什么问题?
小智 5
其他人已经解释了 MemberwiseClone,但没有人解释为什么它受到保护。我会试着给出理由。
这里的问题是 MemberwiseClone 只是盲目地复制状态。在许多情况下,这是不可取的。例如,对象可能有一个私有字段,它是对列表的引用。一个浅拷贝,比如 MemberwiseClone 所做的,会导致新对象指向同一个列表——并且编写这个类很可能不希望列表与其他人共享。
或者一个对象可以有某种 ID 字段,在构造函数中生成——同样,当你克隆它时,你会得到两个具有相同 ID 的对象,这可能会导致假设 ID 是唯一的方法中的各种奇怪的失败。
或者说你有一个打开套接字或文件流的对象,并存储对它的引用。MemberwiseClone 只会复制引用 - 您可以想象两个对象试图交错调用同一个流的结果不会很好。
简而言之,“克隆”不是针对任意对象的明确定义的操作。在 C++ 中默认为所有类提供 memberwise operator= 的事实更令人讨厌,因为人们经常忘记它在那里,并且不要为复制没有意义的类禁用它,或者是危险的(并且出奇地有很多这样的类)。
对我来说,默认情况下不应将其添加到公共 API 中是显而易见的。