我将使用单例模式来演示我的问题,但这是一个更广泛的问题。请不要让我听“单例是邪恶的”讲座。
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/