如何理解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
具有静态存储持续时间。即:只有一个。它被初始化一次,当您重新输入函数时,您会得到完全相同的实例。
请告诉我为什么下面的单例代码有效?每次调用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
具有静态存储持续时间。即:只有一个。它被初始化一次,当您重新输入函数时,您会得到完全相同的实例。