我知道我可以声明析构函数=delete
或private
,以防止程序隐式删除作用域末尾的对象。我也知道如果它是私有的,我可以有一个成员函数,只要我调用它就可以显式调用析构函数:void kill() { this–>~A(); }
我的问题是:
为什么我要阻止隐式破坏?请举例
=delete
会做什么?它能确保析构函数永远不会运行吗?那么该对象将永远存在于其范围之外?
答案 0 :(得分:1)
像私有析构函数这样的习惯用法通常用于阻止其他程序员使用您的类型执行某些操作。特别是私有析构函数会阻止以下内容:
执行上述任何操作都会引发编译错误,这对于解决这个问题并非易事。错误通常是从作者到用户的消息,他们不应该执行这些操作中的一个或全部,而是作者可能希望他们:
考虑编写一个管理硬件接口的类型,允许用户简单地删除实例可能会使硬件处于不良状态 - 那么为什么要允许它呢?是的,在某些时候,API可以构建起来以消除这种困难 - 但在某些基本层面上,“脆弱”的功能需要暴露。
= delete是防止用户错误的“新”防弹方法。与私有拷贝构造函数不同,它不能通过'friend'关键字来规避。它也倾向于更好地阅读,因为它以一致的方式告诉用户该功能不可用。我的理解是,删除是在c ++ 11中引入的,作为“无复制/无删除习语”的替代。