类和对象的定义和使用Word下载.docx
《类和对象的定义和使用Word下载.docx》由会员分享,可在线阅读,更多相关《类和对象的定义和使用Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
(1)掌握类与对象的定义与使用方法,理解面向对象方法中通过对象间传递消息的工作机制。
(2)正确掌握类的不同属性成员的使用方法。
(3)掌握构造函数与析构函数的概念,理解构造函数与析构函数的执行过程。
(4)掌握友元函数和友元类的定义和使用。
(5)基本掌握指针和引用作为函数参数的应用。
二、实验环境(实验设备)
硬件:
微型计算机
软件:
MicrosoftVisualC++
三、实验原理及内容
实验题目
(1)定义一个时间类Time,有三个私有成员变量Hour、Minute、Second,定义构造函数、析构函数以及用于改变、获取、输出时间信息的公有函数,主函数中定义时间对象,并通过调用各种成员函数完成时间的设定、改变、获取、输出等功能。
①按要求完成类的定义与实现。
②修改数据成员的访问方式,观察编译结果。
③在Time类中定义一个成员函数,用于实现时间增加一秒的功能,主函数中通过对象调用该函数,并输出增加一秒后的时间信息。
④定义一个普通函数。
voidf(Timet)
{
t.PrintTime();
}
在Time类中增加拷贝构造函数的定义,主函数中调用该函数,运用调试工具跟踪,分析整个程序调用构造函数(包括拷贝构造函数)和析构函数的次数;
再将f函数的形式参数分别修改为引用参数和指针参数(此时函数代码修改为{t->
PrintTime();
},主函数中调用,再分析此时调用构造函数和析构函数的次数。
参考实验教材中相应的实验提示部分按要求完成程序,并回答相关问题。
要求①完成后的源程序代码如下:
#include<
iostream>
usingnamespacestd;
classTime
{
private:
intHour,Minute,Second;
public:
Time(inth=0,intm=0,ints=0);
Time(constTime&
ob);
~Time();
voidChangeTime(inth,intm,ints);
intGetHour();
intGetMinute();
intGetSecond();
voidPrintTime();
voidIncreaseOneSecond();
};
Time:
:
Time(inth,intm,ints)
Hour=h;
Minute=m;
Second=s;
Time(constTime&
ob)
Hour=;
Minute=;
Second=;
~Time()
voidTime:
ChangeTime(inth,intm,ints)
intTime:
GetHour()
returnHour;
GetMinute()
returnMinute;
GetSecond()
returnSecond;
PrintTime()
cout<
<
Hour<
"
"
Minute<
Second<
endl;
IncreaseOneSecond()
Second++;
/*voidTime:
f(Timet)
();
callf\n"
;
}*/
intmain()
Timea;
Timeb(13);
Timec(13,15);
Timed(13,15,45);
(12,15,45);
()<
return0;
程序的运行结果是:
0:
0:
0
13:
15:
45
12:
15:
45
Pressanykeytocontinue
构造函数与析构函数的调用方式及执行顺序是:
先是构造函数然后是析构函数。
调用方式是自动调用,执行顺序是先执行构造函数,待程序结束时再执行析构函数。
③取消类中成员函数IncreaceOneSecond(
)的注释标志,将该函数补充完整,注意时间在增加一秒情况下的进位关系。
该函数的代码如下:
if(Second<
59)
elseif(Second==59&
&
Minute==59&
Hour==23)
{
Hour=0;
Minute=0;
Second=0;
}
23)
Hour++;
59&
Minute++;
④主函数中定义一个Time类对象并调用一次f函数,观察结果填写下表:
f函数的原型
主函数中调用f的语句
构造函数
调用次数
拷贝构造函数调用次数
析构函数调用次数
voidf(Timet);
F(t0)
1
2
voidf(Time&
t);
voidf(Time*t);
F(p)
通过以上结果,关于对象作形式参数、对象引用作形式参数、对象指针作形式参数时构造函数、析构函数的调用次数及顺序,你得到什么结论
实验题目
(2)定义一个Girl类和一个Boy类,这两个类中都有表示姓名、年龄的私有成员变量,都要定义构造函数、析构函数、输出成员变量信息的公有成员函数。
①根据要求定义相应的类。
②将Girl类作为Boy类的友元类,在Girl类的成员函数VisitBoy(Boy&
)中访问Boy类的私有成员,观察程序运行结果。
③在Boy类的某成员函数VisitGirl(Girl&
)中试图访问Girl类的私有成员,观察编译器给出的错误信息,理解原因。
④主函数中正确定义两个类的对象,调用各自的成员函数实现相应功能。
⑤再将Boy类作为Girl类的友元类,在Boy类的某成员函数VisitGirl(Girl&
)中访问Girl类的私有成员,观察编译器给出的信息。
⑥删除两个类中的函数VisitGirl(Girl&
),VisitBoy(Boy&
),定义一个顶层函数VisitBoyGirl(Boy&
Girl&
),作为以上两个类的友元,通过调用该函数输出男孩和女孩的信息。
实验解答:
①定义相应的类,主函数中定义相应的类成员,调用各类的输出函数显示信息。
源程序代码如下:
classBoy;
classGirl
charname[25];
intage;
Girl(charN[],intA=19);
~Girl();
voidprint();
voidVisitBoy(Boy&
);
classBoy
Boy(charN[],intA=19);
~Boy();
friendGirl;
Boy:
Boy(charN[],intA)
strcpy(name,N);
age=A;
~Boy()
voidBoy:
print()
name<
age<
Girl:
Girl(charN[],intA)
~Girl()
voidGirl:
VisitBoy(Boy&
boy)
Boy'
sname:
sage:
Boya("
xpx"
19);
Girlb("
lala"
(a);
xpx
19
xpx19
lala19
Pressanykeytocontinue
②将Girl类作为Boy类的友元类,写出Girl类的成员函数VisitBoy(Boy&
)的实现代码。
在Boy类的某成员函数VisitGirl(Girl&
)中试图访问Girl类的私有成员,记录编译器给出的错误信息,与②对比,你能得出友元的什么特性
友元关系是单向的,不具有交换性
④在上面代码的基础上,在Girl类的定义中,增加一行代码:
friendBoy;
在主函数中通过Boy类对象.VisitGirl(Girl类对象)的形式输出Girl类对象的信息。
编译的结果是写出这一步你的主函数代码,要求分别用友元函数Girl类对象.VisitBoy(Boy类对象);
和Boy类对象.VisitGirl(Girl类对象);
和输出两个类对象的信息。
D:
\MicrosoftVisualStudio\MyProjects\实验二\|14|error:
no`voidGirl:
VisitBoy(Boy&
)'
memberfunctiondeclaredinclass`Girl'
|
(B2);
(G1);
输出:
Girlconstructing
Boyconstructing
Jack
22
Girl'
Mary
20
⑤定义一个顶层函数voidVisitBoyGirl(Boy&
),作为以上两个类的友元函数,主函数中通过调用该函数输出男孩和女孩的信息。
写出该友元函数的完整代码,以及主函数的代码。
voidVisitBoyGirl(Boy&
boy,Girl&
girl)
VisitBoyGirl(B2,G1);
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
1.在题目
(1)中②不改变main()函数中的对象的定义方式,若取消构造函数中参数的默认值,编译程序错误提示信息及出错原因是:
\MicrosoftVisualStudio\MyProjects\实验一\|7|error:
nomatchingfunctionforcallto`Time:
Time()'
\MicrosoftVisualStudio\MyProjects\实验一\|8|error:
Time(int)'
\MicrosoftVisualStudio\MyProjects\实验一\|9|error:
Time(int,int)'
函数二义性
2.在题目
(1)中
如果删除类中自定义的构造函数,仅使用系统默认构造函数,再编译,程序错误提示信息及出错原因是:
D:
\MicrosoftVisualStudio\MyProjects\实验一\|10|error:
Time(int,int,int)'
构造函数实参不正确
3.在题目
(1)中
恢复成
的正确状态,如果将main()函数中的输出语句改为:
cout<
对象名.Hour<
对象名.Minute<
对象名.Second<
重新编译,会出现什么错误提示在这种情况下,如果将成员变量的访问属性修改为public再编译,结果如何
\MicrosoftVisualStudio\MyProjects\实验一\|17|error:
`intTime:
Hour'
isprivate|
withinthiscontext|
`:
cannotbeusedasafunction|
Minute'
Second'
5.心得体会:
1,注意向前引用。
2,要注意构造函数的用法。
3,友元可以提高效率,方便编程。
但会破坏类的整体操作性和封装性。
五、指导教师评语
成绩
批阅人
日期