【问题标题】:Static variable initialization as a class member or local function variable (Singleton example)静态变量初始化为类成员或局部函数变量(单例示例)
【发布时间】:2015-04-22 13:48:07
【问题描述】:

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

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() 请求实例)。换句话说,惰性实例化。 它将在程序终止时被销毁。

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

首先,我的上述假设是否正确?
其次,这种初始化行为是否普遍(比如全局变量和函数)?
最后,在这方面我还有什么需要注意的细微差别吗?

谢谢!

【问题讨论】:

    标签: c++ static initialization singleton


    【解决方案1】:

    你是对的。

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

    如果该单例依赖于其他单例等,这将导致问题

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多