0

我已经在几个地方看到过这样的建议:要么定义你自己的赋值运算符/复制构造函数,要么通过将它们声明为私有来阻止默认值。

但是,我能找到的唯一危险是创建指针副本的问题,这些指针以后可能是悬空指针。

在现代 C++ 中,指针很少见,大多数类只使用智能指针(例如来自 boost 或来自 C++11 中的 std 库)。是否仍然需要为没有原始指针的类声明赋值运算符和复制构造函数?

主要是:不这样做有什么危险?会发生什么样的意外行为?

4

3 回答 3

1

不是没有必要隐藏这些运算符。std::unique_ptr已经是不可复制的(你只能移动它)。和其他类型 -std::shared_ptr将增加内部引用计数,因为它有方法std::weak_ptr所以什么都不做。lock您可以在此处阅读更多信息(Boost 库)

于 2012-11-02T08:52:14.223 回答
0

这在什么是三法则?

在以下网站上也有一个很好的解释:

我可以信任编译器生成的复制构造函数和赋值运算符吗?

编译器生成的代码是您最好的朋友,前提是您遵守良好的 OO 实践并了解规则。如第一部分所述,编译器生成的复制构造函数和赋值运算符执行用户声明的数据成员的成员方式复制。通过将低级数据类型(例如原始指针和字符数组)替换为高级标准库对应的 std::tr1::shared_ptr 和 std::string,您不仅可以消除与手动资源相关的繁重错误管理,您还保证编译器生成的复制构造函数和赋值运算符将做正确的事情。

于 2012-11-06T08:27:20.340 回答
-1

不定义自己的赋值运算符/复制/移动构造函数的危险在于可能出现意外行为。这些操作很容易在您不知情的情况下被调用,从而导致意外行为。在这种情况下,将它们声明为私有将导致编译错误。

另请注意,并非所有地方都使用智能指针。有更多受限环境(例如内核、嵌入式等)通常没有 STL 或 boost。

于 2012-11-02T08:50:50.663 回答