静态变量
如果要在函数内部的局部作用域中声明具有静态生存期的对象,则要使用关键字static。
如:static int i;
局部作用域中静态变量不会随着函数调用而产生一个副本,也不会谁着函数返回而失效。定义静态变量时可以同时赋初值,对于基本类型静态生存期便来年给,会被赋予0值初始化。
对象的生存期与程序的运行期相同,则称它具有静态生存期。命名空间作用域中声明的对象都是具有静态生存期的。
除了命名空间作用域中声明的对象和类的数据成员可以用static修饰作为类的静态成员外,其余的对象都具有动态生存期,在局部作用域中声明的具有动态生存期的对象常常称之为局部生存期对象,它诞生于声明点,结束于声明所在的块执行完毕之时。
类的静态成员
面向对象程序设计兼顾数据的共享和保护,封装数据和操作为类,类内部的函数之间实现数据共享,同时设置访问属性,使这种共享受限制。限制共享在类范围内。对类外数据成员来说是隐藏的,达到了共享和隐藏两全。
对象与对象之间也要共享数据,静态成员可以解决同类的不同对象之间数据和函数共享的问题。
类的静态数据成员
类某个属性为所有类共有,不属于任何具体对象,采用static关键字声明为静态成员。静态成员在每个类只有一个副本,由该类的所有对象共同维护和使用,实现同一类的不同对象之间的数据共享。静态数据成员具有静态生存期,采用 类名::标识符 进行访问。在类的定义中仅仅对静态数据成员进行引用性声明,必须在命名作用域的某个地方使用类名限定定义性声明,此时,可以初始化,单独为其分配内存空间。
类内声明,类外定义和初始化。
类的静态成员函数成员
静态函数成员使用static关键字修饰的函数成员。同静态数据成员一样,静态成员函数也属于整个类,由同意个类的所有对象共同拥有,为这些对象所共享。
静态成员函数可以通过类名或对象名来调用,而非静态成员函数只能通过对象名来调用。
静态成员函数可以直接访问该;类的静态数据和函数成员。而访问该类的非静态数据和函数成员,必须通过对象名,这是因为在静态成员函数中访问类的非静态成员需要指明对象,是因为对静态成员函数的调用是没有目的对象的。因此不能像非静态成员函数那样,隐含地通过目的对象访问类的非静态成员。
通过静态函数成员访问非静态成员相当麻烦。一般情况下,它主要用来访问同类中的静态数据成员,维护对象之间共享的数据。
将变量和函数限制在编译单元内
在定义变量和函数时,使用static关键字,用static关键字来修饰命名空间作用域的变量或函数时,和extern关键字起相反作用。它会使得被static修饰的变量和函数无法被其他编译单元引用。