《面向对象程序设计》实验指导书实验二Word文档下载推荐.docx
- 文档编号:3030690
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:22
- 大小:73.09KB
《面向对象程序设计》实验指导书实验二Word文档下载推荐.docx
《《面向对象程序设计》实验指导书实验二Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《面向对象程序设计》实验指导书实验二Word文档下载推荐.docx(22页珍藏版)》请在冰点文库上搜索。
3默认拷贝构造函数是一种浅拷贝,当在类中定义有指针数据成员,用new分配内存空间
时,通常应显示定义相应的拷贝构造函数。
㈡对象数组与对象指针
1.对象数组
⑴可以定义对象数组处理多个对象。
⑵可以用缺省参数构造函数为对象数组赋初值。
2•对象指针
可以使用指针来使用对象或对象数组。
方法:
⑴定义对象指针;
⑵将指针指向某一对象(或对象数组);
⑶用指针使用用对象(或对象数组元素):
对象指针->公有成员
3.对象引用
可以定义对象的引用,其引用名即为对象的别名。
4.this指针
⑴C++提供了一个特殊的对象指针,称为this指针。
⑵this指针为成员函数所属对象的指针,指向对象的首地址。
⑶this指针是一种隐含指针,隐含于每个类的成员函数中,即调用某成员函数时,都将自动
产生一个this指针。
⑷调用this指针格式:
this-〉成员名
⑸this指针通常采用隐式调用,即在类内部直呼其名。
⑹this指针是系统自定义的,用户不能再定义
㈢对象作为函数的参数
在C++中,可以用对象作为函数的形参或实参。
主要有以下形式:
1.形参、实参均为对象,其参数的传递为对象的值,即为传值调用。
2•形参为对象指针,实参为对象指针或对象地址,其参数的传递为对象的地址,即传址调用。
3.形参为对象引用,实参为对象,形参是实参对象的别名,即传址调用。
4•形参、实参为对象指针或对象数组,为传址调用。
四、实验内容
㈠验证及认知实验
按要求调试下列程序,并回答相关问题。
程序1(exp_201.cpp)
#include<
iostream.h>
classMyclass
{
public:
Myclass(void)
{cout<
<
"
constructing!
endl;
}
~Myclass(void)
destructing!
};
voidmain()
{Myclassob;
问题:
⑴运行程序的输出结果为:
Constructing!
Destructing!
Pressanykeytocontinue
⑵该输出结果说明构造函数Myclass()是在创建对象时执行的,而析构函数~Myclass
()是在是在对象牛存期结束时执行的。
⑶将main()中的"
Myclassob;
”改为:
“Myclassob[2];
”后,运行程序的输出结果为:
⑷将main()中的“Myclassob[2];
”改为:
“Myclass*ob;
ob=newMyclass[2];
”后,运行程序的输出结果为:
Pressanykeytocontinue
⑸在⑷的基础上,在程序的末尾加入:
“delete[]ob;
⑹比较⑶一⑸的输出结果,说明:
程序2(exp_202.cpp)
classA
{private:
inta,b;
A(void)
{a=0;
b=0;
A(intx1,intx2)
{a=x1;
b=x2;
A(A&
ob)
{a=ob.a;
b=ob.b;
cout<
拷贝构造函数被调用!
"
voidprint(void)
a="
a<
b="
b<
{Aob1(20,30),ob;
Aob2(ob1);
ob2.print();
//ob=ob1;
//ob.print();
⑺运行该程序的输出结果为:
a=20b=30
⑻程序中的成员函数A(A&
ob)称为拷贝构造函数,该函数的执行时间是在执行_用
类的一个已知对象初始化类的另一个对象被调用的。
⑼将main()中的"
”改为"
Aob2=ob1;
”,重新运行程序,观察输出结果,说明拷贝构造函数也可在用类的一个已知对象给另一个类的对象赋值时
时调用。
⑽将main()函数中加注释的语句去掉前面的“//”,重新运行程序,观测输出结果,说明执
行“ob=ob1;
”时调用拷贝构造函数,原因是“ob=ob1;
”只是对象的赋值。
㈡知识应用实验
1•分析下列程序,写出程序的输出结果,再上机运行程序验证其正确性,如果不正确,请认真分析出错原因。
程序3(exp_203.cpp)
你分析的程序输出结果:
构造函数被调用!
Main:
a=10b=10
inta,b;
调用fund:
Myclass(intx1=0,intx2=0)
Func1:
析构函数被调用!
调用func2:
Func2:
~Myclass()
调用func3:
{cout<
Myclass(Myclass&
ob)
{Myclassob(10,10);
main:
;
ob.print();
调用
fund:
func1(ob);
func2:
func2(&
ob);
func3:
func3(ob);
2•完善、调试通过下列程序,并按所要求回答问题。
程序4(exp_204.cpp)
string.h>
classperson
char*name;
person(char*pn);
〃构造函数声明
~person(void);
//析构函数声明
person(constperson&
〃拷贝构造函数声明
char*get_name(void)
{returnname;
voidprint_name(void);
1_:
:
person(char*pn)//定义构造函数,为name提供值
{name=②;
if(name!
=NULL)
3;
~person(void)//显示定义析构函数
{delete[]name;
person(constperson&
ob)//定义拷贝构造函数
{name=④;
⑤;
voidperson:
print_name(void)
<
name<
voidmain(void)
{personp1("
张三"
);
personp2=p1;
姓名:
p1.print_name();
p2.print_name();
(11)程序中①处应为person;
2处应为newchar[strlen(pn)+1];
3处应为strcpy(name,pn);
4处应为newchar[strlen(ob.name)+1];
5处应为strcpy(name,ob.name);
程序5(exp_102.cpp)
〃头文件"
hscore.h”内容:
定义一个成绩类:
最多可以处理10科成绩及平均成绩
voidset_score(floatx[],intn);
floatget_score(inti)
{returnsc[i];
//得到平均成绩
//无参构造函数
floatget_aver(void)
{returnaver;
voidprint_score(void);
score:
score(void)
{inti;
m=M;
for(i=0;
i<
m;
i++)
sc[i]=0;
aver=0;
score(floatx[],intn)〃构造函数重载初始化成绩
floatsum=0;
m=n;
①;
aver=sum/m;
voidscore:
set_score(floatx[],intn)//提供成绩
②
print_score(void)//输出成绩、平均成绩
sc[i];
cout<
aver<
(12)完善类的定义,程序中,①处应改为:
for(i=0,i<
m,i++)
{sc[i]=x[i];
sum+=sc[i];
}
2处应改为:
}_
10科)
//程序"
exp_205.cpp”:
用成绩类"
score”处理成绩:
任意个学生,任意科(不超过
#include"
hscore.h"
〃调入成绩score类的定义头文件
voidinput(score*p,intn,intm);
〃普通函数:
输入学生成绩
voidprint(score*p,intn,intm);
//普通函数:
输出学生成绩
score&
average(score*p,intn,intm);
平均成绩计算
voidsort(score*p,intn,intm);
〃普通函数:
按平均成绩排序
{intn,m;
学生人数:
cin>
>
n;
考试科数:
cin>
score*p,aver;
p=①;
//动态数组:
用于处理n个学生成绩
if(p==NULL)
内存分配失败!
endl;
return;
input(②);
〃调用输入成绩函数
print(②);
//调用输出成绩函数
aver=average(_②);
〃调用平均值计算函数
aver.print_score();
//输出各科平均成绩
sort一②);
〃成绩排序
print(—②);
//释放内存
voidinput(score*p,intn,intm)
{inti,j;
floatx[M];
n;
第"
i+1<
个学生成绩:
for(j=0;
j<
j++)
j+1<
科成绩:
”;
>
x[j];
4;
//为某个学生对象提供成绩
voidprint(score*p,intn,intm)//成绩输出函数
5;
//输出某学生的成绩
average(score*p,intn,intm)//用返回弓丨用的方法
floats[M]={0};
staticscoreaver;
〃返回的对象必须是静态的
{for(i=0;
i<
n;
s[j]=s[j]+p[i].get_score(j);
s[j]=s[j]/n;
6;
//对平均成绩对象提供值
returnaver;
voidsort(score*p,intn,intm)〃选择法排序:
按平均成绩由高到低排列
{scoret;
floata;
inti,j,k;
n-1;
{a=p[i].get_aver();
k=i;
for(j=i+1;
j<
if(a<
p[j].get_aver())
{■⑦}
if(k!
=i)
{⑧}
(13)完善main()函数,程序中
1处应为newscore[n];
2处应为p,n,m;
3处应为delete[]p;
;
4处应为p->
setscore(xj);
5处应为cout<
p->
getscore(i)<
endl
6处应为p->
set_score(s,n);
7处应为a=p[j].get_aver()
8处应为cout<
vva;
㈢程序设计实验
模拟一个裁判给比赛选手打分。
1.要求如下:
⑴裁判人数为UMPIRE;
⑵参赛选手为任意人;
⑶裁判给选手打分;
⑷去掉一个最高分,一个最低分,取其平均分为选手得分;
⑸按参赛选手的序号显示选手得分;
⑹按名次显示参赛选手得分(用插入法排序)。
2.提示:
、姓
⑴定义一个类名为Result的记分类为选手记分,数据成员至少包括选手编号(用整型)名(用字符数组)、裁判为选手的打分及得分(用实型数组)等,成员函数自定(必须有构造函数),将类的定义保存在"
result.h”中;
⑵测试程序(保存在exp_206.cpp中)采用交互方式:
1提示输入参赛选手人数;
2提示输入所有参赛选手的编号及姓名;
3显示比赛开始,请为选手打分;
4显示:
去掉的最高分、最低分,选手得分;
5比赛结束,按编号显示选手的得分;
6按名次显示选手得分。
iostream>
string>
vector>
usingnamespacestd;
classresult
private:
intid;
stringname;
floatscore[5];
floatave;
result(inti,stringn,floats[5])
floatsum=0,max=s[0],min=s[0];
intj;
id=i;
name.assign(n);
score[j]=s[j];
if(max<
s[j])max=s[j];
if(min>
s[j])
min=s[j];
sum+=s[j];
}ave=(sum-max-min)/5;
floatget_ave()
returnave;
intget_id()
returnid;
stringget_name()
returnname;
voiddisplay()
inti;
编号:
id<
姓名:
name<
最终得分="
ave<
评委打分:
score[i]<
inti,j;
intm;
intidsize;
请输入参赛选手人数"
cin»
idsize=m;
int*id;
//用指针指向一个数组
id=newint[idsize];
//动态内存分配
vector<
float>
aver;
name;
x(m,vector<
(5));
请输入所有参赛选手信息"
stringna;
名选手编号"
id[i];
名选手姓名"
na;
name.push_back(na);
endl<
==============比赛开始请裁判打分
=============="
为第"
名选手打分"
名裁判打分"
x[i][j];
endl<
=========去掉一个最高分,去掉一个最低分,选手得分
========="
floats[5];
s[j]=x[i]j
resulta(id[i],name[i],s);
a.display();
aver.push_back(a.get_ave());
for(i=1;
for(j=i;
j>
0;
j--)
if(aver[j]<
aver[j-1])
floattemp=aver[j];
aver[j]=aver[j-1];
aver[j-1]=temp;
intsum=id[j];
id[j]=id[j-1];
id[j-1]=sum;
stringpname=name[j];
name[j]=name[j-1];
name[j-1]=pname;
==============按名次显示得分=============="
名次"
编号"
姓名"
得分"
for(i=m-1;
i>
=0;
i--)
m-i<
名"
id[i]<
name[i]<
aver[i]<
四、实验收获与创新
自已拟定一个解决实际题目,分析并抽象为一个类,然后编写类的测试程序(类的定义放在头文件中,测试程序用exp_207.cpp保存),要求:
数据成员不少于三个,至少有一个数组成员或指针成员;
成员函数(方法)自定,但必须显示定义构造函数、析构函数、拷贝构造函数。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向对象程序设计 面向 对象 程序设计 实验 指导书