关于类的静态成员。 在 C++ 中,静态成员不属于类的任何一个对象,所以它们并不是在创建类的对象时被定义的,它们不是由类的构造函数初始化的。一般来说不能在类的内部初始化静态成员,必须在类的外部定义和初始化每个静态成员,类似于全局变量。静态成员定义在任何函数之外,一旦被定义,将一直存在于成员的整个生命周期中。 我们可以利用这个特性来写单例模式。
这种方法更加简洁,并且也是线程安全的,因为除了函数里面的静态变量,其他的静态变量都是在 main 函数之前就创建好了,单线程创建的,参考 Stack Overflow 上的一个回答。
在 C# 中可以直接在类内初始化。
1 2 3 4 5 6 7 8 9 10
public sealed class Singleton { private Singleton(){} private static Singleton instance = new Singleton(); public static Singleton getInstance { get { return instance; } } }
这种方法比上一种二重锁的方法性能要更好。 在 C# 中还有更好的方法。
1 2 3 4 5 6 7 8 9 10 11 12
public sealed class Singleton { Singleton(){} public static Singleton getInstance{ get { return Nested.instance; } } Class Nested{ static Nested(){} internal static readonly Singleton instance = new Singleton(); } }
嵌套类,当用到 Nested 类的时候才会调用构造方法创建 instance。 由于无法实现类内初始化 instance,所以这种方法我还不知道 C++ 怎么实现。 以上方法都是参考自《剑指 Offer》。