面向对象程序设计实验报告_第1页
面向对象程序设计实验报告_第2页
面向对象程序设计实验报告_第3页
面向对象程序设计实验报告_第4页
面向对象程序设计实验报告_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、面向对象程序设计实验报告学生所在学院:信息科学与工程学院学生所在班级:学生姓名:指导教师:实验 C+基础1.1实验目的.了解并熟悉开发环境,学会调试程序;.熟悉C+中简单的标准输入输出函数的使用方法;.理解const修饰符的作用并学会应用;.理解内联函数的优缺点并学会其使用场合;.理解并学会函数重载;.理解并熟练掌握使用new和delete来分配内存;.理解并熟练掌握引用的使用方法。1.2实验内容121程序阅读.理解下面的程序并运行,然后回答问题。#mcludemt max_def(int x,int y)(ieturn(xy?x:y);)mt max_def(int x,int y,mt z

2、)(mt temp=0;retuin(temp=(xy?x:y)z?temp :z;)double max_def(double x,double y)(ieturn(xy?x:y);)mt inam()(int xl=0;int x2=0;double dl=0.0;double d2=0.0;xl=max_def(5,6);x2 =max_d e 耳2,3,4);d 1 =max_def(2.1,5.6);d2=max_def(12.3,3,4,7.8);coutnx 1=Mx 1 endl;cout,tx2=Mx2endl;coutnd l=Md lendl;coutnd2=Md2end

3、l;leturn 1;j.问题一:上述程序的输出结果是什么? 答:输出结果为同工的文件夹V50Mewexl=6k2=4dl=5 6(12=12Press any key to continue问题二:处调用的是哪个函数?答:处调用的是 double max_def(double x,double y)函数问题三:处的输出结果为什么是d2=12,而不是d2=12.3? 答:因为调用的mt max_def(int x,int y,mt z)函数返回值为整型。.理解下面的程序并运行,然后回答问题。#mcludemt mam() 一 int*pl=new int; 一 mt*p2=new int(O)

4、;chai*p3=new char10; leturn 1;j.问题一:、处动态申请内存分别代表什么意思、?答:处:定义一个整型指针动态分配一个整型空间将首地址赋给pl;处:定义一个整型指针动态分配一个整型空间,并赋值为0;处:定义一个字符型指针动态分配具有10个数组元素的字符数组空间,将 首地址赋给p3。问题二:该程序存在什么不合理的地方?答:程序结束时没有释放分配的存储空间。.理解下面的程序并运行,然后回答问题。#includevoid s ajnt b)(mt temp=a;a=b;b=temp;)void s*a,int*b)(mt temp=*a;*a=*b;*b=temp;)mt

5、mam()(int 1=5;mt j=10;coutnBefoie s,iHj=Mjendl;s);coutHAfter the fiist s,i,j=,jendl;s);coutHAfter the second s,i,j=,jendl;ictuin 1;问题一:输出结果是什么?问题二:处函数调用不能实现两个数的交换,而可以,原因是什么? 答:处调用的函数形参为整型变量,是值传递,形参的改变不影响实参;处调用的函数形参为指针,是址传递,形参的改变会导致实参的改变。 问题三:处调用的是哪个函数?答:调用的函数是void s*a,int*b)。实验二类和对象一一类的构建2.1实验目的.类的定

6、义;.类对象的使用;.类成员变量的定义和使用;.类成员函数的定义和使用;.理解类的作用域;.理解类的声明;.理解类中成员的访问属性;2.2实验内容程序阅读.理解下面的程序并运行,然后回答后面的问题。#mcludeclass CDate(public:void Set(int m,int d,int y)(month=m;day=d;ycar=y;mt IsLeapYeaiQ(letiun (yeai%4=0 & year% 100!=0)11(yeai%400=0);void Pimt()(coutmonth,7Hdayt7Hyeaiendl;private:mt month;mt day;i

7、nt year;void inam()(CDate a;a.Set(10,15,2007);a.Piint();)问题一:以上程序为什么不能通过编译?如何改正?答:因为Set函数被设为私有main函数中无法调用,应在set函数前加public。问题二:类中的成员函数和成员变量分别属于哪种访问权限?答:数据成员为私有,Punt为公有;set原为私有,改正后为公有。问题三:处语句的意思是什么?答:将类定义一个对象a。.理解下面的程序并运行,然后回答问题。.#includemt month;/全局变量mt day;mt year; JJvoid Set(mt m,int djnt y)(:month

8、=m;:day=d;:yea尸y; )class CDate(public:void Set(int m,int d,int y)(:Set(m,d,y);void Pimt()(coutmonth,7Hday,7Hyeaiendl;private:mt month;mt day;int year;;void mam()(CDate a;a.Set(l 0,15,2007);a.Piint();)问题一:处是在给成员变量赋值还是全局变量赋值,如果去掉域作用符:,程序 是否还能正确运行?答:全局变量,不能。问题二:处调用的哪个函数,如果去掉域作用符::,程序是否还能正确运行?答:调用全局set函

9、数;不能。问题三:程序的输出结果是?答:实验三类和对象一一构造函数与析构函数3.1实验目的.理解this指针的作用和用法;.掌握构造函数的定义和作用;.掌握构造函数的使用;.掌握拷贝构造函数的定义和使用;.掌握构造函数的重载;.掌握析构函数的定义和使用。3.2实验内容程序阅读.理解下面的程序并运行,然后回答问题。#mcludeclass CPoint(public:void Set(int xjnt y);void Pimt();private:mt x;int y;;void CPomt:Set(int xjnt y)(x=x;y=y;)void CPomt:Pnnt()(cout,tx=,

10、x,y=uyendl;)void mam()(CPoint pt;pt. Set( 10,20);pt.PnntO;)问题一:以上程序编译能通过吗?如果不能,原因是什么?答:能通过编译。问题二:以上程序的运行结构是否正确,如果不正确,分析为什么,如何改正? 答:运行结构不正确,因为Set函数中,x=x,参数x覆盖数据成员,使得数据成 员并没有被赋值。.理解下面的程序并运行,然后回答后面的问题。mcludeclass CPerson(public:void Pimt();private:CPerson();private:mt age;chai*name;CPei son: :CPeisonQ(

11、)void CPeison:PnntO(coutnnamc=,naineage=,ageendl;)void mam()(CPerson ps(23,张三);ps.PnntO;)问题一:以上程序存在三个错误,在不改变主函数内容的前提下,试改正该程序。 答:第一处错误是:在程序头应添加#includestnng.h文件,第二处错误是:构造 函数没有参数,应添加为(mt 1,chaij),第三处错误是:构造函数没有函数体。改正 后的程序为:#mclude#includcclass CPerson(public:void Pimt();CPerson(int i ,chai *j);public:m

12、t age;chai *name;CPeison: :CPeison(mt i.char *j)(age=i;nainej;void CPeison:PnntQ(coutnname=,nameage=,ageendl;)void inam()(CPerson ps(23,“张三”);ps.PnntQ;实验四类和对象一对象传递与静态成员实验目的.静态成员(静态数据成员、静态成员函数)的作用与使用时的注意事项 2.学友元(友元函数、友元类)的作用和使用;3.理解常类型。4.2实验内容程序阅读.理解下面的程序并运行,然后回答后面的问题。#mclude#include class CStiident

13、( public:CSnident(char*njnt a);C Student。;static void SetAge(int age);private:chai*name;mt age;static int nTotalObj;mt CStiident:nTotalObj=0;CStudent:CStudent(char*n,int a):age(a)(mt nLcn=strlen(n);naine=new chaiiiLen+l;strcpy(name,n);nameiiLen=t;nTotalObj+;)CStudent:CStudent。(deletename;nTotalObj-;

14、)void CStudent:SetAge(mt age)(this-age=age;)void mam()(CStudent stul(“张三”,25);CStudent str2(“ 李四 ”,26);coutnCStudent:nTotalObj=,CStiident:nTotalObjendl;)问题一:以上程序编译能通过吗,为什么?答:不能,CStudent:nTotalObj为私有变量,类引不能访问。问题二:成员变量nTotalObj起什么作用,它是如何实现的?答:统计该类所创建对象的个数,通过声明为静态。问题三:如果不改编主函数和类Cstudent中的成员变量的属性,应该如何改正

15、该程 序?答:可以将static int nTotalObj声明为公有。.理解下面的程序并运行,然后回答后面的问题。#mclude#mc ludeclass CStiident(public:CStiident(chai*njnt a);C Student。;private:chai*name;mt age;;CStudcnt: :CStudent(char*n,int a):age(a)(mt iiLcn=strlen(n); naine=new chaiiiLen+l; strcpy(name,n);nainenLen=r;)CStudent:CStudent。(deletename;)c

16、lass CTeacher(public:CTeachei(chai*tn4nt ta);-CTeacheiQ;void SetStuAge(int a);private:chai*name;mt age;CSmdent stu;;CTeacher:CTeachei(chai*tnjnt ta) :age(ta) (mt iiLcn=strlen(tn); naine=new chaiiiLen+l; strcpy(name,tn);nainenLen=r;CTeachci:CTeachei。(deletename;)void CTeacher: SetStuAge(int a)(stii.a

17、ge=a;)void inam()(CStudent stul(“张三”,25);CStudent str2(“ 李四 ”,26);)问题一:以上程序有两个错误,指出并改正。答:第一处错误是Cstiident age为私有,Cteachei无法访问。第二处错误是Cteachei中Cstiident未初始化。改正: public:int ageCteachei:Ctcachei(char*tn4iit ta):age(ta),stii(tn,ta).理解下面的程序并运行,然后回答后面的问题。#mcludeclass Date(private:const int year;const int mo

18、nth;const int day;public:Date(mt yjnt m,int d);void showdate();Date:Date(mt y,mt mjnt d)(yeax=y;month=m;day=d;void Date:showdate()coutyear,7Hmonth,7,dayendl;)void inam()(const Date obj(2007,10,30);obj.showdate();)问题一:以上程序有两个错误,试指出来,并改正之?答:第一处错误是:构造函数应该用成员初始化列表对常数据成员初始化;第二处 错误是:没有用常成员函数访问常对象数据成员。改正后的

19、程序为:#mcludeusing namespace std;class Date(private:const int year;const int month;const int day;public:Date(mt y,int m,int d);void showdate()const;Date:Date(int y,mt mjnt d):ycar(y),month(m),day(d)(void Date:showdate()const(coutyeai,7,month,7,dayendl;)void mam()(Date obj(2007J0,30);obj.showdate();实验五

20、派生与继承一单基派生5.1实验目的d.pnnt();CBase b;b.pnnt();j.问题一:以上程序有两个错误,试指出来,并改正之。答:类CBase中的成员数据应该为公有访问属性,第二个错误是构造函数有问题。 改正后的程序有两种:#mcludeusing namespace std;class CBase(public:CBase(mt a):a(a)( Void piint()(coutua=Haendl; public:mt a;;class CDenve:public CBase(public:CDenve(int ajnt b):CBase(a),b(b) / ivoid pnn

21、tQ(CBasecoutub=Mbendl;) private:mt b;;CDenve d(6,4); d.pimt();CBase b(5); b.pimt();#mclude using namespace std; class CBasejpublic:void pimtQ(coutua=Haendl; public:mt a;class CDenve:public CBase public:void pnntQ(CBase :pimtO;coutnb=Mbendl;private:mt b;void inain()CDenve d;d.pnnt();CBase b; b.pnnt()

22、;)2.理解下面的程序并运行,然后回答后面的问题。#uicludeniostieam.hH class CBase (public:CBase(mt a) :a(a) (coutHbase stnictuienendl;CBase() (coutHbase destmcnneMendl;void pnntO (coutna=Haendl; protected:mt a;class CDenve:public CBase (public:CDenve(int ajnt b,int c) :CBase(a),b(b),c(c) (cout,rdeivice stmctmeMendl;CDeiive

23、()cout,rdenve destn.ictuieHendl; void pnntQ(CBase:pimtO;coutnb.a=Hb.aendl; coutnc=,cendl; private:CBase b;int c;void inam()(CDenve d(l,2,3);d.pnnt();)问题一:以上程序的输出结果是什么,为什么? 答:输出结果是图 C:W indowssystem32cmd.exebase structure base structure deruice structure a=l b.a=2 c =3 deriue destructure base destrue

24、ture base destructure 请按任意键继续.原因是基类和派生类中构造函数和析构函数的执行顺序。 问题二:处语句执行完后,d.b.a的值为多少?答:值为1。实验六派生与继承一多基派生实验目的.理解多基派生的定义;.基派生中的构造函数与析构函数的调用顺序;.理解多基派生中虚基类的作用。实验内容程序阅读1.理解下面的程序并运行,然后回答后面的问题。 class CBascl(public:CBasel(int a) :a(a) (coutnbasel stmcture.Mendl;CBasel()(coutHbasel destinetuie.Hendl;void piintQ( c

25、outua=Haendl;protected:mt a;class CBase2(public:CBase2(int b) :b(b) coutnbase2 stmctuie.nendl;CBase2()(coutnbase2 destmctiue.Mendl;void pnntOcoutub=nbendl; piotected:int b;class CDenve:public CBasel,public CBase2(public:CDenve()(coutudenve stmctiue.Mendl;CDeiive。 scoutHdenve destmctuie.nendl;void pn

26、ntO(CBasel:prmt();CBase2:pimt();bl.pnntO;b2.pinitQ;cout,c=,lcendl;private:CBasel bl;CBase2 b2; mt c;void mam()(CDenve d;d.pnnt();)问题一:改正以上程序中的错误,并分析输出结果。答:CBasel与CBase2没有合适的构造函数,改正方法在CBasel,CBase2设置缺省 值为0改正:将 CDenve 构造函数改为:CDenve(int a,int b,int c):CBase l(a),CBase2(b),b l(a),b2(b),c(c)(cout,rdenve

27、stmctiire.Mendl;主函数中 CDenve d:改为 CDenve d (1,2,3);输出结果是:西C:windowssystem32cnnd.exe-bft&el structure. hase2 structure. base! structure. basc2 structure. dei*iue structure, a*i h=2b*2c=3 derive destructure. h*se2 d&stucture 3.d&fitructure. base2 d&structurc. base! destucture. 请按任意键雉续,一实验七多态性一函数与运算符的重载

28、7.1实验目的.理解静态联编和动态联编的概念;.掌握成员函数方式运算符重载;.掌握友元函数方式运算符重载;.掌握+、=运算符的重载。.2实验内容.理解下面的程序并运行,然后回答后面的问题。#uicludeniostieam.hHclass CCoinplex(public:CCoinplex()(ieal=0;unag=0;CCoinplex(int x,mt y)(ieal=x;unag-y;mt real;mt iinag;CCoinplex opeiator+(CComplex objl) (CCoinplex obj2(ieal+obj 1 .ieal,Hnag+obj l.unag)

29、; letiun obj2;void inain()CCoinplex obj 1(100,30);CCoinplex obj2(20,30);CCoinplex obj; obj=objl+obj2; coutobj .iealendl; coutobj .unagendl;问题一:处的运算符重载,为什么该函数的返回值要设计成Ccomplex类型? 答:处运算符重载,要返回两个值real和imag,所以函数返回值类型设计为 CCoinplex 类型。问题二:处的运算符重载函数调用就相当于obj=ope皿0什(objl, obj2);”,请 问CComplex类中的运算符重载函数为什么只有一个

30、参数? 答:因为调用重载运算符的对象本身相当于一个参数。课后习题第二章一实验目的.掌握引用的使用。.掌握调用函数的方法。二.实验内容.19写出下列程序的运行结果。#mclude using namespace std; void f(mt n) mt temp; tcmp=m; m=n;n=temp;lilt inam() mt a=5,b=10;f(a,b)couta5,bendl;retuin 0;三.实验结果四,心得体会.引用可以作为函数形参,和指针变量作为函数参数效果一样,但是引用作为函数 参数更清晰。.弟二早一.实验目的L掌握静态数据成员的使用。2.掌握静态成员函数的使用。二.实验内

31、容3.26写出下列程序的运行结果。#mclude using namespace std; Class M mt A;static int B;public: M(mt a) ( A=a;B+=a;coutConstmctingn,5endl;)Static void fl(M m);M() coutDestmctingnendl;);VoidCoutA=,5m.Aendl;Cout,B-,bendl;)mt M:B=O;mt inam()(MP(5),Q(10);M:fl(Q);Retiun 0;三.实验结果&B C:Windowssystem32cmd.exeConstructingConstructingA =5B=15DestructingA=10B=15DestructingDestructingDestructing请按任意键继续. . .四,心得体会.静态数据成员主要用作类的所有对象所公用的数据,它在类的任何对象建立前就 存在了。.一般情况下,静态成员函数来访问静态数据成员。第四章一.实验目的.掌握派生类的继承方式。.掌握派生类构造函数和析构函数。.掌握派生类构造函数

温馨提示

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

评论

0/150

提交评论