如何理解c++中的单例?

How to understand Singleton in c++?

请告诉我为什么下面的单例代码有效?每次调用Singleton::instance()时都会创建一个INSTANCE,那么下面的代码是不是应该创建两个INSTANCE呢?

#include <bits/stdc++.h>

using namespace std;

class Singleton
{
    private:
       Singleton() = default;

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

int main()
{
    Singleton &s1 = Singleton::instance();
    Singleton &s2 = Singleton::instance();

    return 0;
}

Every time When Singleton::instance() is called, an INSTANCE will be created, so are two INSTANCE supposed to be created in the following code?

没有。只创建了一个实例。

each time when expression static Singleton INSTANCE; executed. Isn't different INSTANCE created?

没有

I know what static means

显然,你不知道你自以为知道。

你可以逐行查看:

1. 
Singleton &s1 = Singleton::instance();

你在此处调用静态方法 instance(),在该方法中你会看到行

 static Singleton INSTANCE;

这里的诀窍是理解在方法内部声明为静态的变量只会声明一次,无论之后调用该方法多少次。所以它创建了 Singleton 的实例并且它得到 returned

 2.
Singleton &s2 = Singleton::instance();

第二次调用实际上会跳过 INSTANCE 的声明,并且会立即return。

为了更清楚,您可以在构造函数中放置一些有意义的消息

类似

std::cout << "Contructor called!" << std::endl;

如果您仅出于测试目的使用静态变量作为计数器,那就更好了。

您应该阅读 static 关键字。它可以有不同的含义,这里有两个:

   static Singleton& instance()
   // ^ ---------------------------- (1)
   {
      static Singleton INSTANCE;
      // ^ ------------------------- (2)
      return INSTANCE;
   }

第一个 static 将方法 instance 声明为“class-方法”(或简称为“静态方法”)。您可以在没有实例的情况下调用该方法。

第二个 static 声明 INSTANCE 具有静态存储持续时间。即:只有一个。它被初始化一次,当您重新输入函数时,您会得到完全相同的实例。