1、对于特定类类型的全体对象而言,访问一个全局对象有时是必要的。也许,在程序的任意点需要统计已创建的特定类类型对象的数量;或者,全局对象可能是指向类的错误处理例程的一个指针。然而,全局对象会破坏封装:对象需要支持特定类抽象的实现。如果对象是全局的,一般的用户代码就可以修改这个值。类可以定义类静态成员,而不是定义一个可普遍访问的全局对象。通常,非 static 数据成员存在于类类型的每个对象中。不像普通的数据成员,static 数据成员独立于该类的任意对象而存在;每个static 数据成员是与类关联的对象,并不与该类的对象相关联。
2、使用 static 成员而不是全局对象有三个优点。 (1). static 成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突。(2). 可以实施封装。static 成员可以是私有成员,而全局对象不可以。(3). 通过阅读程序容易看出 static 成员是与特定类关联的。这种可见性可清晰地显示程序员的意图。
3、static 成员是类的组成部分但不是任何对象的组成部分,因此,static 成员函数没有 this 指针。通过使用非 static 成员显式或隐式地引用 this 是一个编译时错误。
因为 static 成员不是任何对象的组成部分,所以 static 成员函数不能被声明为 const。毕竟,将成员函数声明为 const 就是承诺不会修改该函数所属的对象。
4、static 数据成员必须在类定义体的外部定义(正好一次)。不像普通数据成员, static 成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。定义 static 数据成员的方式与定义其他类成员和变量的方式相同:先指定类型名,接着是成员的完全限定名。定义时不能标示为 static。
5、const static成员可以在类体内初始化,但仍需要在类外定义。
6、static数据成员可以用作默认实参,非 static 数据成员不能用作默认实参,因为它的值不能独立于所属的对象而使用。使用非 static 数据成员作默认实参,将无法提供对象以获取该成员的值,因而是错误的。