CPP为什么不创建默认的深拷贝构造函数?

bil*_*ush -1 c++ copy-constructor default-constructor

我不明白为什么他们没有一个复制构造函数,该复制构造函数可以使原始整数倍。

众所周知,默认拷贝构造函数的主要问题是执行浅拷贝。这样,如果有一个指针,它只会复制它的地址,但是为什么不取消引用该指针而复制内容呢?当动态分配内存时会出现主要问题。因此,在有指向它的指针的情况下可以错误地删除它,这就是为什么我们要创建自己的副本构造函数而不使用默认的构造函数的原因。

但是我不明白,为什么CPP不这样做?为什么不复制内容

bol*_*lov 9

众所周知,默认拷贝构造函数的主要问题是执行浅拷贝。

我们不知道。

这就是为什么我们要创建自己的副本构造函数而不使用默认的构造函数。

在C ++中,几乎应该永远不要编写自己的副本构造函数(零规则)。

当动态分配内存时会出现主要问题。这样一来,当有人指向它时,它可能会错误地删除它

这不是问题。为什么?因为在C ++中,我们使用RAII的概念,并且在标准库中有工具可以解决您看到的所有问题。在C ++中,您永远不必写显式的东西new,也永远不要拥有所有者的原始指针。使用标准容器(例如std::vector)和智能指针(例如std::unique_ptr)。

我不明白为什么他们没有一个复制构造函数,该复制构造函数可以使原始整数倍

因为编译器不知道对象的复制语义应该是什么。只有全班作家才知道。您不知道指针的语义是什么。是唯一拥有内存资源的指针吗?如果是这样,是它与收购mallocnewnew[],或别的东西?它是否共享其对内存的所有权?还是只是指向它不拥有的对象?由于您不能从类的声明/定义中了解任何信息,因此编译器根本无法使用原始指针自动实现“深层复制”。

除了。默认情况下,它确实实现了深拷贝,或默认情况下实现了浅拷贝,或它们的组合。而且这样做正确。还记得我告诉过您不要将原始指针用于所有权吗?使用适当的抽象(容器,智能指针),默认的复制ctor将完全执行其所需的操作。

  • @bilanush 另外,网上有很多关于 C++ 的糟糕和非常糟糕的建议。要非常警惕。使用一本教授现代 C++ 的好书。您永远不应该手动管理动态分配的内存(除非您正在编写库) (2认同)