分类: C/C++
2009-10-11 11:07:50
static 数据成员独立于该类的任意对象而存在;每个 static 数据成员是与类关联的对象,并不与该类的对象相关联.对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。静态数据成员在全局数据区分配内存,在没有产生类对象时其作用域就可见,因此在没有产生类的实例时,我们就可以操作它。
1.static 数据成员必须在类定义体的外部定义(正好一次),static 关键字只能用于类定义体内部的声明中,定义不能标示为 static. 不像普通数据成员,static 成员不是通过类构造函数进行初始化,也不能在类的声明中初始化,而是应该在定义时进行初始化.保证对象正好定义一次的最好办法,就是将 static 数据成员的定义放在包含类非内联成员函数定义的文件中.
静态数据成员初始化的格式为:
<数据类型><类名>::<静态数据成员名>=<值>
2.类的静态数据成员有两种访问形式:
<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
3.静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了;静态数据成员主要用于a.保存对象个数; b.作为一个标记,标记一些动作是否发生,比如文件的打开状态、打印机的使用状态; c.存储链表的第一个或最后一个成员的内存地址。
4.同全局变量相比,使用静态数据成员有两个优势:
a. 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;
b. 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;
static 成员函数:
static 成员函数没有 this 形参,它可以直接访问所属类的 static 成员,但不能直接使用非 static 成员.访问非静态数据成员,必须通过参数传递方式得到对象名,然后通过对象名来访问。可以看到,通过静态函数成员访问非静态成员使相当麻烦的,一般的使用中,它主要用来访问全局变量或同一个类中的静态数据成员,特别是和后者一起使用,达到对同一个类中对象之间共享的数据进行维护的目的。