2023年面向对象程序设计及c++实验报告.docx
课程名称 实验名称 实验时间 指导单位 指导教师实验报告(学年第二学期)面向对象程序设计及C+实验一:类和对象的定义及使用年3 月垄 日物联网学院Boy ::Bo y ().void Boy: : prin t ()(c o ut«/zBoy: H «nam e ,z<<age<< e nd 1 ;).Girl: : Girl (char N, i n t A)(str c py (n a me, N);a g e=A;Girl:Girl。).voi d G i r 1 : p rin t () .cou t <V"Gir 1 : "<Vname<<" "<< a ge«endl;).v oi d Girl: VisitB o y(Boy & boy) (c os nam e : “ <<boy. name «en d 1 ;cout«/zBoy, s age: "<Xboy. age<en d 1 ;) int mai n () .Boy a("xpx”, 19);Girl b ("lai a”, 19);b. Vi s it Bo y ( a );prin t ()a. p ri n t (); r e turn 0 ;).实验报告程序的运营结果是:B o y' s nam e xpxBoy' s ag e : 19Boy: xpx 19G i rl: 1 ala 19Pre ss any key to co n t i nueL. T人人人人UBoy's name: xpxBoy's age: 19Boy: xpx 19Girl: lala 19Press any key to continue将G i rl类作为Boy类的友元类,写出Girl类的成员函数Visi t B oy(Bo y &)的实 现代码。void Girl: :Vi s itBoy (Boy & b o y )(c o u t<<nB o y's name: "<<b o y. n ame« e n dl;cout<<nBoy,s age: n<<b o y. a g e «e n dl;)实验报告 在Bo y类的某成员函数Vi s itGirl(G i rl & )中试图访问Girl类的私有成员,记 录编译器给出的错误信息,与对比,你能得出友元的什么特性? 友元关系是单向的,不具有互换性在上面代码的基础上,在Girl类的定义中,增长一行代码:friend Boy;在主函数中 通过Boy类对象.V i sitGi r 1 (Gi r 1类对象)的形式输出Girl类对象的信息。编译的结 果是?写出这一步你的主函数代码,规定分别用友元函数Gir 1类对象.VisitB o y(B o y类对象);和Boy类对象.Vis i t Gir 1 (Gi r 1类对象);和输出两个类对象的信息。D :Microsoft Visu a 1 S t udi o MyP r o je c ts 实验二e x p3_L c p p|1 4 |e r r or: n o "void Gi r 1 : :Vi s i t Bo y (Bo y &)' m e mber fu n ct i on deci a re d in class ' GiiT|Gl. VisitBoy(B2);B 2. VisitG i r 1 (G 1);输出:G irl con s truct i ngBoy construe t i ngBoy,s n a me: Jac kBoy' s age: 2 2Girl' s name: Mar yGi r r s age: 2 0实验报告定义一个顶层函数void VisitBo y Girl(Boy &, Girl &),作为以上两个类的友元函数, 主函数中通过调用该函数输出男孩和女孩的信息。写出该友元函数的完整代码,以及主函 数的代码。v o id Visi t BoyGirl (Boy &boy, Gir 1 & g irl) (cout«/zGi r r s name: «girl. name<<endl;co u t«/zGirl,s age: << g irl. age«endl;c out«/zB o yz s nam e : " «bo y name« e ndl; cout<<" Boy's ag e : "boy. ag e V Vendl;).Visi t BoyGirl(B2, Gl);实验报告四、实验小结(涉及问题和解决方法、心得体会、意见与建议等)L在题目(1)中不改变main。函数中的对象的定义方式,若取消构造函数中参 数的默认值,编译程序错误提醒信息及犯错因素是:D: M i cros oft Visu a 1 S t udioMyP r oj e ct s、实验一T ime. cpp|7|e r ror: n o matchin g func t i o n f or c a 11 to ' T im e : :TimeO,|D: M i cr o s o ft V isua 1 S tudio'My P r o jects实验一 T i me. cpp181 error: noma tching func t ion for c all to Tim e : : Time(int)fD: Micro s of t Vis ual S t ud i oMyPr o jec t s实验一Time. c pp | 9|e r ror: no matching f u notion f or cal 1 t o ' T i me: : Time (i nt, i nt)' I函数二义性2 .在题目(1 )中假如删除类中自定义的构造函数,仅使用系统默认构造函数,再编 译,程序错误提醒信息及犯错因素是:D:Microsoft V is u a 1 Stu d i o M y P r ojec t s 实验 一 Time, cpp171 error: no m a tc h i ng func tion for call to Time: :T i m e ()7 |D: Microsof t Vi s u al S t u d i oM y Pro j ects实验一'Time, cpp error: no mate h ing function for call to Time : :Time( i nt)' ID : M i crosoft V isual S t udi o MyP r oject s、实验一'Tiine. c p p | 9 | e r r or: no m a tchi n g f u ncti o n fo r c all to ' T ime: T ime (in t , i n t), ID: Mi c ros o f t V i sua 1 S t u d i oM y P r ojects实验一 Time. c p p| 10| erro r : no ma t chi n g func tion for ca 1 1 to T i me: : T ime (i n t, int, in t |构造函数实参不对的3 .在题目(1 )中恢复成的对的状态,假如将ma i n()函数中的输出语句改为: co u 对象名.Ho u r <<":<对象名.M i nut e << : ” <<对象名.S e c o nd<<en d 1 ; 重新编译,会出现什么错误提醒?在这种情况下,假如将成员变量的访问属性修改为P u b 1 ic再编译,结果如何?D: Mi c ros o ft Visu a 1 StudioMyPr o j e c ts 实验一T im e . h I 17|erro r : ' in t Time: :Hour' i s p r i va t e|D:Mic r o so f t Visu a 1 S t udioM y P r ojec t s '实验一T ime. c p p I 1 7 I error: within this context ID:Micros o ft V i sual Stud ioM y P r o jects实验一Ti m e . cpp 117 I error:' t 4 . T i me: :Hour, c annot b e u sed a s a fun c tio n |D: Mier o soft Vi s u a 1 StudioMy Pr o jects实验一 T i me. h| 1 7 | e rro r : ' int T i me: : Minute' i s p ri vat e |.D: Mic r osof t V i sua 1 Studio M y P ro j ects实验一 T ime. c p p I 171 e rror: wi t hin t his context |.D:Mic r osof t V i sual S t udi o MyProjects 实验一 Time, cpp I 1 71 err or: ' t4. Time: : Mi nute, cann o t b e used a s a f unc t ion|D:Mi cro s oft Vis u al Stu d i o MyPr o ject s、实验一Tim e . h| 1 71 e r ro r : 、i nt Time: : S e c o nd' is p ri v a t e|D : M i croso f t Visual Studio MyP r ojects实验一kT i me. c p p| 1 71 e rro r : with i n t h is context |D:Micro s oft Visual Stud i o M y Projects 实验一 T i me. cpp I 1 7 | e r ror: , t4 Time:Second' cannot be use d as a fun c tion|5 .心得体会:1,注意向前引用。,2,要注意构造函数的用法。3,友元可以提高效率,方便编程。但会破坏类的整体操作性和封装性。五、指导教师评语成绩批阅人实验报告实验名称类和对象的定义及使用指导教师肖学中实验类型验证实验学时2实验时间3月20日一、实验目的和规定(1)掌握类与对象的定义与使用方法,理解面向对象方法中通过对象间传递消息的 工作机制。(2)对的掌握类的不同属性成员的使用方法。(3)掌握构造函数与析构函数的概念,理解构造函数与析构函数的执行过程。(4 )掌握友元函数和友元类的定义和使用。(5)基本掌握指针和引用作为函数参数的应用。二、实验环境(实验设备)硬件:微型计算机软件: M i crosoft V i sua 1 C+ 6.0三、实验原理及内容实验题目(1)定义一个时间类Tim e ,有三个私有成员变量Hou r、Minute、Sec ond,定义构造函数、析构函数以及用于改变、获取、输出时间信息的公有函数,主函 数中定义时间对象,并通过调用各种成员函数完毕时间的设定、改变、获取、输出等功 能。按规定完毕类的定义与实现。 修改数据成员的访问方式,观测编译结果。 在Tim e类中定义一个成员函数,用于实现时间增长一秒的功能,主函数中通过 对象调用该函数,并输出增长一秒后的时间信息。定义一个普通函数。v o i d f (Time t)(t. Pr i ntTime();在Time类中增长拷贝构造函数的定义,主函数中调用该函数,运用调试工具跟踪,分析 整个程序调用构造函数(涉及拷贝构造函数)和析构函数的次数;再将f函数的形式参数 分别修改为引用参数和指针参数(此时函数代码修改为t-> PrintTime( ); ,主函数中调用,再分析此时调用构造函数和析构函数的次数。实验报告参考实验教材中相应的实验提醒部分按规定完毕程序,并回答相关问题。 规定完毕后的源程序代码如下:Winclud e <ios t r e a m>us i ng n a mesp a c e s t d;c 1 as s Tim e(priva t e:.i nt Hou r , Mi nu t e, S e cond;pub 1 ic:Time(in t h=0, i nt m= 0 , in t s =0);,Time( c on s t Tim e & o b );吁 T im e ();ovoid Chan g e Time(int h, in t m, int s);o i nt GetHou r ();'int GetMi n u te ();nnt Get S e co n d();ovoid PrintTim e ();ovo id I ncrease 0 n eSeco n d (););T im e : :Tim e (in t h, i n t m, int s)(Hour= hMi n u te=m;S econ d =s;)T ime: :Time(co n s t Time &ob)(Hour= ob. Hour;Minute= o b . M i nu t e ;Sec o nd=ob. Seco nd;)T i me::T ime ()()v oid Tim e : :Ch a n g eTime (i n t h, in t m, i nt s)(H o u r= h ;Minu t e=m;S e c on d =s;).i n t T i me: : GetHour ()(r e tu r n H o ur;)int T i me: G e tM i nu t e ()(ret u rn Minute;)int Time: :GetSecond()(retur n Se c o n d ;)void Time: :Pri n t Time()(c o u t «Hou r <<": "<<Min u t eV": "<<Se c o nd<<e n dl;)vo i d T ime:In creaseOn e Second ()(Sec o nd+;)Avoid Time: :f (Tim e t)(t . P r intTimeO ;cout« n call fn;*/i nt main()(Time a;.Tim e b( 1 3 );T i me c(13, 15);Time d ( 1 3, 15, 4 5);.a. Print T ime ();b . PrintTime ();c PrintT i me();d. Prin t T i me ();a. C h an g e Tim e (12, 15, 45);b. Chang e T ime(12, 1 5, 45);c. Ch a n geTime (12,15, 45);,d. Ch a n g eTim e ( 1 2, 15, 4 5 );coutVV a . Ge t Hour()<<": " <<a GetMinute()V":"V<a. GetS e cond() «endl;cou t «b. Get Ho u r () <<: z/«b. Ge t Minute ()<<zz:/z<<b. G e tSe c o nd () <<e ndl;cou t<<c. G e tHou r ()<<": "<<c. GetM i nute()<< ":"<<c. G e tSe c ond() <<end 1;cout«d. G e tHour()<<z,: /z«d. G e t M i nu t e ()« n :d . G e t Se c ond() <<e n d 1;r e t u r n 0;).程序的运营结果是:0 : 0: 01 3: 0: 01 3: 15:013: 15: 4512: 15 :4512:15: 4512: 1 5:451 2:15:45Press an y ke y to continueE:C +6.0B14070519Debuggexe"l 口 I U_里一1构造函数与析构函数的调用方式及执行顺序是: 先是构造函数然后是析构函数。调用方式是自动调用,执行顺序是先执行构造函数,待程序结束时再执行 析构函数。实验报告取消类中成员函数Inc reaceOneSecond()的注释标志为该函数补充完整,注意时间在 增长一秒情况下的进位关系。该函数的代码如下:v oid Tim e : :In c r e aseOn e Second () (i f (Second<5 9 ) Second+;e 1 se i f (Secon d =59 & &Minut e=59& & Hour= 2 3) (Hour=0;Minute= 0 ;Sec o n d =0;else if (S e co n d=59&&Minut e =5 9 &&Hour<23) (M i n u te = 0;Secon d=0;H o ur+;el s e i f (S e con d=59&&Minu t e <59&&Hour< 2 3) (Minute+;S econd=0;Hour+;)c out<<H o ur<<:/z<<Minut e <<ZZ:,Z«S e con d <<e n dl;). 主函数中定义一个T i me类对象并调用一次f函数,观测结果填写下表:f函数的原型主函数中调用f 的语句构造函数 调用次数拷贝构造函数 调用次数析构函数 调用次数void f (Time t);F(tO)112v o id f (Time &t);F(tO)101voi d f (Time*t);F (p)101通过以上结果,关于对象作形式参数、对象引用作形式参数、对象指针作形式参数时构 造函数、析构函数的调用次数及顺序,你得到什么结论?.实验报告实验题目(2)定义一个Gi r 1类和一个Boy类,这两个类中都有表达姓名、年龄的 私有成员变量,都要定义构造函数、析构函数、输出成员变量信息的公有成员函数。根据规定定义相应的类。将Girl类作为Boy类的友元类,在G i r 1类的成员函数V i sitB o y (Bo y & ) 中访问B oy类的私有成员,观测程序运营结果。在Boy类的某成员函数Vi s itG i r 1 (Girl & )中试图访问Gi r 1类的私有成员, 观测编译器给出的错误信息,理解因素。主函数中对的定义两个类的对象,调用各自的成员函数实现相应功能。再将Boy类作为Girl类的友元类,在Boy类的某成员函数V i s itG i rl (Gi r 1 & )中访问G i rl类的私有成员,观测编译器给出的信息。删除两个类中的函数V i s itG i rl (Girl & ) , V i sit Boy (Boy & ),定 义一个顶层函数V i sit BoyG i r 1 (Boy &, G ir 1&),作为以上两个类的友元,通过调用该函数输出男孩和女孩的信息。实验解答:定义相应的类,主函数中定义相应的类成员,调用各类的输出函数显示信息。 源程序代码如下:# inc 1 ude<i o stre a m>us i ng n a mes p ace s td;cl a ss Boy;class Girl(public:c har name 25;a i nt age;oG i rl (char N, i n t A=19);G i rl ();dvoid pri n t ();void Visi t Boy (Boy & );cla s s Boy(pub lie:.c h ar name 25;int age;Boy (c har N , int A=19);。B o y();v oi d print ();,f rien d Girl;);Boy:B o y(char N, int A)(str c p y (name, N);age=A;).