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

时间:2016-06-05 09:50:38

标签: c++

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

1 个答案:

答案 0 :(得分:9)

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

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

class Foo
{
  char *data;
};

那么编译器应该对data做些什么呢?它不知道它是指向单个char还是指向char的数组。它对于如何分配内存或如何释放内存并不了解。它不知道它是否应该复制,或者Foo的所有实例都应该指向同一个实例。

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