修饰全局变量与函数

static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。

static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0.

与全局变量相比,使用静态数据成员有以下两个优势:

  1. 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性.
  2. 可以实现信息隐藏,类内静态数据成员可以是private成员,而全局变量不能.

在头文件中定义静态变量不可行,因为如果在使用了该头文件的每个C语言文件中定义静态变量,按照编译的步骤,在每个头文件中都会单独存在一个静态变量,从而会引起空间浪费或程序错误.

修饰函数内的局部变量

函数拥有一个static对象的意思是:此对象在函数第一次被调用时才产生.如果该函数从未被调用,这个对象也就绝对不会诞生(然而你必须付出代价,在函数每次被调用时检查对象是否需要诞生)。

在函数体内,静态变量具有"记忆"功能,即一个被声明为静态的变量在这一函数被调用的过程中其值不变.

修饰类内变量与函数

类内静态数据成员或成员函数可以实现信息隐藏,因为它们可以是private成员.

静态数据成员

(1)静态数据成员可以实现多个对象之间的数据共享,它是类的所有对象的共享成员,它在内存中只占一份空间,如果改变它的值,则各对象中这个数据成员的值都被改变。

(2)静态数据成员存储在全局数据区,在程序开始运行时被分配空间,到程序结束之后才释放,只要类中指定了静态数据成员,即使不定义对象,也会为静态数据成员分配空间。

(3)静态数据成员可以被初始化,但是除了整型常量,其它类型只能在类体外进行初始化,类外定义不能带上static的关键字。若未对静态数据成员赋初值,则编译器会自动为其初始化为0.

(4)静态数据成员既可以通过对象名引用,也可以通过类名引用。

(5) 静态数据成员和普通数据成员一样遵从public、protected、private访问规则。实现了信息隐藏.

静态成员函数

(1)静态成员函数和静态数据成员一样,他们都属于类的静态成员,而不是对象成员。

(2)非静态成员函数有this指针,而静态成员函数没有this指针。

(3)静态成员函数主要用来访问静态数据成员而不能访问非静态成员。