我已经看到构造函数,复制构造函数,析构函数和赋值运算符在典型的单调类中保留在私有(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。如果有人这样做,很可能是个错误,因此您最好避免这样做。