打印

【转】静态成员

[复制链接]
464|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
风萧寒|  楼主 | 2017-2-11 12:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
静态数据成员

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

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

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

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

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

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

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

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

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

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

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

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

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

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

静态成员函数

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

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

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


相关帖子

沙发
firstblood| | 2017-2-12 23:08 | 只看该作者
这个主要是采用static进行设计的

使用特权

评论回复
板凳
firstblood| | 2017-2-12 23:09 | 只看该作者
当然啦,其作用域是有限的,跟全局的是有本质上的区别的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

134

帖子

3

粉丝