定义类的静态数据成员:既可以在类的内部也可以在类的外部定义静态成员函数。当在类的外部定义静态数据成员时,不能重复static关键字,该关键字只出现在类的内部的声明语句中。
静态数据成员不属于类的任何一个对象,所以它们并不是在创建类的对象时被定义的,这意味着它们不是由类的构造函数初始化的。一般来说不能在类的内部来初始化静态数据成员。必须在类的外部定义和初始化每个静态数据成员,一个静态数据成员只能定义一次。
类的静态数据成员可以像成员函数一样访问类的私有成员。
静态成员的类的初始化:通常情况下,类的静态数据成员不应该在类的内部初始化。可以为静态数据成员提供const整数类型的类内初始值,要求静态数据成员必须是字面值常量类型的constexpr.初始值必须是常量表达式。如果某个静态成员的应用场景仅仅局限于编译器可以替换它的值的情况,则一个初始化的const或constexpr static 不需要分别定义。。相反,如果将它用于值不能替换的场景中,则该成员必须有一条定义语句。
静态成员与非静态成员的应用场景差别:
1、静态数据成员可以是不完全类型的(一个类在它的声明之后定义之前是一个不完全类型),数据成员必须是完全类型。特别的,静态数据成员的类型可以就是它所属的类类型。而非静态数据成员则受到限制,只能声明成它所属类的指针或引用。
2、可以使用静态成员作为默认实参,非静态数据成员不能作为默认实参,因为它的值本身属于对象的一部分,结果导致无法真正提供一个对象以便从中获取成员的值,最终引发错误。