2020/1/171第六章对象数组和指向对象的指针§6.1对象数组对象数组是指每一元素都是对象的数组一、对象数组的说明和使用与其它变量相同1.说明:类名数组名[下标表达式];例:Clockmyclock[5];2.引用:数组名[下标].成员名例:myclock[2].out();二、要按如下通常的形式创建对象数组,Clockmyclock[5];则对该类(如Clock类)的构造函数的要求满足如下条件之一:1.没有构造函数;2.有构造函数,但要有一个构造函数不带参数;3.有构造函数,但要有一个构造函数具有参数全是缺省参数例6_1#includeiostream.hclasspoint{private:intx1,x2;public://point(intx=1,inty=1)//{x1=x;x2=y;}point(intx,inty){x1=x;x2=y;}point(){x1=0;x2=0;}intgetX(){returnx1;}intgetY(){returnx2;}};voidmain(){pointdata(3,4);coutdata.getY()endl;pointmore_data[20];coutmore_data[2].getX()endl;}§6.2对象指针一、指向对象的指针指向对象指针的说明和使用与其它类型的指针变量的方法相同1、定义:类名*对象指针名2、引用:对象指针名-成员名3、用指针引用单个对象成员(前面已接触过)4、用指针引用对象数组例6_2(与例6_1功能完全相同)#includeiostream.hclasspoint{private:intx1,x2;public://point(intx=1,inty=1)//{x1=x;x2=y;}point(intx,inty){x1=x;x2=y;}point(){x1=0;x2=0;}intgetX(){returnx1;}intgetY(){returnx2;}};voidmain(){pointdata(3,4),*p,*q;p=&data;coutp-getY()endl;pointmore_data[20];q=&more_data[2];coutq-getX()endl;}二、this指针三、指向类的非静态成员的指针1、定义:类型说明符类名::*指针名(指向公有数据成员的指针)类型说明符(类名::*指针名)(参数表)(指向公有成员函数的指针)2、赋值:(确定指向类的哪个成员)指针名=&类名::数据成员名指针名=类名::函数成员名注意:此时还不能通过已赋值的指针访问成员,为什么?3、引用:对象名.*类数据成员指针名(对象名.*类函数成员指针名)(参数表)或对象指针名-*类数据成员指针名(对象指针名-*类函数成员指针名)(参数表)#includeiostream.hclasspoint{public:intx1,x2;public://point(intx=1,inty=1)//{x1=x;x2=y;}point(intx,inty){x1=x;x2=y;}point(){x1=0;x2=0;}intgetX(){returnx1;}intgetY(){returnx2;}};voidmain(){pointdata(3,4),*p,*q;intpoint::*r;int(point::*qq)();r=&point::x1;qq=point::getX;p=&data;coutp-getY()endl;pointmore_data[20];q=&more_data[2];coutq-getX()endl;coutdata.*rendl;cout(data.*qq)()endl;}指向类的静态成员的指针对类的静态成员的访问不依赖于对象可以用普通的指针来指向和访问静态成员例6-14–通过指针访问类的静态数据成员例6-15–通过指针访问类的静态函数成员指针例6-14通过指针访问类的静态数据成员#includeiostreamusingnamespacestd;classPoint//Point类声明{public://外部接口Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;}//构造函数Point(Point&p);//拷贝构造函数intGetX(){returnX;}intGetY(){returnY;}staticintcountP;//静态数据成员引用性说明private://私有数据成员intX,Y;};Point::Point(Point&p){X=p.X;Y=p.Y;countP++;}intPoint::countP=0;//静态数据成员定义性说明指针intmain()//主函数{//声明一个int型指针,指向类的静态成员int*count=&Point::countP;PointA(4,5);//声明对象AcoutPointA,A.GetX(),A.GetY();//直接通过指针访问静态数据成员coutObjectid=*countendl;PointB(A);//声明对象BcoutPointB,B.GetX(),B.GetY();//直接通过指针访问静态数据成员coutObjectid=*countendl;}13例6-15通过指针访问类的静态函数成员#includeiostreamusingnamespacestd;classPoint//Point类声明{public://外部接口//其他函数略staticvoidGetC()//静态函数成员{coutObjectid=countPendl;}private://私有数据成员intX,Y;staticintcountP;//静态数据成员引用性说明};//函数实现略intPoint::countP=0;//静态数据成员定义性说明指针intmain()//主函数{//指向函数的指针,指向类的静态成员函数void(*gc)()=Point::GetC;//右则只写函数名,左则括号内要写参数情况(如果有的话)PointA(4,5);//声明对象AcoutPointA,A.GetX(),A.GetY();gc();//输出对象序号,通过指针访问静态函数成员PointB(A);//声明对象BcoutPointB,B.GetX(),B.GetY();gc();//输出对象序号,通过指针访问静态函数成员}15动态申请内存操作符newnew类型名T(初值列表)功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。结果值:成功:T类型的指针,指向新分配的内存。失败:0(NULL)动态存储分配释放内存操作符deletedelete指针P功能:释放指针P所指向的内存。P必须是new操作的返回值。动态存储分配例6-16动态创建对象举例#includeiostreamusingnamespacestd;classPoint{public:Point(){X=Y=0;coutDefaultConstructorcalled.\n;}Point(intxx,intyy){X=xx;Y=yy;coutConstructorcalled.\n;}~Point(){coutDestructorcalled.\n;}intGetX(){returnX;}intGetY(){returnY;}voidMove(intx,inty){X=x;Y=y;}private:intX,Y;};动态存储分配intmain(){coutStepOne:endl;Point*Ptr1=newPoint;deletePtr1;coutStepTwo:endl;Ptr1=newPoint(1,2);deletePtr1;return0;}运行结果:StepOne:DefaultConstructorcalled.Destructorcalled.StepTwo:Constructorcalled.Destructorcalled.19本章总结:1、对象数组2、对象指针3、用new创建堆对象,用delete释放指向对象的指针,定义:类名*对象指针名指向类的非静态成员的指针,定义:类型说明符类名::*指针名(指向公有数据成员的指针)类型说明符(类名::*指针名)(参数表)(指向公有成员函数的指针)指向类的静态成员的指针,用普通的指针来指向和访问上机题:1、声明一个Employee类,其中包括姓名、街道地址、城市和邮编等属性,以及change_name()和display()等函数。display()显示姓名、街道地址、城市和邮编等属性,change_name()改变对象的姓名属性,实现并测试这个类。2、对上面的Employee类,声明包含5个元素的对象数组,每个元素都是Employee类型的对象,并输出这5个对象的数据成员。