我已经在几个地方看到了建议你定义你自己的赋值运算符/复制构造函数,或者通过声明它们是私有的来阻止默认值。
但是,我能找到的唯一危险就是创建指针副本的问题,这些指针可能会在以后悬挂指针。
在现代C ++中,指针很少见,大多数类只使用智能指针(例如来自boost或来自C ++ 11中的std库)。是否仍然需要为没有原始指针的类声明赋值运算符和复制构造函数?
主要是:不这样做会有什么危险?可能会发生什么样的意外行为?
答案 0 :(得分:1)
不是没有必要隐藏这些运营商。 std::unique_ptr
已经是不可复制的(你只能移动它)。其他类型 - std::shared_ptr
将增加内部引用计数,std::weak_ptr
将不执行任何操作,因为它具有lock
方法。您可以阅读更多here (Boost libs)
答案 1 :(得分:0)
以下网站也有很好的解释:
Can I trust the Compiler-Generated Copy Constructor and Assignment Operator?
编译器生成的代码是你最好的朋友,只要这样 你坚持良好的风格OO实践并了解规则。如上所述 在第一部分中,编译器生成的复制构造函数和赋值 运算符执行成员方式复制用户声明的数据成员。通过 替换低级数据类型 - 原始指针和char数组 实例 - 与他们的高级标准库对应物 std :: tr1 :: shared_ptr和std :: string,不仅消除了 与手动资源管理相关的繁重错误,你也是 保证编译器生成的拷贝构造函数和 赋值运算符将做正确的事。
答案 2 :(得分:-1)
未定义自己的赋值运算符/复制/移动构造函数的危险是出现意外行为的可能性。在您没有意识到这些操作的情况下很容易调用这些操作,从而导致意外行为。将它们声明为私有将在这种情况下导致编译错误。
另请注意,并非所有智能指针都使用。有更多受限制的环境(例如内核,嵌入式等)通常不会有STL或提升。