C++ 静态成员
接下来,我们准备为大家介绍"静态成员"
为什么要使用"静态成员"?原因是,我希望在不同的对象之间共享某些成员,这里的成员就是属性,只是换个表达方式。
举一个例子,例如:在游戏进行的过程中,我们会产生多个的敌人,所以,在类中,我们会定义一个属性去记录敌人的总数量,当敌人死亡时,也需要减少敌人的总数量,这个敌人总数量的属性不需要存在于每一个敌人对象中,而只需要让每一个敌人去共享它就可以了,否则,当敌人的数量有变化时,就需要对每个敌人对象中的数量属性进行修改,这样,工作量就大大增加了,所以,我们就需要通过静态属性去定义敌人的总数量。
静态成员的特性:
静态成员定义在类中,但需要在类外实现,即分配内存空间,因为,类只是一个类型,是不会分配内存空间,所以,要让不同对象去共享静态成员,就需要在类外实现静态成员,这样,系统才会为静态成员分配内存空间,从而,让不同对象可以去访问它。
静态成员定义的语法格式:
static 类型关键字 属性名;
语法格式分析:
(1)static关键字开头,说明是静态。
(2)类型关键,即C语言中的数据类型,如整形int,浮点形float等。
(3)属性名字,即成员名字,按C语言变量的命名规则定义即可。
(4)最后就是一个分号。
静态成员实现的语法格式:
类型关键字 类名::属性名 = 初值;
语法格式分析:
(1)类型关键,即C语言中的数据类型,如整形int,浮点形float等。
(2)类名,静态成员所在类的名字。
(3)两个冒号,格式要求,不能省略。
(4)属性名。
(5)等于号,以及初值。
(6)最后就是一个分号。
接下来,我们结合例子作进一步的学习
例子:
class Person //定了一个描述人的类Person
{
public:
char *Name; //名字属性
int Life; //生命属性
static int Count; //记录人数属性
Person()
{
Life = 10;
Count = Count + 1; //每次定义一个象,就计数加1
}
~Person()
{
Life = 0;
Count = Count - 1; //对象生命周期结束时,就计数减1
}
}
int Person::Count = 0; //对静态属性Count分配内存空间并赋初值0;
void main()
{
Person p1; //通过Person类定义了一个对象p1,同时,调用了构造函数将属性Life设置为10
同时,对属性Count进行计数加1,所以,Count的值由0变为1。
Person p2; //通过Person类定义了一个对象p2,同时,调用了构造函数将属性Life设置为10
同时,对属性Count进行计数加1,所以,Count的值由1为2。
p2.Count = 99; //通过对象p2调用静态属性Count,并对它赋值为99,所以,
Count的值由2为99。
p2.Life= 13; //通过对象p2调用属性Life,并对它赋值为13,所以,
p2对象中的Life的值由10为13。
int tmp = p1.Life;//对象p1中的Life在定义时通过构造函数赋值为10,所以,这个赋值操作
后,变量tmp中的值为10
tmp = p1.Count; //对象p1调用Count,而Count中的值,在上面p2对象调用Count时
已赋值为99,所以,赋值操作后,变量tmp中的值为99
}
小结:
在上面的例子中,我们可以看到对象p1与p2是共享静态属性Count,当p2调用Count并改变其值为99以后,p1再调用Count时,其值,还是99,所以,是共享的。
而p1与p2中的Life属性就是互相独立的,大家可以看到当对象p2调用Life属性并赋值为13后,对象p1中的属性Life中的值没有受到影响,仍然是10,所以,是独立的。
通过上面的学习,相信大家对静态属性有了一个初步了解,但是,如何灵活地运用这个知识点呢?那么,我们就要通过下方的按钮进入到游戏中,然后,运用该知识点去完成任务,这样,才可以加深大家对该知识点的理解和运用,以及“尽快进入到编程的状态”。
要达到灵活运用,是需要通过不停地反复训练才可以做到,所以,不要停留在理论规则上面,快动起来吧!
(通过游戏模式学习与训练,需要在电脑上运行)