我在几个地方都看到了定义您自己的作业操作员/复制构造函数或通过私有声明默认操作员的建议。
但是,我唯一能够找到的危险是创建可能以后将指针的指针副本的问题。
在现代的C 指针中很少见,大多数班级都使用智能指针(例如,从Boost或C 11中的STD库中使用)。是否仍然需要声明没有原始指针的类分配运算符和复制构造函数?
主要是:不这样做有什么危险?可能会发生什么样的意外行为?
不是隐藏那些操作员。std::unique_ptr
已经不可复制(您只能移动它)。和其他种类-std::shared_ptr
将增加内部ref计数,std::weak_ptr
将无需执行lock
方法,因此无能为力。您可以在此处阅读更多(Boost Libs)
这在问题中解释了三个规则是什么?
在以下网站上也有一个很好的解释:
我可以信任编译器生成的复制构造函数和作业操作员吗?
编译器生成的代码是您最好的朋友,只要 您坚持良好的练习并知道规则。如解释 在第一部分中,编译器生成的复制构造函数和作业 操作员执行用户指定数据成员的会员复制。经过 替换低级数据类型 - 原始指针和字符阵列 实例 - 与他们的高级标准库同行 STD :: TR1 :: shared_ptr和std :: String,不仅消除了 与手动资源管理相关的繁重错误,您也 确保编译器生成的复制构造函数和 分配操作员将做正确的事情。
没有定义自己的作业操作员/复制/移动构造器的危险是意外行为的可能性。这些操作很容易调用,而无需您意识到这一点,从而导致了意外的行为。在这种情况下,将其宣布为私人将导致汇编错误。
还要注意,并非到处都使用智能指针。通常不会有STL或Boost的受限制环境(例如内核,嵌入式等)。