静态成员

来源:互联网 发布:nginx for linux 安装 编辑:程序博客网 时间:2024/06/15 10:48

静态数据成员

如果有n个同类的对象,那么每一个对象都分别有自己的数据成员,不同对象的数据成员各自有值,互不相干。但是有时人们希望有某一个或几个数据成员为所有对象所共有。这样可以实现数据共享

如果想在同类的多个对象之间实现数据共享,也不要用全局对象,可以用静态的数据成员。

静态数据成员是一种特殊的数据成员。它以关键字static开头。静态的数据成员在内存中

只占一份空间。每个对象都可以引用这个静态数据成员。静态数据成员的值对所有对象都是一样的。如果改变它的值,则在各对象中这个数据成员的值都同时改变了。这样可以节约空间,提高效率。

 

1、静态数据成员不属于某一个对象在为对象所分配的空间中不包括静态数据成员所占的空间。静态数据成员是在所有对象之外单独开辟空间。只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间,它可以被引用。

2、它不随对象的建立而分配空间,也不随对象的撤销而释放(一般数据成员是在对象建立时分配空间,在对象撤销时释放)。静态数据成员是在程序编译时被分配空间的,到程序结束时才释放空间。

3、静态数据成员可以初始化,但只能在类体外进行初始化。其一般形式为

数据类型类名∷静态数据成员名=初值;不必在初始化语句中加static。

在类里面只有const static才可以初始化,作为常量使用。const或者static都不可以。(意思时立即初始化,而const是用构造函数的初始化列表进行初始化,static在类外初始化)

注意: 不能用参数初始化表对静态数据成员初始化。如果未对静态数据成员赋初值,则编译系统会自动赋予初值0。

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

 

5、静态数据成员的作用域只限于定义该类的作用域内(如果是在一个函数中定义类,那么其中静态数据成员的作用域就是此函数内)。在此作用域内,可以通过类名和域运算符“∷”引用静态数据成员,而不论类对象是否存在。

 

静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。主要存放静态数据、全局数据和常量。

根据类静态成员的特性我们可以简单归纳出几点,静态成员的使用范围: 
1.用来保存对象的个数。 
2.作为一个标记,标记一些动作是否发生,比如:文件的打开状态,打印机的使用状态,等等。 
3.存储链表的第一个或者最后一个成员的内存地址。

 

静态成员函数

静态成员函数可以直接引用本类中的静态数据成员,因为静态成员同样是属于类的,可以直接引用。当调用一个对象的成员函数(非静态成员函数)时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数并不属于某一对象,它与任何对象都无关,因此静态成员函数没有this指针。既然它没有指向某一对象,就无法对一个对象中的非静态成员进行默认访问(即在引用数据成员时不指定对象名)。

但是,并不是绝对不能引用本类中的非静态成员,只是不能进行默认访问,因为无法知道应该去找哪个对象。如果一定要引用本类的非静态成员,应该加对象名和成员运算符“.”。

 

在C++程序中最好养成这样的习惯: 只用静态成员函数引用静态数据成员,而不引用非静态数据成员。这样思路清晰,逻辑清楚,不易出错。

0 0