《2023年面向对象程序设计实验报告.pdf》由会员分享,可在线阅读,更多相关《2023年面向对象程序设计实验报告.pdf(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象程序设计实验报告学生所在学院:信息科学与工程学院学生所在班级:学生姓名:指导教师:实验 C+基础1.1 实验目的1.了解并熟悉开发环境,学会调试程序;2.熟悉C+中简朴的标准输入输出函数的使用方法;3.理解c o n s t 修饰符的作用并学会应用;4.理解内联函数的优缺陷并学会其使用场合;5.理解并学会函数重载;6.理解并纯熟掌握使用n e w 和 delete来分派内存;7.理解并纯熟掌握引用的使用方法。1.2 实验内容1.2.1 程序阅读1.理解下面的程序并运营,然后回答问题。#i n c lu d ei n t max_def(in t x,int y)(ret u m(xy?
2、x:y);i nt max_ d ef(int x,int y,int z)(i n t t e mp=0;r e t u rn(t emp=(xy?x:y)z?temp:z;d oub 1 e max_def(d o u b le x,do u ble y)return(xy?x:y);)in t main()(int x 1=0;oint x 2=0;d o u b 1 e dl=0.0;d ou b 1 e d 2=0.0;ox 1 =m ax_ def(5,6);2=m a x _d e f(2,3,4 );。d 1 =max_ d ef(2.1,5.6);od2=m a x _def
3、(12.3,3.4,7.8);-co u t ,xl=x l e n dl;coutnx 2=,x2 e n d 1 ;coutdl=*d 1 endl;cout,d2=,d 2endl;-,or e tur n 1 ;问题一:上述程序的输出结果是什么?答:输出结果为问题二:处调用的是哪个函数?答:处调用的是 dou b le m a x_ d e f(doub 1 e x,d ou b 1 e y)函数问题三:处的输出结果为什么是d 2=1 2,而不是d 2=12.3?答:由于调用的int m a x_de f(in t x,i n t y,int z)函数返回值为整型。2.理解下面的程序并
4、运营,然后回答问题。#i nc 1 ud e i n t main()i n t*p 1=new int;-Q?int*p2=n e w in t(O)一 char*p 3=n e w cha r 10;oretu r n 1;)问题一:、处动态申请内存分别代表什么意思?答:处:定义一个整型指针动态分派一个整型空间将首地址赋给pl;处:定义一个整型指针动态分派一个整型空间,并赋值为0;处:定义一个字符型指针动态分派具有1 0 个数组元素的字符数组空间,将首地址赋给p3o问题二:该程序存在什么不合理的地方?答:程序结束时没有释放分派的存储空间。3.理解下面的程序并运营,然后回答问题。#i ncl
5、u d ev o id sw a p(i n t a,i n t b)int temp=a;a=b;b=t emp;)v o id s w ap(in t*a,i nt*b)(i nt t emp=*a;*a=*b;*b=t emp;i nt ma i n()(int i=5;int j=10;cou t nBefo r e swap:i=i ,j=,jendl;。s w ap(i,j);ocoutA f te r t h e f irs t swap:i=n i ,j=j e ndl;s wap(&i,&j);co u t After t h e s e c o n d sw a p:i=H
6、 i n,j=j end 1 ;ore t u r n 1;)问题一:输出结果是什么?答问题二:处函数调用不能实现两个数的互换,而可以,因素是什么?答:处调用的函数形参为整型变量,是值传递,形参的改变不影响实参;处调用的函数形参为指针,是址传递,形参的改变会导致实参的改变。问题三:处调用的是哪个函数?答:调用的函数是 v oid swap(int*a,i n t*b)。实 验 二 类和对象一一类的构建2.1 实验目的1类的定义;2.类对象的使用;3.类成员变量的定义和使用;4.类成员函数的定义和使用;5.理解类的作用域;6 .理解类的声明:7.理解类中成员的访问属性;2.2 实验内容2.2.1
7、程序阅读1.理解下面的程序并运营,然后回答后面的问题。#includeclass C D a te(pu b lie:v oid Set(i n t m,i n t d,i n t y)month二m;d a y=d;oy e a r=y;)i n t I sLeapY e ar()。retu r n(year%4=0&y ea r%10 0!=0)|(ye a r%4 00=0);)v o i d Prin t()o c o u tmo n th /d a y /M y e a rendl;)private:i n t mont h;i n t day;i nt year;);vo i d
8、ma i n()(C Date a;a.Set(10,l 5,20 2 3);a.P r in t();问题一:以上程序为什么不能通过编译?如何改正?答 油 于 Set函数被设为私有m a in 函数中无法调用,应在set函数前加public。问题二:类中的成员函数和成员变量分别属于哪种访问权限?答:数据成员为私有,P r in t为公有;set原为私有,改正后为公有。问题三:处语句的意思是什么?答:将类定义一个对象a。2.理解下面的程序并运营,然后回答问题。.#includeint month;全局变量int d a y;in t y e a r;voi d Set(i n t m,i nt
9、 d,int y)(:month二 m;:day=d;。::y ea r=y;)c la s s C Datepublic:v oi d S e t(i nt m,int d,int y)。::S e t(m,d,y);void Prin t()。c o utm onth7n da y 7n y ea re n d 1 ;)private:i n t month;o i nt da y;。i n t yea r;;void m a in()(CDa t e a;oa.Set(1 0,1 5,2023);a.Pri nt();)问题一:处是在给成员变量赋值还是全局变量赋值,假如去掉域作用符:,程
10、序是否还能对的运营?答:全局变量,不能。问题二:处调用的哪个函数,假如去掉域作用符:,程序是否还能对的运营?答:调用全局s e t 函数;不能。问题三:程序的输出结果是?答实验三类和对象一一构造函数与析构函数3.1 实验目的1.理 解 t his指针的作用和用法;2.掌握构造函数的定义和作用;3 .掌握构造函数的使用;4.掌握拷贝构造函数的定义和使用;5 .掌握构造函数的重载;6.掌握析构函数的定义和使用。3.2实验内容3.2.1 程序阅读1 .理解下面的程序并运营,然后回答问题。#in c 1 u declass C P oin tpu b l i e:void Set(in t x,int
11、 y);v oid P r i nt();priv a te:oint x;inty;v oid CP o i n t:Se t(int x,int y)(x=x;y=y;)v oi d C Point::Pri n t()(cou t H x=u x,y=,y e n dl;)void mai n()(eCPoint pt;p t,Se t(10,20);opt.Print();问题一:以上程序编译能通过吗?假如不能,因素是什么?答:能通过编译。问题二:以上程序的运营结构是否对的,假如不对的,分析为什么,如何改正?答:运营结构不对的,由于S e i 函数中,x=x,参 数 x 覆盖数据成员,
12、使得数据成员并没有被赋值。2.理解下面的程序并运营,然后回答后面的问题。in c 1 u d ec 1 a ss CPerson(p u blic:voi d P r int();privat e:(P e r so n();p rivate:eint ag e;c h a r*n ame;);CPe r s o n:C Per s on()vo i d CPers o n::Print()c o u tHnam e=nnam e u,ag e=a geendl;)v o id main()(oCPers o n p s(2 3,“张三“);ps.Pr i n t();)问题一:以上程序存在三
13、个错误,在不改变主函数内容的前提下,试改正该程序。答:第一处错误是:在程序头应添加#皿c lude文献,第二处错误是:构造函数没有参数,应添加为(int i,cha r j),第三处错误是:构造函数没有函数体。改正后的程序为:#in c lu d e#inc 1 u dec la s s C P erson(pu b lie:void P rin t();CPerson(int i,char*j);public:in t a g e;char*n ame;;CPe r son::C Perso n(i n i i,ch a r*j)(a g e=i;n ame=j;)v o id CPer s
14、 on:P rint()(c o ut name=n ame,a ge=ag e e n d 1 ;)v o i d mai n()CPerson p s(2 );ps.P r int();实验四类和对象一对象传递与静态成员4.1实验目的1.静态成员(静态数据成员、静态成员函数)的作用与使用时的注意事项2.掌友元(友元函数、友元类)的作用和使用;3.理解常类型。4.2 实验内容4.2.1 程序阅读1.理解下面的程序并运营,然后回答后面的问题。#include#i n c 1 udecla s s CStu d ent(publ i c:C S tudent(c h a r*n,in t a);
15、oCStu d en t();static v o i d S e tAge(int a g e);p riv a te:char*n ame;i n t age;static int nT o t a lObj;);i n t CStud e nt::n T otalObj=0;C Stu d ent::CSt u den t(c har*n,i n t a):a g e (a)in t nL c n=strlen(n);n ame=new char n Le n+1 ;ostrcp y(name,n);nam e nL e nl-XO7;nT o t a 1 Ob j+;)CS t u d
16、ent:CStud e nt()(d e leten a m e;nTotalObj-;v o id CS t udent:Set Ag e(i nt a g e)(。t his-a g e=age;void mai n()(CStu dent s tul(“张三”,2 5);。C Student str2(“李四”,26);o c o u tC S t udent:nTotalO b j=CS t ude n t:nT o talO b j en d l;)问题一:以上程序编译能通过吗,为什么?答:不能,CStudent:nTotalO bj为私有变量,类引不能访问。问题二:成员变量nTo
17、t alO b j 起什么作用,它是如何实现的?答:记录该类所创建对象的个数,通过声明为静态。问题三:假如不改编主函数和类Cs t udent中的成员变量的属性,应当如何改正该程序?答:可以将static i n t nTota 1 Obj声明为公有。2.理解下面的程序并运营,然后回答后面的问题。#in c 1 u d e#i n c 1 ud e c 1 a ss CS t ud e nt(public:oCStud e nt(char*n,int a);C S t u dent();privat e:char*n a me;。i n t ag e;);C S tud e nt:CS t u
18、 den t(c har*n,int a):age(a)o i n t nLen=s t r 1 en(n);n a me=n ew charnL e n+1;strcpy(name,n);nam enLen=0;)CStuden t::CStu d e nt()(del e t e n a me;)c 1 a ss CTea c h e r(p ubli c:CTeac h e r(c har*t n,i nt ta);CTe a c h e r();vo i d SetStu Ag e(int a);private:c har*name;int age;CSt u dent st u;CT
19、ea c her:CTeac h er(char*tn,i n t ta):age(t a)in t n Len=st r 1 e n(t n);name=new cha r nL e n+1 ;strcpy(n a me,t n);namen Le n =z 0;)CT e a c h e r::CT e ac h er()(delete 口 name;)void C Teacher::SetS t uAge(i n t a)(s t u.a ge=a;)vo i d m a i n()(oCStu d e n t s tul(“张 三 ,25);oCStud e n t str2(“李四”
20、,26);)问题一:以上程序有两个错误,指出并改正。答:第一处错误是C stud e nt a g e 为私有,Ct e acher无法访问。第二处错误是Cteacher中 C s tudent未初始化。改正:pub 1 ic:i n t a g eCte a c her:Cteache r(c h a r*tn,i nt ta):a g e(ta),stu(tn,t a)3.理解下面的程序并运营,然后回答后面的问题。#i n cludecla s s D ate(p rivate:const in t y ear;*con s t int mont h;con s t int d ay;p
21、u b li c:Da t e(i n t y,int m,i nt d);void sh o w d ate(););Date:Date(i n t y,int m,int d)(y e a r=y;month=m;?day=d;v oi d D a te :showdate()cou t yearu/m o n t h7 day en d 1 ;v o i d ma i n()(const Dat e obj(2 0 2 3,10,30);ob j.s h owda t e();问题一:以上程序有两个错误,试指出来,并改正之?答:第一处错误是:构造函数应当用成员初始化列表对常数据成员初始化
22、;第二处错误是:没有用常成员函数访问常对象数据成员。改正后的程序为:#in c lu d eu s ing n a m e sp a ce std;clas s Da t e(p rivate:c o n st i nt yea r;const in t mont h;oco n s t in t da y;p ubl i c:Date(int y,int m,i nt d);void s h o wdate()c o n s t;;D ate:Date(i nt y,i n t m,i n t d):year(y),mo n t h(m),day(d)void Date:sho wda t
23、e()co n s t(ocou t y e a r 7n m o n t h /d a y e nd 1 ;)v o i d mai n()(Date obj(2 0 2 3,1 0,30);o o b j.showdate();)实验五派生与继承一单基派生5.1 实验目的1.理解继承的概念;2.理解共有派生、私有派生和保护派生;3.理解单基派生类中构造函数和析构函数的执行顺序.5.2 实验内容5.2.1 程序阅读1.理解下面的程序并运营,然后回答后面的问题。#in c ludeclass CBa s e(public:CB a s e(i n t a)。:a(a)。p r o t e c
24、t e d:ov o id p ri n t()(oco u t M a=,a e n d 1 ;)privat e:int a;);c l a s s CDer i ve:p ubl i c CBasepub 1 ic:v o id p rint()C B a se::prin t();o c o utb=u b en d 1;)private:“nt b;)void main()(CDerive d;d.print();C B a se b;b.p ri n t();)问题一:以上程序有两个错误,试指出来,并改正之。答:类 CBase中的成员数据应当为公有访问属性,第二个错误是构造函数有问
25、题。改正后的程序有两种:#inc 1 ud e usi n g namespa c e std;c la s s CBasep ublic:C B a se(int a):a(a)Void print()(0 coli tv v a=,a endl;。public:n t a;);c 1 ass C Deri v e:p ublic C Ba s e(p ubl i c:6CDe r ive(i n t a,i n t b):C Base(a)b(b)()v o id prin t()(CBa s e:print();“co u t H b=Mbendl;privat e:int b;);vo
26、id ma i n()(eCD e rive d(6,4);0d.pri n t();(B ase b(5);。b.pri n t();)#incl u deu s in g nam e s pa c e std;cl a s s CBase(pu b 1 i c:void prin t()(0co u t n a=aen d 1;p u b l i c:o i n t a;);c l a s s C De r i v e:p u b 1 i c C B a s e(p u b 1 i c:0o v o i d p r i n t()(C B a s e ::p r i n t();。c o
27、u t b=*b e n d l;0)p r i v a t e:o i n t b;);v o i d ma i n()(CD e r i v e d;o d.p r i n t ();C B a s e b;o b .p r i n t ();2.理解下面的程序并运营,然后回答后面的问题。#i ncludeio s tr e am.hclassCBa s e(p u b 1 i c:C B ase(int a)。:a(a)。oco u t Mba s e structu r e*e nd 1 ;CBase()(w o u t M b a se destructuren e ndl;v o
28、i d p r in t()(0co u t n a=H a en d 1;)pr o t e c t ed:oi n t a;);class CDe r ive:p u b lie CBa s e(public:CDerive(i n t a,int b,int c)。:CBase(a),b(b),c(c)cou t udervice s t r u cturen e n dl;C D er i v e()(oc o u t Hderi v e dest r uctur e*e nd 1 ;vo i d p r i nt()(CBa s e:pr i n t();c o u tn b.a=H
29、 b.aendl;cout c=cen d 1;。pr i vate:eC B as e b;i n t c;);vo i d ma i n()CD e rive d(1,2,3);d.p r int();问题一:以上程序的输出结果是什么,为什么?答:输出结果是因素是基类和派生类中构造函数和析构函数的执行顺序。SB C:Windowssystem32cmd.exe base structurebase structurederuice structurea=lb.a=2c=3deriue destructurebase destructurebase destructure请按任意键继续.1问
30、题二:处语句执行完后,d.b.a的值为多少?答:值为lo实验六派生与继承一多基派生6.1 实验目的1 .理解多基派生的定义;2.基派生中的构造函数与析构函数的调用顺序;3.理解多基派生中虚基类的作用。6.2实验内容6.2.1 程序阅读1.理解下面的程序并运营,然后回答后面的问题。c las s C B a se 1(p u blic:C Base 1(i nt a)0:a(a)(。coutba s e i struc t ure.nendl;CBasel()c o ut b asel d e struc t ure.Hen d 1 ;vo i d pri n t()acout,a=aendl;
31、)p r otec te d:in t a;);c 1 ass C Base2(publi c:CB a se2(in t b):b(b)(。空 o u tHbase2 s tr u c tu r e .CD e r ive()ocoutnde r i v e str u c t ur e Ve n dl;o-CDeriv e()(ocout de r i ved e struc t ur e.n e nd 1 ;)void print()CBase 1:pri nt();CBase 2:prin t();。b 1 .p r in t();b2.p rint();cout c=ce n dl;
32、pri v a te:CBa s el b 1;CBase2 b2;i n t c;);void m a in()(C D erive d;d.prin t();)问题一:改正以上程序中的错误,并分析输出结果。答:C B asel与 CBas e 2 没有合适的构造函数,改正方法在C Base 1,CB a s2 设立缺省值为0改正:将 CDeriv e 构造函数改为:C Deriv e(in t a,int b,i n t c):C B ase 1 (a),CBase 2(b),b 1(a),b2(b),c(c)(coutd e rive s t r ucture.M en d 1;主函数中
33、 CDe r ive d;改为 C Deri v e d(1,2,3);输出结果是:C:windowssystem32cmd.exebasel stru ctu r e.base2 stru ctu re.basel stru ctu re.base2 stru ctu re.derive stru ctu re.1b=2长 1b-2c-3derive destru cture.base2 destm icture.bsel destm icture.base2 destructure.basel destru cture.请按任意键继续.实验七多态性一函数与运算符的重载7.1 实验目的1.理
34、解静态联编和动态联编的概念;2.掌握成员函数方式运算符重载;3.掌握友元函数方式运算符重载;4.掌握+、一、=运算符的重载。7.2实验内容1.理解下面的程序并运营,然后回答后面的问题。#in c lud e i o stream.hc 1 ass C C omp 1 e x(p u b lie:CC o m p le x()。re a 1=0;dm a g=0;CC o m p lex(int x,in t y)6 r e al=x;im a g-y;)i nt r e al;n t i mag;CComp 1 ex operator+(CC o mp 1 e x o b jl)。CCom p
35、 lex ob j 2(r eal+ob j 1.rea 1 ,ima g+ob j 1.im a g);r et u r n obj2;);v o id main()(Complex objl(100,3 0);CC om p 1 ex obj2(20,30);CC o mplex o b j;b j=objl+o b j2;co u tob j.re a 1 e ndl;coutobj.i magend 1 ;)问题一:处的运算符重载,为什么该函数的返回值要设计成C c。mplex类型?答:处运算符重载,要返回两个值r e a l和 i mag,所以函数返回值类型设计为CCompl e x
36、 类型。问题二:处的运算符重载函数调用就相称于“。bj=operator+(o b j l,obj 2);”,请问CComplex类中的运算符重载函数为什么只有一个参数?答:由于调用重载运算符的对象自身相称于一个参数。课后习题第二章一 实验目的1.掌握引用的使用。2.掌握调用函数的方法。二.实验内容2.1 9 写出下列程序的运营结果。#includeusi n g namespace std;vo i d f(int&m,int n)(i n t t emp;t emp=m;m=n;n=temp;)In t m a in()(i n t a=5,b=10;f(a,b)c o u t a,b e
37、n d l;r e turn 0;)三.实验结果四.心得体会1.引用可以作为函数形参,和指针变量作为函数参数效果同样,但是引用作为函数参数更清楚。2.第三章实验目的1 .掌握静态数据成员的使用。2.掌握静态成员函数的使用。二.实验内容3.2 6 写出下列程序的运营结果。#includ e using nam e sp a ce std;ClassM i n t A;static int B;pu b lie:M(i n t a)A=a;B+=a;c ou t vvConstructin g n V e n dl;)S t a tic void fl(M m);M()coutvDes t rue
38、 t ing n V e nd 1 ;);Void(C o u t?,A-9 m.A endl;Co u t,B-,b e n d I;)i n t M::B=0;int m a i n()(M P(5),Q(1 0);M:fl(P);M:fl(Q);Return 0;)三.实验结果SJ C:Windov/ssystem32cmd.exeBC onstruetingC onstructingA =5B=15D estructingA=10B=15D estructingD estructingD estructing请按任意键继续.四.心得体会1.静态数据成员重要用作类的所有对象所公用的数据,
39、它在类的任何对象建立前就存在了。2.一般情况下,静态成员函数来访问静态数据成员。第四章一.实验目的1 .掌握派生类的继承方式。2.掌握派生类构造函数和析构函数。3.掌握派生类构造函数和析构函数的执行顺序。二.实验内容4.1 5写出下列程序的运营结果。#i ncl u d e using name s p ac e s t d;class Bl in tb l;pu b lie:Bl(int i)(bl=i;co u t 9,c o n s t r u ct o r B l.,i e n d 1 ;Voidp r i n t()(cout b l e n dl;);class B2int b 2
40、;public:B2(i nt i)(B2=i;cout c ons t ru c t o r B2.V i endl;Void print()co u t b 2endl;);cl a ss B3i n t b3;p u bl i c:B3(in t i)(B3=i;cout,c o ns t ructor B3.9,i e n dl;)i nt g e tb 3()(r etu r n b3;);c 1 a ss A:pub 1 i c B2,pub 1 ic Bl(i n t a;B3 bb;pub 1 ic:A(inti,i nt j,i n tk,int 1 )B2(j),b b(k
41、)a=l;c outw“con s t r uctor A.vven d 1;)void p r i n t()(B 1 ::p r i nt();B2:print();cout a ,b b.ge t b 3()e n d 1 ;i n t main()(A aa(l,2,3,4);aa.pri n t();return 0;三.实验结果C:Windowssystem32cmd.execonstructor B2.2constructor Bl.1constructor B3.3constructor A.121,3请按任意键继续.四.心得体会1.派生类继承了基类的成员,实现了原有代码的重用
42、,但是基类的构造函数和析构函数不能被继承,对所有从基类继承下来的成员初始化工作还是由基类构造函数完毕,但是我们必须在派生类中对基类的构造函数所需要的参数进行设立。2.构造函数的执行顺序严格地按照先调用基类的构造函数后调用派生类的构造函数。第五章一.实验目的1.掌握虚函数的使用。二.实验内容5.1 3 下面的程序段中虚函数被重新定义的方法对的吗?为什么?c la s s base P u b l ie:vi r t ual in t f(int a)=0;);class d e riv e d:p u bl i c ba s e public:i nt f(int a,i nt b)(r etu r n a*b;);三.实验结果答:虚函数被重新定义的方法不对的,由于虚函数被重新定义时参数类型和参数个数不能改变。四.心得体会虚函数是重载的另一种方式,是动态的,它提供了一种更为灵活的运营时的多态性的机制。