王更生第九堂课.ppt
上传人:sy****28 上传时间:2024-09-11 格式:PPT 页数:34 大小:2MB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

王更生第九堂课.ppt

王更生第九堂课.ppt

预览

免费试读已结束,剩余 24 页请下载文档后查看

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

C++语言程序设计第九课类和对象(三)静态数据成员用关键字static声明该类的所有对象维护该成员的同一个拷贝必须在类外定义和初始化,用(::)来指明所属的类。静态成员函数类外代码可以使用类名和作用域操作符来调用静态成员函数。静态成员函数只能引用属于该类的静态数据成员或静态成员函数。1、静态数据成员若想在同一个类的多个对象之间共享某个数据。可将该类成员声明为static,使之成为静态成员。静态成员是在编译时被创建,其空间只有一个,且与对象是否存在无关,可为所有以后创建的该类对象共享。并且空间一直保存到程序结束。而一般成员是在对象创建时由构造函数分配空间,属于具体的某个对象,对象不同则成员空间也不同,并在函数结束时由析构函数释放对象空间而随之释放。例如:一个学生类,有一个对应学生总数属性的数据成员count。则对于每一个已有学生对象而言,一旦现有学生人数变化,那么已有学生对象中count所保存的数据就不适用,则要对每个对象逐个修改,显然这是不实际的。而应采用静态成员。静态数据成员具有静态生存期。由于静态数据成员不属于任何一个对象,因此对它的访问只能通过类名来进行,一般的用voidCTest::Set(intw){count+=w;}voidCTest::Display(){cout<<“\n\tcount=“<<count<<endl;}voidmain(){CTesta,b;a.Set(10);cout<<“\tOperatingona:”;a.Display();b.Set(10);cout<<“\tOperatingonb:”;b.Display();cout<<“\tOperatingona:”;a.Display();}2、静态函数成员使用static关键字声明的函数成员是静态的,静态成员函数同样也属于整个类,由同一个类的所有对象共同维护,为这些对象所共享。作为成员函数,它的访问属性可以受到类的严格控制,对于公有的静态成员函数,可以通过类名或对象名来调用。注意,一般的成员函数只能通过对象名来调用。由于一个类的静态成员函数只有一个拷贝,因此它访问对象的数据和函数时受到了限制。静态成员函数可以直接访问该类的静态数据和函数成员。而访问非静态数据成员,必须通过参数传递方式得到对象名,然后通过对象名来访问。可以看到,通过静态函数成员访问非静态成员是相当麻烦的,一般的使用中,它主要用来访问全局变量或同一个类中的静态数据成员,特别是和后者一起使用,达到对同一个类中对象之间共享的数据进行维护的目的。例2、具有静态数据、函数成员的Point类如果程序中定义的对象特别多,每个对象都有一个用于访问静态数据成员的外部接口,显然是一种严重的重复和浪费。静态函数成员是属于整个类公有,不管有多少个对象,在内存中同一个类只有一个该静态函数的拷贝,这正好适合我们访问静态数据成员的要求。下面我们给出使用静态函数成员来访问countP的实例。#include<iostream.h>//p154classPoint//Point类定义{public://外部接口Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;}Point(Point&p);//拷贝构造函数intGetX(){returnX;}intGetY(){returnY;}7.8常对象例如:#include<iostream.h>//Example_pcclassM{public:M(inta){A=a;B+=a;}voidf1(intx)const;private:intA,B;};voidM::f1(intx)const{cout<<x<<endl;}voidmain(){constMobj1(10);Mconstobj2(20);obj1.f1(30);obj2.f1(40);}其中obj1和obj2都是常对象,以后不能被更新。如果函数声明f1(intx)没有const,语句obj1.f1(30);obj2.f1(40);将出错!2、常数据成员如果某个数据成员的值是不应该被修改的,可以用const声明为常数据成员,它受到强制保护,以防止被意外改动。对于常数据成员,在任何函数中都不能对它赋值,也不能更新。因此必须对它进行初始化,而且只能通过成员初始化列表的方式进行初始化。【例7.25】常数据成员的初始化示例#include<iostream.h>classA{public:A(inti,intj);voidprint();constint&r;//常数据成员的引用private:intnum;