C++的单例模式为什么不直接全部使用static,而是非要实例化一个对象?

开场

前段时间我在知乎回答了这样一个问题:

为什么C++单例模式不能直接全部使用 static变量和 static函数呢?如果全部使用 static的话,是不是也不会有多线程的问题了?而且“类型::方法”的访问方式比起先getInstance()再访问难道不是更加简单清晰吗? (还是说是为了附和 “单例” 这样一个字面上的意思)

//大概这个样子
class Singleton {
public:
 static void on() {Singleton::isOn = true;}
 static void off() {Singleton::isOn = false;}
 static bool state() {return Singleton::isOn;}
private:
 static bool isOn;
};

这可能是很多C++学习者都会有的疑惑,下面是我的回答。

正文

通过getInstance()函数获取单例对象,这种模式的关键之处不是在于强迫你用函数获取对象。关键之处是让static对象定义在函数内部,变成局部static变量。看下这种实现方式的经典demo:

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton inst;
        return inst;
    }
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

    // 其他数据函数
    // ...

private:
    Singleton() { ... }
    // 其他数据成员
    // ...
};

学名是:Meyers' Singleton。没错,也就是说这是Scott Meyers最早提出来的C++单例模式的推荐写法。

《Effective C++》系列丛书作者

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...