类和对象的定义和使用文档格式.docx

上传人:b****7 文档编号:21853505 上传时间:2023-02-01 格式:DOCX 页数:14 大小:31KB
下载 相关 举报
类和对象的定义和使用文档格式.docx_第1页
第1页 / 共14页
类和对象的定义和使用文档格式.docx_第2页
第2页 / 共14页
类和对象的定义和使用文档格式.docx_第3页
第3页 / 共14页
类和对象的定义和使用文档格式.docx_第4页
第4页 / 共14页
类和对象的定义和使用文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

类和对象的定义和使用文档格式.docx

《类和对象的定义和使用文档格式.docx》由会员分享,可在线阅读,更多相关《类和对象的定义和使用文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

类和对象的定义和使用文档格式.docx

(4)掌握友元函数和友元类的定义和使用。

(5)基本掌握指针和引用作为函数参数的应用。

二、实验环境(实验设备)

硬件:

微型计算机

软件:

MicrosoftVisualC++6.0

三、实验原理及内容

实验题目

(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=ob.Hour;

Minute=ob.Minute;

Second=ob.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)

t.PrintTime();

callf\n"

;

}*/

intmain()

Timea;

Timeb(13);

Timec(13,15);

Timed(13,15,45);

a.PrintTime();

b.PrintTime();

c.PrintTime();

d.PrintTime();

a.ChangeTime(12,15,45);

b.ChangeTime(12,15,45);

c.ChangeTime(12,15,45);

d.ChangeTime(12,15,45);

a.GetHour()<

a.GetMinute()<

a.GetSecond()<

b.GetHour()<

b.GetMinute()<

b.GetSecond()<

c.GetHour()<

c.GetMinute()<

c.GetSecond()<

d.GetHour()<

d.GetMinute()<

d.GetSecond()<

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:

boy.name<

sage:

boy.age<

Boya("

xpx"

19);

Girlb("

lala"

b.VisitBoy(a);

a.print();

b.print();

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\实验二\exp3_1.cpp|14|error:

no`voidGirl:

VisitBoy(Boy&

)'

memberfunctiondeclaredinclass`Girl'

|

G1.VisitBoy(B2);

B2.VisitGirl(G1);

输出:

Girlconstructing

Boyconstructing

Jack

22

Girl'

Mary

20

⑤定义一个顶层函数voidVisitBoyGirl(Boy&

),作为以上两个类的友元函数,主函数中通过调用该函数输出男孩和女孩的信息。

写出该友元函数的完整代码,以及主函数的代码。

voidVisitBoyGirl(Boy&

boy,Girl&

girl)

girl.name<

girl.age<

VisitBoyGirl(B2,G1);

四、实验小结(包括问题和解决方法、心得体会、意见与建议等)

1.在题目

(1)中②不改变main()函数中的对象的定义方式,若取消构造函数中参数的默认值,编译程序错误提示信息及出错原因是:

\MicrosoftVisualStudio\MyProjects\实验一\Time.cpp|7|error:

nomatchingfunctionforcallto`Time:

Time()'

\MicrosoftVisualStudio\MyProjects\实验一\Time.cpp|8|error:

Time(int)'

\MicrosoftVisualStudio\MyProjects\实验一\Time.cpp|9|error:

Time(int,int)'

函数二义性

2.在题目

(1)中

如果删除类中自定义的构造函数,仅使用系统默认构造函数,再编译,程序错误提示信息及出错原因是:

D:

\MicrosoftVisualStudio\MyProjects\实验一\Time.cpp|10|error:

Time(int,int,int)'

构造函数实参不正确

3.在题目

(1)中

恢复成

的正确状态,如果将main()函数中的输出语句改为:

cout<

对象名.Hour<

对象名.Minute<

对象名.Second<

重新编译,会出现什么错误提示?

在这种情况下,如果将成员变量的访问属性修改为public再编译,结果如何?

\MicrosoftVisualStudio\MyProjects\实验一\Time.h|17|error:

`intTime:

Hour'

isprivate|

\MicrosoftVisualStudio\MyProjects\实验一\Time.cpp|17|error:

withinthiscontext|

`t4.Time:

cannotbeusedasafunction|

Minute'

Second'

5.心得体会:

1,注意向前引用。

2,要注意构造函数的用法。

3,友元可以提高效率,方便编程。

但会破坏类的整体操作性和封装性。

五、指导教师评语

成绩

批阅人

日期

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1