C++ 为什么不在默认复制构造函数&xFF1F;中实现深度复制;

C++ 为什么不在默认复制构造函数&xFF1F;中实现深度复制;,c++,C++,所有人在使用默认复制构造函数和默认赋值运算符时都会提醒我们,因为它们是卷影复制,所以要小心。但是,我总是困惑为什么在C++中默认缺省复制构造函数和默认赋值操作符不做深拷贝,这样就没有人需要编写自己的复制构造函数实现,以防止发生任何意外? < P> C++实现逐值复制,这意味着它基本上是 x= y;代码>。在许多情况下,这就足够了 然而,在指针的情况下,编译器对所指向的内容一无所知。它将复制指针的值,但不会因此复制基础项。例如,如果您有这样一个类: class Foo { char *data

所有人在使用默认复制构造函数和默认赋值运算符时都会提醒我们,因为它们是卷影复制,所以要小心。但是,我总是困惑为什么在C++中默认缺省复制构造函数和默认赋值操作符不做深拷贝,这样就没有人需要编写自己的复制构造函数实现,以防止发生任何意外?

< P> C++实现逐值复制,这意味着它基本上是<代码> x= y;代码>。在许多情况下,这就足够了

然而,在指针的情况下,编译器对所指向的内容一无所知。它将复制指针的值,但不会因此复制基础项。例如,如果您有这样一个类:

class Foo
{
  char *data;
};
那么编译器应该如何处理
数据
?它不知道它是指向一个
char
还是一个
char
数组。它不知道如何分配内存或如何释放内存。它不知道是应该复制,还是
Foo
的所有实例都应该指向同一个实例


因此,该语言采用了一种完全合理的默认姿态,即只复制指针的值。如果您想要更多,那么您必须自己做,因为只有您完全了解变量的用例。

如果您有容器成员(例如
std::vector
std::map
std::list
,等等),默认行为是深度复制。除非需要浅层复制,否则不要使用原始指针作为成员。如果有一个成员变量是指针,编译器如何知道它指向什么,以及内存有多大?如果编译器不知道这一点,它就不能进行深度复制。它们不是“影子复制”。他们只是复制成员。就这样。如果这不符合你的需要,你需要实现自己的拷贝和赋值。C++没有深层拷贝和浅层。copy@M.M为什么这么说?很好的解释!