我已经看到构造函数,复制构造函数,析构函数和赋值运算符在典型的单调类中保留在私有(private)范围内。例如

class CMySingleton
{
public:
  static CMySingleton& Instance()
  {
    static CMySingleton singleton;
    return singleton;
  }

private:
  CMySingleton() {}                                  // Private constructor
  ~CMySingleton() {}
  CMySingleton(const CMySingleton&);                 // Prevent copy-construction
  CMySingleton& operator=(const CMySingleton&);      // Prevent assignment
};

现在,我的问题是

为什么我们应该将析构函数和赋值运算符保密
范围?它是强制性的吗?

公共(public)析构函数会破坏单例类的任何属性吗?
因为由于我们的对象构造受到限制,所以没有
意外破坏的机会。

我可以理解,私有(private)分配运算符可以阻止自我
作业,但公共(public)作业运营商是否仍然会造成伤害
比额外的运行时间?

最佳答案

将析构函数设为私有(private)可能会阻止某人尝试在指向单例的指针上调用delete

auto& singleton = CMySingleton::Instance();
auto pointer_to_singleton = &singleton;
delete pointer_to_singleton;  // Bad!

禁用分配运算符可防止无害但毫无意义的自我分配。参见this answer。如果有人这样做,很可能是个错误,因此您最好避免这样做。

10-06 05:14