有时候类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联。
我们通过在成员的声明之前加上关键字 static 使得其与类关联在一起。静态成员可以是 public 或 provate 的。
静态数据成员的类型可以是常量、引用、指针、类类型等
类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。
静态成员函数也不与任何对象绑定在一起,它不包含 this 指针。作为结果,静态成员函数不能成名成 const 的,而且我们也不能在 static 函数体内使用 this 指针。这一限制既适用于 this 的显式使用,也对调用非静态成员的隐式使用有效。
静态成员虽不属于类的某个对象,但是我们仍然可以使用类的对象、引用或指针来访问静态成员。
我们既可以在类的内部也可以在类的外部定义静态成员函数。
当在类的外部定义静态成员时,不能重复 static 关键字,该关键字只出现在类内部的声明语句
因为静态数据成员不属于类的任何一个对象,所以它们并不是创建类的对象时被定义的。所以其并不是由类的构造函数初始化的。且一般来说,不能在类的内部初始化静态成员。必须在类的外部定义和初始化每个静态成员。一个静态数据成员只能定义一次。
静态数据成员定义在任何函数之外。因此一旦它被定义,就将一直存在于程序的整个声明周期中。
我们定义静态数据成员的方式和在类的外部定义成员函数差不多。需要指定对象的类型名、类名、作用域运算符、成员自己的名字。
从类名开始,剩余的部分都位于类的作用域之内,因此可以直接使用 initRate 函数对其及进行初始化。
类的静态成员不应该在类的内部初始化,但我们以及为静态成员提供 const 整数类型的类内初始值,不过要求静态成员必须是字面值常量类型的 constexpr 。初始值必须时常量表达式。
静态成员独立于任何对象,因此在某些非静态数据成员可能非法的场合,静态成员可以正常地使用。
非静态数据成员不能作为默认实参,因为它的值本身属于对象的一部分。