gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:15:11 25 4
gpt4 key购买 nike

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

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

更新:第三方通知我该类不能被复制,因为该对象代表一个视觉元素。他们指出,他们应该制作一个私有(private)的复制构造函数。

最佳答案

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

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

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


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

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

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

关于c++ - 是否应该始终为具有原始指针成员的类中的深度复制指针定义一个复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28934139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com