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

问题描述 投票:0回答:1

我不明白为什么他们没有一个复制构造函数,该复制构造函数是原始副本的真正倍数。

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

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

c++ copy-constructor default-constructor
1个回答
2
投票

我们知道默认副本构造函数的主要问题是,它执行浅表副本。

我们不知道。

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

在C ++中,几乎应该永远不要编写自己的副本构造函数(the rule of zero)。

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

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

我不明白为什么他们没有一个复制构造函数,该复制构造函数是原始副本的真正倍数

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

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

© www.soinside.com 2019 - 2024. All rights reserved.