我将使用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()
请求实例)。懒惰实例化,换句话说。
当程序终止时,仅会被销毁。
在调用instance
之前,将在程序开始时初始化版本2 main()
。只有在程序终止时才会销毁。
首先,我在上述假设中是否正确? 第二,这种初始化行为是否是通用的(比如全局变量和函数)? 最后,我是否应该提醒其他任何细微差别呢?
谢谢!
答案 0 :(得分:3)
你是对的。
您还应该注意到第二个版本不保证何时创建对象,只保证它将在调用main函数之前。
如果单身人士依赖其他单身人士等,这将导致问题
也就是说,第一个版本可以让你更好地控制你的代码,初始化顺序,当然还有更少的错误:)