实验1 类与对象.docx
- 文档编号:18102071
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:11
- 大小:21.92KB
实验1 类与对象.docx
《实验1 类与对象.docx》由会员分享,可在线阅读,更多相关《实验1 类与对象.docx(11页珍藏版)》请在冰点文库上搜索。
实验1类与对象
西华大学
实验报告
(2010/2011学年第二学期)
课程名称
面向对象程序设计
实验名称
类与对象
实验时间
年
月
日
指导单位
指导教师
学生姓名
班级学号
学院(系)
专业
实验报告
实验名称
类和对象的定义及使用
实验类型
验证
实验学时
2×2
一、实验目的和要求
(1)掌握类与对象的定义与使用方法,理解面向对象方法中通过对象间传递消息的工作机制。
(2)正确掌握类的不同属性成员的使用方法。
(3)掌握构造函数与析构函数的概念,理解构造函数与析构函数的执行过程。
(4)掌握友元函数和友元类的定义和使用。
(5)了解对象数组的定义、初始化方法与应用。
(6)基本掌握指针和引用作为函数参数的应用。
二、实验环境(实验设备)
硬件:
微型计算机
软件:
MicrosoftVisualC++6.0
三、实验原理及内容
实验题目
(1):
定义一个时间类Time,有三个私有成员变量Hour、Minute、Second,定义构造函数、析构函数以及用于改变、获取、输出时间信息的公有函数,主函数中定义时间对象,并通过调用各种成员函数完成时间的设定、改变、获取、输出等功能。
实验解答:
①exp3_1.cpp的代码如下:
#include
usingnamespacestd;
classTime
{private:
intHour,Minute,Second;
public:
实验报告
Time(inth=0,intm=0,intn=0)
{cout<<"constructing..."< Hour=h;Minute=m;Second=n;} Time(constTime&ob) { cout<<"copyconstructing..."< Hour=ob.Hour;Minute=ob.Minute;Second=ob.Second;} ~Time() {cout<<"destructing..."< ChangeTime(inth,intm,ints) {Hour=h;Minute=m;Second=s;} intGetHour(){returnHour;} intGetMinute(){returnMinute;} intGetSecond(){returnSecond;} voidPrintTime() { cout<<"hour: "< cout<<"minute: "< cout<<"second: "< } }; voidmain() { Timetime1; time1.PrintTime(); time1.ChangeTime(4,28,12); time1.PrintTime(); 实验报告 } 程序的运行结果是: Constructing… hour: 0hinute: 0hecond: 0 hour: 4hinute: 28hecond: 12 Destructing… 构造函数与析构函数的调用方式及执行顺序是: 定义对象时系统自动调用构造函数,在对象生存期结束时,系统自动调用析构函 数,在任何情况下,析构函数的调用顺序与构造函数的调用顺序完全相反。 ②不改变main()函数中的对象的定义方式,若取消构造函数中参数的默认值,请在小结中记录编译程序错误提示信息并解释原因。 如果删除类中自定义的构造函数,仅使用系统默认构造函数,再编译,请在小结中记录程序错误提示信息并解释原因。 恢复成 的正确状态,如果将main()函数中的输出语句改为: cout<<对象名.Hour<<": "<<对象名.Minute<<": "<<对象名.Second< 请在小结中记录程序错误提示信息并解释原因。 在这种情况下,如果将成员变量的访问属性修改为public再编译,结果如何? 实验报告 ⑤在文件exp3_1.cpp中增加的voidIncreaceOneSecond();函数的完整代码是: VoidIncreaceOneSecond() { Second++; } ⑥主函数中定义一个Time类对象并调用一次f函数,观察结果填写下表: f函数的原型 主函数中调用f的语句 构造函数 调用次数 拷贝构造函数调用次数 析构函数调用次数 voidf(Timet); f(now) 1 1 2 voidf(Time&t); f(now) 1 0 1 voidf(Time*t); Ff(now) 1 0 1 通过以上结果,关于对象作形式参数、对象引用作形式参数、对象指针作形式参数时构造函数、析构函数的调用次数及顺序,你得到什么结论? 答: 1对象作为形式参数,调用之初把实参的值复制给形参,函数体内形参的 改变不会影响实际参数的值。 2对象引用作为形式参数,相当于是实参的别名,实质上就是对实参对象行 操作,所以他会改变实际参数的值。 3对象指针作形式参数,不调用拷贝构造函数,通过指针不仅可以访问实参对 象的值,还可以进行修改,调用的时候要以地址形式给出。 实验报告 实验题目 (2): 建立文件exp3_2.cpp,定义一个Girl类和一个Boy类,这两个类中都有表示姓名、年龄的私有成员变量,都要定义构造函数、析构函数、输出成员变量信息的公有成员函数。 实验解答: ①在exp3_2.cpp中定义相应的类,主函数中定义相应的类成员,调用各类的输出函数显示信息。 源程序代码如下: #include #include classGirl; classBoy {char*name;intage; Public: Boy(char*na,inta) {name=newchar[strlen(na)+1];strcpy(name,na);age=a;} ~Boy(){deletename;} voidOutput() {cout<<"姓名: "< "< }; classGirl {char*name;intage; public: Girl(char*na,inta) {name=newchar[strlen(na)+1];strcpy(name,na);age=a;} ~Girl(){deletename;} voidOutput() {cout<<"姓名: "< "< }; voidmain() { 实验报告 Girlgg("韩梅梅",13); Boybb("李磊",14); gg.Output(); bb.Output(); } 程序的运行结果是: 姓名: 韩梅梅年龄: 13 姓名: 李磊年龄: 14 ②将Girl类作为Boy类的友元类,写出Girl类的成员函数VisitBoy(Boy&)的实现代码。 在类Boy定义中加语句“friendGirl” 在类Girl定义中加成员函数: voidVisitBoy(Boy&b) { cout<<"姓名: "< } 实验报告 在Boy类的某成员函数VisitGirl(Girl&)中试图访问Girl类的私有成员,记录编译器给出的错误信息,与②对比,你能得出友元的什么特性? 答: 友元关系是单向性的,不具备交换性,只有两个类都将对方声明为自己的友元的 时候,才能实现互访. ④在上面代码的基础上,在Girl类的定义中,增加一行代码: friendBoy;在主函数中通过Boy类对象.VisitGirl(Girl类对象)的形式输出Girl类对象的信息。 编译的结果是? 写出这一步你的主函数代码,要求分别用友元函数Girl类对象.VisitBoy(Boy类对象);和Boy类对象.VisitGirl(Girl类对象);和输出两个类对象的信息。 姓名: 韩梅梅年龄: 13 主函数: b.VisitGirl(gg); 姓名: 李磊年龄: 14 主函数: g.VisitBoy(bb); 实验报告 ⑤定义一个顶层函数voidVisitBoyGirl(Boy&,Girl&),作为以上两个类的友元函数,主函数中通过调用该函数输出男孩和女孩的信息。 写出该友元函数的完整代码,以及主函数的代码。 voidvisitboygirl(boy&b,girl&g){ cout<<"姓名: "< cout<<"年龄: "< cout<<"姓名: "< cout<<"年龄: "< voidmain() { girlgg("韩梅梅",13); boybb("李磊",14); visitboygirl(b,g); } 实验报告 四、实验小结(包括问题和解决方法、心得体会、意见与建议等) 1.在题目 (1)中②不改变main()函数中的对象的定义方式,若取消构造函数中参数的默认值,编译程序错误提示信息及出错原因是: 答: errorC2512: 'Time': noappropriatedefaultconstructoravailable 本题中的构造函数是带形式参数的,这些形式参数不具有默认值,则定义对象时 必须给定相应的实际参数。 2.在题目 (1)中 如果删除类中自定义的构造函数,仅使用系统默认构造函数,再编译,程序错误提示信息及出错原因是: 答: errorC2512: 'Time': noappropriatedefaultconstructoravailable 系统对类提供一个不带形式参数的构造函数,但是,此时只负责为对象的各个数 据成员分配空间,而不提供初值。 3.在题目 (1)中 恢复成 的正确状态,如果将main()函数中的输出语句改为: cout<<对象名.Hour<<": "<<对象名.Minute<<": "<<对象名.Second< 在这种情况下,如果将成员变量的访问属性修改为public再编译,结果如何? 答: errorC2248: 'Hour': cannotaccessprivatememberdeclaredinclass'Time' errorC2248: 'Minute': cannotaccessprivatememberdeclaredinclass'Time' errorC2248: 'Second': cannotaccessprivatememberdeclaredinclass'Time' 4.其它问题及解决办法: 答: 在第二个题互相定义为友元类时,由于我把访问友元类的函数分别定义在类内,造成了错误提示,最后改过来了。 5.心得体会: 答: 很多知识点当时觉得懂了,在真正做题的时候发现自己什么都不懂,一直翻书,做的直纠结啊,看来c++还是得上机实践啊。 五、指导教师评语 成绩 批阅人 日期
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验1 类与对象 实验 对象
![提示](https://static.bingdoc.com/images/bang_tan.gif)