【发布时间】:2013-10-07 21:12:22
【问题描述】:
我试图理解单例对象和静态类之间的区别
我在各处看到的最简单的信息是静态类不创建实例,而单例则需要
但是为什么我可以从静态类中获得静态构造函数呢?这意味着什么?它不创建一个实例吗?
如果你在静态类构造函数上运行带有断点的简单代码,你会看到它到达它
我很困惑,有人吗?
【问题讨论】:
-
非静态类也可以有静态构造函数。重点是它只运行一次,你不知道何时或如何。
我试图理解单例对象和静态类之间的区别
我在各处看到的最简单的信息是静态类不创建实例,而单例则需要
但是为什么我可以从静态类中获得静态构造函数呢?这意味着什么?它不创建一个实例吗?
如果你在静态类构造函数上运行带有断点的简单代码,你会看到它到达它
我很困惑,有人吗?
【问题讨论】:
但是为什么我可以从静态类中获得静态构造函数呢?这意味着什么?它不创建一个实例吗?
没有。静态构造函数允许您初始化类的 static 成员(基本上,该类的静态状态)。
对于单例模式,静态构造函数(或静态内联初始化程序)通常会创建一个实例,但该实例仍是通过普通的非静态构造函数创建的。然后将其存储在一个静态变量(单个“实例”变量)中。
延迟初始化的单例会避免这种情况,并按需初始化静态变量。
static class 是另一回事 - 静态类永远不会作为单例工作,因为您无法创建静态类的实例。静态类专门用于您永远不会创建实例的情况。
单例将(通常)通过非静态类创建,但使用私有构造函数(因此只能在该类中创建实例)。将有一个静态属性用于检索该类的单个实例。类实例可以按需创建,也可以在静态构造函数中创建。
【讨论】:
静态构造函数只是一个可以初始化静态成员变量的地方。您不需要静态构造函数 - 您可以内联初始化静态成员变量,但我认为将它们放在静态构造函数中更整洁。
请记住,即使您不实例化静态类,您会实例化它的静态成员,而且有一个地方可以这样做是件好事。这是对您必须在 C++ 中执行此操作的方式的改进。
请注意,您的类不需要是静态的才能拥有静态构造函数。您可以拥有一个同时提供普通构造函数和静态构造函数的非静态类。同样的规则也适用。
【讨论】: