实验三 类与对象(三)_第1页
实验三 类与对象(三)_第2页
实验三 类与对象(三)_第3页
实验三 类与对象(三)_第4页
实验三 类与对象(三)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验三类与对象(三一静态成员、常量成员、友元、对象成员一、实验目的理解静态数据成员、静态成员函数的作用,熟悉其应用;理解常量对彖、常量数据成员、常量成员函数作用,熟悉相互关系及应用;熟悉友元函数、友元类的定义及应用;熟悉对象成员(容器类)的应用;进一步熟悉类与对彖的应用及编程。二、实验学时课内实验:2课时课外练习:2课时三本实验涉及的新知识㈠静态成员静态成员分为静态数据成员及静态成员函数。静态数据成员(1)静态数据成员的定义(类中定义)格式:static类型数据成员名表;(2)静态数据成员的作用静态数据成员在一个类中只有一个拷贝,属于一个类(或者说属于类的第一个对彖),所有对象都共享静态成员。静态数据成员是连接各个对象的桥梁,可用来取代全局变量,主要用于各个对彖都共享的公用数据,如:总数的统计、平均数等。(3)说明静态数据成员可以说明为公有成员、私有成员或保护成员,但一般不说明为公有成员:静态数据成员同其它数据成员一样,不能在类中进行初始化(不分配内存空间);静态数据成员由于属于类(不依赖任何对彖),应在程序开始运行时即生成,必须在任何函数之外进行初始化操作;格式:类型类名::静态数据成员二初值;使用静态数据成员取代全局变量,使数据更为安全:当在类中需要共享某一数据成员时通常定义为静态数据成员;静态数据成员与静态对彖是两个完全不同的概念,前者(静态数据成员)是在类中定义的,是类的所有对彖共享的数据成员,而后者(静态对彖)是指对象存储在静态存储区。静态成员函数(1)静态成员函数的定义静态成员函数是在定义类的成员函数时,在成员函数名前加上statico(2)静态成员函数的调用方法用类名调用格式:类名::静态成员函数名(实参表);用对象调用格式:对象名•静态成员函数名(实参表);(3)说明静态成员函数可以在类内部定义(必须加上static),也可在类外定义,即在类体内声明,在类体外定义,定义时与普通成员函数相同;静态成员函数无tlus指针(this指针属于某一对彖,静态成员属于一个类),只能访问静态数据成员,不能访问普通数据成员,因此静态成员函数专门用来访问静态数据成员;当在类中定义有静态数据成员时,通常应定义静态成员函数来访问静态数据成员。㈡常量成员函数、常量数据成员及常量对象在C卄中可以用const定义常量对彖(也称为常对彖)、常量成员函数(也称为常成员函数)、常量数据成员(也称为常数据成员)。常量成员函数的定义(1)在类中定义:返回类型成员函数名(参数表)const{函数体}(2)在类外定义类中声明:返回类型成员函数名(参数表)const;类外定义:返回类型类名::成员函数名(参数表)const{函数体}常量数据成员的定义定义格式:const数据类型成员名或:数据类型const成员名常量对象的定义定义格式:类名const对象名表;或:const类名对象名表说明(1)常量对象只能在定义时初始化,其数据成员的值不能改变。(2)常量对象只能调用常屋成员函数,不能调用普通成员函数;而普通对象既町调用普通成员函数,也可以调用常量成员函数。(3)普通成员函数可以访问本类的常量成员函数,而常量成员函数不能访问本类的普通成员函数。(4)常量成员函数与普通成员函数同名时,构成函数的重载,其参数类型和个数可以相同,而用const加以区分。(5)常量数据成员必须在构造函数中通过初始化列表进行初始化,初始化后值不能改变。(6)常量数据成员及成员函数隶属于某一对彖(与静态数据成员的差异)。㈢友元友元的概念在C卄中提供了一种类以外的函数访问类的私有成员、保护成员的方法,即将这些函数定义为类的友元。友元的种类及应用(1)友元函数定义方法:在类中进行声明时,在声明的前面加上fhend。说明:友元函数不是类的成员函数,除非确因成员函数使用频繁,需要提高程序的执行效率而定义为友元函数外,一般不要定义。友元函数可以访问对彖的私有成员和保护成员,只是在类中声明时加上fnend,但它不是成员函数,定义时不能在函数名前加上“类名:友元函数无this指针,一般至少应带有一个入II参数,通过入II参数传递的对象名来引用该对象的成员。友元函数主要用于运算符的重载。(2)友元成员友元成员是指一个类的成员函数可以是另一个类的友友元函数,这样就可以通过一个类的成员函数访问另一个类的私有成员或保护成员。说明:一个类的成员函数要作为另一个类的友元函数时,必须先定义这个类。由于友元函数所在的类名先于类的定义出现,应先声明。(3)友元类友元类是指一个类可以作为另一个类的友元,这样友元类的所有成员函数均可以访问另一个类中的成员。㈣容器类容器类的概念在定义一个类的数据成员时,除可以是基本数据成员外,还可以是其它类的对彖,称为对象成员。含有对彖成员的类称为容器类。容器类构造函数(1)格式类名(形参表):成员名1(参数表1),,成员名n(参数表11)(2)说明:容器类中至少应有一个构造函数,以通过参数表为成员对彖赋初值。创建容器类对彖时,先执行对彖成员所属类的构造函数,再执行容器类构造函数的函数体。释放容器类对彖时,先调用容器类的析构函数,再调用对象成员所属类的析构函数。用容器类对彖调用对彖成员所属类的公有成员函数格式:容器类对象成员名•对象成员所属类名::成员函数名(实参表);四、实验内容㈠验证及认知实验按要求调试下列程序并回答相关问题。程序1(exp_301.cpp)#iiiclude<iostieam.h>classcounter{private:

staticmtcount;cliarch;public:counter(charc)staticmtcount;cliarch;public:counter(charc)//普通数据成员〃构造函数{this->count++;ch=c;}voidpiiiit_counter(void){cout«ch«H:,,«count«endl;}-counter(void){count-;}};intcounter::count=100;//静态数据成员赋初值voidniam(void){countercl(A*);cl.print_counter();cout«endl;counterc2(,B,);cl.print_counter();c2.print_counter();cout«endl;counterc3(C);cl.print_counter();c2.print_counter();c3.print_counter();}问题:(1)运行该程序的输出结果为由输出结果可知,静态成员属于•在类中只有拷贝。程序中的“mtcounter::count=100;°的作用是,如果将其放在main()函数中,重新编译程序,会出现・其原因是,程序2〃头文件“hhpoint.h”中point类的定义:classpoint{private:floatx,v;

〃无参构造函数〃构造函数重載〃无参构造函数〃构造函数重載//拷贝构造函数pomt(void){x=O;y=O;}point(floata.floatb){x=a;y=b;}point(constpoint&ob){x=ob.x;y=ob.y;}voidset_point(floata.floatb);floatread_x(void);floatread_y(void);voidmove(floata,floatb);voidpiiiit(void);};voidpoint::set_pomt(floata.floatb){x=a;y=b;}floatpomt::read_x(void){retunix;}floatpomt::read_y(void){retuniy;}voidpoint::move(floata.floatb){x+=a;y+=b;}voidpoint::piint(void){cout«Hx=H«x«Mv=n«y«endl;}〃头文件Joint.h”中point类的定义:classpoint{private:floatx、y;〃无参构造函数〃构造函数重載〃无参构造函数〃构造函数重載〃拷贝构造函数pomt(void){x=O;y=O;}point(floata.floatb){x=a;y=b;}point(constpoint&ob){x=ob.x;y=ob.y;}voidset_point(floata.floatb);floatread_x(void);floatread_y(void);floatread_x(void)const;floatread_y(void)const;voidmove(floata,floatb);voidmove(floata,floatb)const;};voidpoint::set_pomt(floata.floatb){x=a;y=b;}floatpomt::read_x(void){retunix;}floatpomt::read_y(void){retuniy;}voidpoint::move(floata.floatb){x+-a;y+=b;}floatpomt::read_x(void)const{retunix;}floatpomt::read_y(void)const{retuniy;}//voidpoint::move(floata,floatb)const//(8)〃{x+=a;y+=b;}//(9)〃文件“exp_302.cpp”中定义的测试程序:#mclude<iostieam.h>#mclude,,lilipomt.hH//(I)//#iiicludenpoint.hM//(2)voidniam(void){constpointcentei(100.100);pointp(20,40);cout«,,Befbremoving:"«endl:cout«Hp:',«Mx=H«p.read_x();cout«My=u«p.read_yQ«endl;cout«Mcenter:H«Mx=M«center.read_xO;cout«My=n«center.read_y()«endl://p.move(10,20);〃⑶//cout«HAftermoving:H«endl;//(4)//cout«Hp:H«Hx=H«p.iead_x();〃⑸//cout«Hy=M«p.iead_y()«eiidl;〃(6)//center.move(20.20);〃(7)}问题:⑷编译程序,会出现,其出错原因是⑸将程序中(1)改为注释,再将(2)行首的注释去掉,再编译运行程序,程序的输出结果为:⑹将程序中(3)—(6)行首的注释去掉,程序的输出结果为:(7)将程序中的(7)行首的注释去掉,编译程序时无错,而运行程序时会出现错误,其原因是。程序3(亡xp_303.cpp)#mclude<iostieam.h>#mclude<stimg.h>classgirl{private:char*naine;mtage;public:gi【l(char*na,mtn){name=newchai[strlen(na)+l];strcpy(nameaia);age=n;}^giil(void){deletename;}〃释放new分配的内存char*get_name(void){retuniname;}mtget_age(void){retuniage;}voidpimt_girl(void);};voidgirt:piiiit_girl(void){cout«H姓名:n«name;cout«M年龄:,,«age«endl;}voiddisp(giil&g){cout«H姓名:M«;cout«M年龄:,,«g.age«endl;}voidniaiii(void){giiigl(H李小丫“,⑵,g2(”王永兰“,15),g3(”赵梦美”」3);cout«M姓名:,,«gl.get_name();

cout«M年龄:H«gl.get_age()«endl;g2.pnnt_gul();disp(g3);}问题:⑻编译程序出错的原因是⑼在girl类中加上afriendvoiddisp(girl&g);”重新编译、运行程序,其输出结果为:其中friendvoiddisp(gul&g);”表示函数disp()为girl类的°㈡知识应用实验1.分析下列程序,写出程序的输出结果,再上机运行程序验证其正确性,如果不正确,请认真分析出错原因。程序4(exp_304.cpp)#mclude<iostieam.h>classsunpie#mclude<iostieam.h>classsunpie{private:staticmtvl,v2?v3;public:smiple(intx=0,inty=0){vl=x;v2=y;}staticvoidsum(void)你分析的程序输出结呆是:程序的实际输出结果是:mtget_v3(void){returnv3;}intsunpie::vl=0;intsunpie::v2=0;intsunpie::v3=0;voidniaiii(void){simpleobi(5,10);obl.suniQ;cout«M(l):H«ob1.get_v3()«endl;sunpieob2(10,20);sunpie::sum();cout«M(2):H«ob2.get_v3()«endl;程序5(exp_3O5.cpp)#mclude<iostieam.h>你分析的程序输出结果是:#mclude<stimg.h>你分析的程序输出结果是:classboy;//类boy的声明;classgill{private:char*naine;mtage;public:程序的实际输出结果是:giil(char*na,mtn){name=newchai[strlen(na)+l];strcpy(nameaia);age=n;}^giil(void){deletename;}〃释放new分配的内存friendvoiddisp(girl&g,boy&b);〃声明disp为gill类友元函数};classbovJ{private:char*naine;mtage;public:boy(char*na,iiitn){name=newchai[strlen(na)+l];strcpy(nameaia);age=n;}^bov(void){deletename;}〃释放new分配的内存friendvoiddisp(girl&g,boy&b);〃声明disp为boy类友元函数};voiddisp(giil&g.boy&b)〃定义友元函数:不是类的成员不需要作用域运算符{cout«'f女孩姓名:”;cout«M年龄:,,«g.age«endl;cout«M男孩姓名:H«;cout«M年龄:y<b・age«endl;}voidniaiii(void){giiigl(”李小丫”,12);boybl(”张海兵”,15);disp(gl,bl);//调用友元函数:与普通函数调用相同}程序6你分析的程序输出结果是:〃头文件"hdate.h"的内容:〃定义"date"类classdate

你分析的程序输出结果是:{private:intyeai;month.day;public:date(void)程序的实际输出结果是:{yeai-1980;month=1;day=1;}date(iiitvjntm.iiitd)程序的实际输出结果是:{year=y;month=m;day=d;}mtget_yeai(void){returnyear;}mtget_month(void){returnmonth;}mtget_day(void){returnday;}};〃头文件“hpeison・h”的内容:定义“pereon”类#mclude<stimg.h>#mcludeHhdate.hHclassperson{private:cliar*naine;charsex[2];datebmhday;public:person(char*na,charyiiitd):buthday(y,nLd){name=newchai[strlen(na)+l];strcpy(nameaia);strcpy(sex.s);}char*get_name(void){returnname;}char*get_sex(void){returnsex;}mtget_yeai(void){ieturnbmhday.get_yearQ;}mtget_month(void){returnbutliday.get_month();}mtget_day(void){returnbmhday.get_dav();}-person(void){delete[]name;}voidpiiiit(void);};voidperson::pimt(void){cout«H姓名:,,«name«endl;cout«M性别:,,«sex«endl;cout«M出生日期:,,«birthday.get_year()«H年典;cout«bmhday.get_month()«H月”;cout«biithdayget_day()«"口H«endl;}〃测试程序"exp.306.cpp"#mclude<iostieam.h>#mcludeHhperson.hHvoidniaiii(void){personpsl(”张小三丁男7985)2,15);personps2「李小丫丁女”,1986,3,9);psl.priiitQ;cout«e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论