类设计-在C++类中显式启用/禁用复制的指导
class design - Guidance for when to explicitly enable/disable copying in C++ classes?
一位同事正在清理几个库。在这样做的过程中,他一直在阅读API C++设计,其中谈到了在C++类中显式启用或禁用复制。这与Sutter和Alexandrescu在C++编码标准中所说的相同。
他同意人们应该遵循这一建议,但这两本书似乎都没有说明什么是指导原则,可以决定何时启用或禁用。
有这样或那样的指导吗?谢谢
这取决于类在应用程序中扮演的角色。除非类表示一个值,在身份不重要的情况下,应该禁止复制和分配。类似地,如果类是多态的。作为一般来说,如果您正在分配类类型的对象动态地,它不应该是可复制的。反过来,如果类可复制的,不应该动态分配它的实例。(但是也有一些例外,动态分配和避免复制大对象,即使语义上有相反的争论。)
如果您正在设计一个低级库,那么选择就不那么明确了。像std::vector
这样的东西可以在应用程序中扮演许多角色;在里面大多数情况下,复制是不合适的,但禁止复制会在少数合适的地方使其无法使用。
与DeadMG相反,我认为大多数类应该是不可复制的。
以下是斯特劳斯特鲁普在《C++的设计与进化》一书中所写的内容:
"我个人认为复制操作是默认定义的,这很不幸,我禁止复制我的许多类的对象"
我认为你应该尽量少写代码,让类做它应该做的事情。如果没有人试图复制类,而且它在不久的将来不会被复制,那么不要添加复制构造函数或赋值运算符之类的东西。只需使该类不可复制即可。
当有一天你真的想复制类时,添加一些东西,比如复制构造函数。但在此之前,类不可复制意味着要测试和维护的代码更少。
我真诚地认为复制语义应该自动提供,或者根本不提供。
然而,写得不好的库有时可能会从手动复制构造函数中受益。
请注意,C++中的情况与C++中的非常不同(因为标准库通常需要复制语义!),我的建议几乎总是适用于C++0x。
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 编译时未启用intel oneApi CUDA支持
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 复制几乎为空的数组的最快方法
- 以下示例中如何避免代码复制?C++/库达
- OpenGL在启用深度测试时不会丢弃我的碎片
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- QStyledItemDelegate 和 QStandardItem 阻止更改文本,仅启用选择和复制
- 如何为显式重载构造函数启用复制初始化
- 启用基于类模板形参的构造函数时,是否总是需要复制该类模板形参?
- 类设计-在C++类中显式启用/禁用复制的指导