是否应该始终为具有原始指针成员的类中的深度复制指针定义一个复制构造函数?

Jay*_*522 1 c++ copy-constructor

据我所知,理论上,如果一个类有一个原始指针成员,那么默认的复制构造函数将对该指针进行浅表复制,这样当原始对象被销毁时,副本中的指针成员将具有该值它指向的已删除。这似乎意味着,除了我们出于某种原因想要限制复制的情况外,任何具有原始指针成员的类都应该定义一个复制构造函数来对该指针进行深层复制。

我正在使用一个受人尊敬的第三方 API,并且遇到了一个带有原始指针成员的类,但没有定义的复制构造函数,这对我上面的理解产生了怀疑。我错过了什么吗?

更新:第三方告诉我这个类不应该被复制,因为该对象代表一个视觉元素。他们指出他们应该创建一个私有的复制构造函数。

Che*_*Alf 5

我认为std::reference_wrapper它是一个受人尊敬的 API(C++ 标准库)的一部分。它有一个复制构造函数,但不一定在实现代码中显式定义,因为它只是复制原始指针。所以你知道了:拥有指针成员并不总是意味着所有权。

作为一个反例,即您拥有非拥有指针成员但仍需要负责复制的示例,对象可以包含指向其自身一部分的指针。如果复制这样的对象导致其内部指针指向其他对象的一部分,那就不好了。

总而言之,这取决于。您经常需要一个已定义的复制构造函数。但绝对不总是如此。


对于 C++03,三法则(或“三法则”)是一条经验法则,即如果您需要析构函数、复制赋值运算符或复制构造函数,那么您可能需要全部三个。

因此检查是否存在复制赋值运算符或析构函数。在这种情况下,复制构造函数可能是必需的,但却缺失。

在 C++11 及更高版本中,有些人通过包含移动赋值运算符和移动构造函数将其扩展为五法则,而有些人则通过要求所有所有权都应通过智能指针或集合对象来表达来简化为零法则