c++ - 静态变量初始化为类成员或局部函数变量(单例示例)

标签 c++ static initialization 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())。换句话说,就是惰性实例化。 它会在程序终止时被销毁。

版本 2 instance 将在程序启动时、调用 main() 之前进行初始化。仅当程序终止时才会被销毁。

首先,我的上述假设正确吗?
其次,这种初始化行为是否通用(例如全局变量和函数)?
最后,我还应该注意与此相关的任何其他细微差别吗?

谢谢!

最佳答案

你是对的。

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

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

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

关于c++ - 静态变量初始化为类成员或局部函数变量(单例示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29799619/

相关文章:

c++将二维数组作为参数传递给函数?

java - 静态初始化器?

c# - 为什么使用 as 关键字初始化对象

swift - 我的主视图 Controller 是通过观察何时发布通知并被多次调用来加载的

ruby-on-rails - 如何/何时/在哪里扩展 Rails 3 中的 Gem 类(通过 class_eval 和模块)?

c++ - 在 C++ 中生成组合列表的最简单方法是什么?

c++ - OpenCV 3.1.0 无法使用 CMake 进行编译

c++ - QtPlugins 实现多个接口(interface)并转换为通用接口(interface)

javascript - 是否可以使用公用文件夹中的 create-react-app 提供静态文件?

c++ - 静态常量变量的初始化