类与对象.docx
- 文档编号:23252158
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:17
- 大小:214.50KB
类与对象.docx
《类与对象.docx》由会员分享,可在线阅读,更多相关《类与对象.docx(17页珍藏版)》请在冰豆网上搜索。
类与对象
南昌大学实验报告
一、实验名称
实验4类与对象
二、实验目的
类是C++扩展数据类型,可以封装不同类型的数据成员和函数成员,类是面向对象程序设计的基础。
本次实验内容包括面向对象的基本概念、构造函数与析构函数,从实际问题抽象出类等,通过实验要求:
1、掌握面向对象的基本概念,类的定义方法;
2、掌握类成员的访问权限及访问类成员的方法;
3、掌握内联函数;
4、掌握引用概念及应用,引用作为函数参数;
5、掌握构造函数与析构函数的意义及使用方法。
三、实验内容
1、验证课本例子4-7
2、课本4-11,4-13
3、程序输出的结果:
classComplex
{
private:
doublem_real;
doublem_imag;
public:
Complex(void)
{
m_real=0.0;
m_imag=0.0;
cout<<"调用了构造函数Complex(void)"< } Complex(doublereal,doubleimag) { m_real=real; m_imag=imag; cout<<"调用了构造函数Complex(doublereal,doubleimag)"< } Complex(constComplex&c) { //将对象c中的数据成员值复制过来 m_real=c.m_real; m_imag=c.m_imag; cout<<"调用了拷贝构造函数Complex(constComplex&c)"< } Complex: : Complex(doubler) { m_real=r; m_imag=0.0; cout<<"调用了构造函数Complex(doubler)"< } Complex&operator=(constComplex&rhs) { //首先检测等号右边的是否就是左边的对象本,若是本对象本身,则直接返回 if(this==&rhs) { return*this; } //复制等号右边的成员到左边的对象中 this->m_real=rhs.m_real; this->m_imag=rhs.m_imag; //把等号左边的对象再次传出 //目的是为了支持连等eg: a=b=c系统首先运行b=c //然后运行a=(b=c的返回值,这里应该是复制c值后的b对象) cout<<"调用了=操作符重载"< return*this; } }; voidmain() { Complexc1,c2; Complexc3(1.0,2.5); Complexc4=Complex(1.0,2.5); c1=c3; c2=5.2; Complexc5(c2); Complexc6=c2; } (1)仔细观察复制构造函数,为什么函数中可以直接访问对象c的私有成员? Complex(constComplex&c) { //将对象c中的数据成员值复制过来 m_real=c.m_real; m_img=c.m_img; } (2)分析引用与传值的区别 Complextest1(constComplex&c) { returnc; } Complextest2(constComplexc) { returnc; } voidmain() { Complexa,b; //下面函数执行过程中各会调用几次构造函数,调用的是什么构造函数? test1(a); test2(a); test2(1.2); //下面这条语句会出错吗? test1(1.2); //test1(Complex(1.2))呢? } 4、有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。 木杆很细,不能同时通过一只蚂蚁。 开始时,蚂蚁的头向(右,左,右,左,左),它们只会朝前走或调头,但不会后退。 当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。 假设蚂蚁们每秒钟可以走一厘米的距离。 定义一个蚂蚁类Ant,编写程序,求所有蚂蚁都离开木杆的时间。 四、实验环境 PC微机 Windows7操作系统 MicrosoftVisualStudio2012集成开发环境; MicrosoftVisualStudio2012集成开发环境的MSDN 五、实验步骤 编程实现实验内容 1.实验结果 2. 4-11源代码 #include usingnamespacestd; //类的声明 classRectangle { private: intlenth; intwidth; public: intgetLength(); intgetWidth(); intcalArea(); Rectangle(); ~Rectangle(); Rectangle(intlen,intwid); Rectangle(constRectangle&rec); }; intRectangle: : getLength() { returnlenth; } intRectangle: : getWidth() { returnwidth; } intRectangle: : calArea() { returnlenth*width; } Rectangle: : Rectangle() { } Rectangle: : ~Rectangle() { } Rectangle: : Rectangle(intlen,intwid) { this->lenth=len; this->width=wid; } Rectangle: : Rectangle(constRectangle&rec) { this->lenth=rec.lenth; this->width=rec.width; } voidmain() { intlength,width; cout<<"请输入长方形的长和宽: "< cin>>length>>width; RectangleR1(length,width); cout<<"初始化一个长为4,宽为6的长方形"< RectangleR2(5,6); RectangleR3(R1); RectangleR4(R2); cout<<"R1的长是: "< "< "< cout<<"R2的长是: "< "< "< cout<<"R3的长是: "< "< "< cout<<"R4的长是: "< "< "< system("pause"); } 输出结果: 4-13源代码 #include usingnamespacestd; #definePI3.14159 classCircle { private: floatRadius; public: Circle(floatradius){Radius=radius;} ~Circle(){} floatgerArea(){returnPI*Radius*Radius;} }; intmain() { floatradius; cout<<"请输入圆的半径: "; cin>>radius; CircleC(radius); cout<<"这个圆的半径为: "< "< system("pause"); } 输出结果 3、 (1)仔细观察复制构造函数,为什么函数中可以直接访问对象c的私有成员? Complex(constComplex&c) { //将对象c中的数据成员值复制过来 m_real=c.m_real; m_img=c.m_img; } 这里是直接调用 对象c的复制构造函数,用来构造一个新对象。 因此可以直接访问 (2)分析引用与传值的区别 Complextest1(constComplex&c) { returnc; } Complextest2(constComplexc) { returnc; } voidmain() { Complexa,b; //下面函数执行过程中各会调用几次构造函数,调用的是什么构造函数? test1(a); test2(a); test2(1.2); //下面这条语句会出错吗? test1(1.2); //test1(Complex(1.2))呢? } 以上函数运行的结果: 4、源代码 #include #include usingnamespacestd; classAnt { private: intspeed; intposition; intdriection;//0表示左,1表示右 public: Ant(intsp,intpos,intdir); intgetPosition(); intgetDriection(); boolisLeave(); voidsetDriection(intdir); voidmoveLeft(); voidmoveRight(); }; voidAnt: : moveLeft() { position-=speed; } voidAnt: : moveRight() { position+=speed; } Ant: : Ant(intsp,intpos,intdir) { speed=sp; position=pos; driection=dir; } intAnt: : getPosition() { returnthis->position; } intAnt: : getDriection() { returnthis->driection; } voidAnt: : setDriection(intdir) { this->driection=dir; } boolAnt: : isLeave() { if(this->position>27||this->position<0) returntrue; else returnfalse; } //蚂蚁移动 voidmoves(Ant&a) { if(a.getDriection()==1) a.moveRight(); else a.moveLeft(); } ////////////////////////////////////////////////////////////////////////// //显示蚂蚁位置 ////////////////////////////////////////////////////////////////////////// voiddisplay(Anta1,Anta2,Anta3,Anta4,Anta5) { cout<<"\t"; cout< setw(a2.getPosition()-a1.getPosition()+1)<<""<<"*"<< setw(a3.getPosition()-a2.getPosition()+1)<<""<<"*"<< setw(a4.getPosition()-a3.getPosition()+1)<<""<<"*"<< setw(a5.getPosition()-a4.getPosition()+1)<<""<<"*"< cout<<"\t"; for(inti=0;i<40;i++) cout<<"_"; cout< } //蚂蚁移动的逻辑判断 voidmove(Ant&aL,Ant&a,Ant&aR) { if(! a.isLeave()) { if(a.getDriection()==1) if(aR.getDriection()! =a.getDriection()) { if((aR.getPosition()-a.getPosition())==1) { a.setDriection(abs(a.getDriection()-1)); aR.setDriection(abs(a.getDriection()-1)); moves(a); } else moves(a); } else moves(a); else { if(a.getDriection()! =aL.getDriection()) { if((a.getPosition()-aL.getPosition())==1) { a.setDriection(abs(a.getDriection()-1)); aL.setDriection(abs(aL.getDriection()-1)); moves(a); } else moves(a);} else moves(a); } } } voidmain() { intlength=27,time=0; Anta0(0,-10,0),a6(0,37,1);//两只虚拟蚂蚁 Anta1(1,3,1),a2(1,7,0),a3(1,11,1),a4(1,17,0),a5(1,23,0); cout<<"蚂蚁的实时位置: "< while (1) { move(a0,a1,a2); move(a1,a2,a3); move(a2,a3,a4); move(a3,a4,a5); move(a4,a5,a6); display(a1,a2,a3,a4,a5); time++; if(a1.isLeave()&&a2.isLeave()&&a3.isLeave()&&a4.isLeave()&&a5.isLeave()) break; } cout<<"总共花了"<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 对象