有的时候类需要它的一-些成员与类本身直接相关,而不是与类的各个对象保持关联。例如,一个银行账户类可能需要一个数据成员来表示当前的基准利率。在此例中,我们希望利率与类关联,而非与类的每个对象关联。从实现效率的角度来看,没必要每个对象都存储利率信息。而且更加重要的是,一旦利率浮动,我们希望所有的对象都能使用新值。
声明静态成员
class A
{
public:
static double what_i1() { return i1; }//静态成员函数仅仅智能应用于静态成员
private:
static double i1;//静态成员i1
int i2;
string i3;
};
类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。因此,每个A对象将包含两个数据成员:i2和i3。只存在一个i1对象而且它被所有A对象共享。
类似的,静态成员函数也不与任何对象绑定在一起,它们不包含this指针。作为结果,静态成员函数不能声明成const的,而且我们也不能在static函数体内使用this指针。这一限制既适用于this的显式使用,也对调用非静态成员的隐式使用有效。
静态成员的使用
int main()
{
//作用域方式,前提是public
A::what_i1();
//使用类内的元素进行调用,指针或元素
A a,*b;
a.what_i1();
b->what_i1();
return 0;
}
定义静态成员
因为静态数据成员不属于类的任何一个对象,所以它们并不是在创建类的对象时被定义的。这意味着它们不是由类的构造函数初始化的。而且一般来说,我们不能在类的内部初始化静态成员。相反的,必须在类的外部定义和初始化每个静态成员。和其他对象一样,一个静态数据成员只能定义一次。
类似于全局变量,静态数据成员定义在任何函数之外。因此一旦它被定义,就将一直存在于程序的整个生命周期中。
定义的基本格式:
double A::i1 = 0.0;
在类内进行初始化静态成员
需要加上constexpr
class A
{
public:
static int what_i1() { return i1; }
private:
static constexpr double i1 = 0.0;
int i2;
string i3;
};