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