当使用默认复制构造函数和默认赋值运算符时,所有人都会一直提醒我们,因为它们是阴影副本所以要小心。但是,我总是很困惑,为什么不在默认的拷贝构造函数和c ++中的默认赋值运算符中进行深层复制,这样就没有人需要编写自己的拷贝构造函数实现来防止任何意外?
答案 0 :(得分:9)
C ++实现按值复制,这意味着它基本上是x = y;
。在许多情况下,这就足够了。
但是,在指针的情况下,编译器对所指向的内容一无所知。它将复制指针的值,但不会因此而复制基础项。例如,如果您有这样的课程:
class Foo
{
char *data;
};
那么编译器应该对data
做些什么呢?它不知道它是指向单个char
还是指向char
的数组。它对于如何分配内存或如何释放内存并不了解。它不知道它是否应该复制,或者Foo
的所有实例都应该指向同一个实例。
因此,语言采用完全合理的默认姿态,即只复制指针的值。如果你想要更多的东西,你必须自己做,因为只有你完全理解变量的用例。