实验指导C++面向对象部分.docx
- 文档编号:24095448
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:57
- 大小:97.17KB
实验指导C++面向对象部分.docx
《实验指导C++面向对象部分.docx》由会员分享,可在线阅读,更多相关《实验指导C++面向对象部分.docx(57页珍藏版)》请在冰豆网上搜索。
实验指导C++面向对象部分
实验内容
实验一类与对象基本程序设计
(一)
【实验类型】验证性
【实验要求】必做
【实验目的】
1.了解C++面向对象程序设计的基本概念以及了解C++程序的基本结构。
2.了解类,对象的概念,掌握类及类中成员函数的定义及使用方法。
3.掌握对象的定义及使用方法。
4.了解构造函数,析构函数,拷贝构造函数的作用,特点,定义方式及使用方法。
【实验内容】
实验题1.定义一个FDAccount类,用以描述一个定期存折(fixeddeposit),实现现金支取。
余额合计。
信息显示等。
存折基本信息包括帐号,账户名称,存款余额,存取期限(以月为单位),存款利率(以百分点为单位)等。
提示:
存折的基本信息定义为存折类的私有的数据成员,利用构造函数的初始化存折类对象,在利用构造函数的参数表传入实参,初始化存折对象的数据成员。
实验题2.设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个顶点的坐标,该类能够计算矩形的面积。
提示:
两个点的坐标作为矩形类的数据成员。
利用坐标计算矩形长和宽,然后求面积。
实验题3.设计一个person类,其属性包括name和id,其中name属性为指针,分别利用person类构造函数和拷贝构造函数建立对象,打印每个person类对象的信息。
要求分别编写浅拷贝构造函数和深拷贝构造函数调试程序。
提示:
要在构造函数中为person对象的name属性分配动态内存,在析构函数中,释放掉申请的动态内存。
注意不要让同一块动态内存被释放多次。
【参考程序】
实验题1参考程序
#include
#include
classFDAccount
{
public:
//构造函数
FDAccount(char*ID,char*depositor,doubleamount,intperiod,doublerate);
doublefetch(char*ID,char*depositor,doubleamount);//支取到期存款
voidupdate();//计算到期账户余额
voidshow();//显示账户基本信息
protected:
doubleinterest_rate;
private:
char*accounts;
char*name;
doublebalance;//存款余额
intterm;//存款期限
};
FDAccount:
:
FDAccount(char*ID,char*depositor,doubleamount,intperiod,doublerate)
{
name=depositor;
accounts=ID;
if((amount<0||rate<0))
{
cout<<"数据不正确"< exit (1); } balance=amount; term=period; interest_rate=rate; } doubleFDAccount: : fetch(char*ID,char*depositor,doubleamount) { cout<<"帐号"<<"账户名称"<<"支取金额"< cout< balance=balance-amount; returnbalance; } voidFDAccount: : update() { balance=balance+balance*(interest_rate/100.00)*(term/12.0); } voidFDAccount: : show() { cout<<"显示账户基本信息: "< cout<<"帐号"<<"帐号名称"<<"期限"<<"利率"< cout< cout<<"目前账户余额为: "< } voidmain() { FDAccountdepositor("0034","王涛",10078,18,1.98); depositor.show(); cout< cout<<"存款已到期! \n"< depositor.update(); depositor.show(); cout< cout<<"支取存款: "< depositor.fetch("0034","王涛",5000); cout< depositor.show(); } 实验题2参考程序 #include classRectangle { public: Rectangle(inttop,intleft,intbottom,intright); ~Rectangle(){} intGetTop()const{returnitsTop;} intGetLeft()const{returnitsLeft;} intGetBottom()const{returnitsBottom;} intGetRight()const{returnitsRight;} voidSetTop(inttop){itsTop=top;} voidSetLeft(intleft){itsLeft=left;} voidSetBottom(intbottom){itsBottom=bottom;} voidSetRight(intright){itsRight=right;} intGetArea()const; private: intitsTop; intitsLeft; intitsBottom; intitsRight; }; Rectangle: : Rectangle(inttop,intleft,intbottom,intright) { itsTop=top; itsLeft=left; itsBottom=bottom; itsRight=right; } intRectangle: : GetArea()const { intWidth=itsRight-itsLeft; intHeight=itsTop-itsBottom; return(Width*Height); } intmain() { RectangleMyRectangle(100,20,50,80); intArea=MyRectangle.GetArea(); cout<<"Area: "< return0; } 实验题3参考程序(浅拷贝情况) #include #include classPerson { public: Person(char*pName="noname",intpid=100) { cout<<"callconstructor"< strcpy(name,pName); id=pid; } Person(Person&p) { cout<<"callcopyconstructor"< strcpy(name,p.name); id=p.id; } voidprintinfo() { cout< } private: charname[20]; intid; }; voidmain() { Personwang("wang"); wang.printinfo(); Personli(wang); li.printinfo(); } 实验题3参考程序(深拷贝情况) #include #include classPerson { public: Person(char*pname="noname",intpid=100) { cout<<"callconstructor"< name=newchar[strlen(pname)+1]; if(name! =0) {strcpy(name,pname);} id=pid; } Person(Person&p) { cout<<"callcopyconstructor"< name=newchar[strlen(p.name)+1]; if(name! =0) strcpy(name,p.name); id=p.id; //name[1]='z'; } voidprintinfo() { cout< } /*----------------------------------------------------------------- voidGetAddr()//取对象name成员的内存地址 { cout< "; cout<<(int)&(*this->name)< } ------------------------------------------------------------------*/ ~Person(){deletename;} private: char*name; intid; }; voidmain() { Personwang("wang",101); wang.printinfo(); //wang.GetAddr(); Personli(wang); li.printinfo(); //li.GetAddr(); } 【思考题】 1.构造函数可以是私有成员么? 2.为什么同类的不同对象,调用相同的成员函数时,这些成员函数能够准确的操作相应的对象呢? 实验二类与对象基本程序设计 (二) 【实验类型】验证性 【实验要求】必做 【实验目的】 1.巩固类和对象的定义及使用方法。 2.了解静态成员的概念,特点,定义方式,作用。 3.了解友元的概念,特点,定义方式,作用。 4.掌握组合类的概念,了解组合类对象构造和析构的过程。 【实验内容】 实验题1.商店销售某一商品,商店每天公布统一的折扣(discount),同时允许销售人员在销售时灵活掌握售价(price),在此基础上,对一次购10件以上者,还可以享受9.8折优待。 现已知当天3个销货员的销售情况为: 销货员号(num)销货件数(quantity)销货单价(price) 101523.5 1021224.56 10310021.5 编写程序,计算出当日此商品的总销售款sum,以及每件商品的平均售价,要求用静态数据成员和静态成员函数。 提示: 将折扣discount,总销售款sum和商品销售总件数n声明为静态数据成员,在定义静态成员函数Average(求平均价)和display(输出结果) 实验题2.定义单链表类,完成单链表的相关操作: 。 (1)显示输出一个已经生成的链表 (2)对一个空表插入链表项,插入的新表被放在链表的头部,即前插入 (3)对一个空表追加链表项,追加的新链表项被放在表尾部 (4)两个链相连接,既将一个链表接在另一个链表的尾部 (5)将一个链表的数据项逆向输出; (6)求一个链表的数据项数即长度。 【参考程序】 实验题1参考程序 #include classProduct {public: Product(intn,intq,floatp): num(n),quantity(q),price(p){}; voidtotal(); staticfloataverage(); staticvoiddisplay(); private: intnum; intquantity; floatprice; staticfloatdiscount; staticfloatsum; staticintn; }; voidProduct: : total() {floatrate=1.0; if(quantity>10)rate=0.98*rate; sum=sum+quantity*price*rate*(1-discount); n=n+quantity; } voidProduct: : display() {cout< cout< } floatProduct: : average() {return(sum/n);} floatProduct: : discount=0.05; floatProduct: : sum=0; intProduct: : n=0; intmain() { ProductProd[3]={ Product(101,5,23.5),Product(102,12,24.56),Product(103,100,21.5) }; for(inti=0;i<3;i++) Prod[i].total(); Product: : display(); return0; } 实验题2参考程序 #include classList; classItem { public: friendclassList; Item(intd=0)//节点类代参数的构造函数 { data=d;next=0; } private: Item*next;//指针域 intdata;//数据域 }; classList { public: List(){list=0;}//链表类的默认构造函数 List(intd){list=newItem(d);}//链表类带参数的构造函数 intprint();//打印链表成员函数 intinsert(intd=0);//向链表中插入节点 intappend(intd=0);//向链表中增加节点 voidcat(List&il);//连接两个链表 voidreverse();//倒置一个链表 intlength();//取链表的长度 private: Item*end();//取链表指向最后一个节点的指针 Item*list; }; intList: : print() { if(list==0) { cout<<"empty"< return0; } cout<<"("; intcnt=0; Item*pt=list; while(pt) { if(++cnt%40==1&&cnt! =1) cout< cout< pt=pt->next; } cout<<")"< returncnt; } intList: : insert(intd) { Item*pt=newItem(d); pt->next=list; list=pt; returnd; } intList: : append(intd) { Item*pt=newItem(d); if(list==0) list=pt; else (end())->next=pt; returnd; } Item*List: : end() { Item*prv,*pt; for(prv=pt=list;pt;) { prv=pt; pt=pt->next; } returnprv; } voidList: : cat(List&il) { Item*pt=il.list; while(pt) { append(pt->data); pt=pt->next; } } voidList: : reverse() { Item*pt,*prv,*tmp; prv=0; pt=list; list=end(); while(pt! =list) { tmp=pt->next; pt->next=prv; prv=pt; pt=tmp; } list->next=prv; } intList: : length() { intcnt=0; Item*pt=list; for(;pt;pt=pt->next,cnt++) ; returncnt; } voidmain() { Listlist1; list1.print(); for(inti=10;i<18;i++) list1.insert(i); cout<<"list1: "; list1.print(); Listlist2; for(i=15;i<20;i++) list2.append(i); cout<<"list2: "; list2.print(); cout<<"list1length: "< list2.print(); list2.reverse(); cout<<"list2: "; list2.print(); cout<<"list2length: "< } 【思考题】 1.看看自己还能给实验题目2添加些什么样的操作? 2.如果用静态成员函数访问非静态数据成员,可以么? 实验三类的继承 【实验类型】验证性 【实验要求】必做 【实验目的】 1.了解类的继承的概念和按继承方式的继承分类及各种继承方式的特点。 2.了解并掌握派生类对象的构造和析构过程。 3.了解并掌握单继承,多继承的定义方式。 4.了解多继承情况下产生的二义性及解决办法。 5.了解虚基类的定义,原理和用法,了解存在虚基类的情况下,派生类对象的构造和析构过程。 【实验内容】 实验题1.定义一个继承与派生关系的类体系,在派生类中访问基类成员。 先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员;以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数;定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,不能用派生。 实验题2.由汽车类派生出轿车类和卡车类,再由轿车类和卡车类多重派生出皮卡类。 所谓皮卡指的是轿车的后备箱改为卡车似的后厢,可以兼运少量货物。 汽车类可以说明为虚基类,以避免在皮卡类中出现两组汽车类的数据,请与未说明为虚基类的情况对比。 【参考程序】 实验题1参考程序 #include #include usingnamespacestd; #definePI3.14159 classPoint{ friendclassLine; protected: doublex,y; public: Point(){x=0;y=0;} Point(doublexv,doubleyv){x=xv;y=yv;} doubleArea(){return0;} voidShow(){ cout<<"x="< } }; classCircle: publicPoint{ doubleradius; public: Circle(){x=0;y=0;radius=0;} Circle(doublexv,doubleyv,doublevv): Point(xv,yv){//调用基类构造函数 radius=vv; } Circle(Circle&cir): Point(cir){//按赋值兼容规则cir可为Point构造函数的实参 radius=cir.radius; } Circle&operator=(Circle&cir){ this->Point: : operator=(cir);//在派生类中重载复制赋值操作符有固定的标准格式 radius=cir.radius; return*this; } doubleArea(){ returnPI*radius*radius; } voidShow(){//可以直接访问基类的数据成员 cout<<"x="< } }; classLine{ Pointstart,end;//对象成员 public: Line(): start(0,0),end(0,0){}//注意对象成员初始化的方法 Line(doublexv1,doubleyv1,doublexv2,doubleyv2): start(xv1,yv1),end(xv2,yv2){} doubleGetLength(){ returnsqrt((start.x-end.x)*(start.x-end.x)+(start.y-end.y)*(start.y-end.y)); } doubleArea(){return0;} voidShow(){ cout<<"startpoint: \n"; start.Show(); cout<<"endpoint: \n"; end.Show(); } }; intmain(){ Pointpt(0,0); Circlecl1(100,100,10),cl2(cl1),cl3; Lineln1(0,0,100,100); cout<<"点面积: "<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 指导 C+ 面向 对象 部分