静态变量初始化作为类成员或本地函数变量(Singleton示例)

时间:2015-04-22 13:48:08

标签: c++ static initialization singleton

我将使用Singleton模式演示我的问题,但这是一个更广泛的问题。请饶恕“单身是邪恶的”讲座。

Singleton的第1版

class Singleton
{
  public:
    static Singleton& getInstance()
    {
      static Singleton instance; // This becomes a class member in Ver.2
      return instance;
    }

  private:
    // Constructor, forbid copy and assign operations etc...
}

Singleton的第2版

class Singleton
{
  public:
    static Singleton& getInstance()
    {
      return instance;
    }

  private:
    static Singleton instance; // I'm here now!

    // Constructor, forbid copy and assign operations etc...
}

我现在将解释我认为两者之间的区别:

版本1 instance只有在程序流程达到instance的实际定义时才会被初始化(即程序的某些部分使用Singleton::getInstace()请求实例)。懒惰实例化,换句话说。 当程序终止时,会被销毁。

在调用instance之前,将在程序开始时初始化版本2 main()。只有在程序终止时才会销毁。

首先,我在上述假设中是否正确? 第二,这种初始化行为是否是通用的(比如全局变量和函数)? 最后,我是否应该提醒其他任何细微差别呢?

谢谢!

1 个答案:

答案 0 :(得分:3)

你是对的。

您还应该注意到第二个版本不保证何时创建对象,只保证它将在调用main函数之前。

如果单身人士依赖其他单身人士等,这将导致问题

也就是说,第一个版本可以让你更好地控制你的代码,初始化顺序,当然还有更少的错误:​​)