为什么不在默认的复制构造函数中实现深层复制?

guo*_*guo 4 c++

当使用默认复制构造函数和默认赋值运算符时,所有人都会一直提醒我们,因为它们是卷影副本所以要小心.但是,我总是很困惑,为什么不在默认的拷贝构造函数和c ++中的默认赋值运算符中进行深层复制,这样就不需要编写自己的拷贝构造函数实现来防止任何意外?

Sea*_*ean 10

C++实现了按值复制,这​​意味着它基本上可以x = y;.在许多情况下,这就足够了.

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

class Foo
{
  char *data;
};
Run Code Online (Sandbox Code Playgroud)

然后编译器应该怎么做data?它不知道它是指向单个char还是数组char.它不知道如何分配内存或如何释放内存.它不知道它是否应该复制,或者是否所有实例Foo都指向同一个实例.

因此,语言采用完全合理的默认姿态,即只复制指针的值.如果你想要更多的东西,你必须自己做,因为只有你完全理解变量的用例.