《面向对象程序设计》实验指导书实验二Word文档下载推荐.docx
- 文档编号:22470356
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:22
- 大小:20.96KB
《面向对象程序设计》实验指导书实验二Word文档下载推荐.docx
《《面向对象程序设计》实验指导书实验二Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《面向对象程序设计》实验指导书实验二Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
③默认拷贝构造函数是一种浅拷贝,当在类中定义有指针数据成员,用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];
”后,运行程序的输出结果为:
Pressanykeytocontinue
⑷将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);
”改为“Aob2=ob1;
”,重新运行程序,观察输出结果,说明拷贝构造函数也可在用类的一个已知对象给另一个类的对象赋值时时调用。
⑽将main()函数中加注释的语句去掉前面的“//”,重新运行程序,观测输出结果,说明执行“ob=ob1;
”时不调用拷贝构造函数,原因是“ob=ob1;
”只是对象的赋值。
㈡知识应用实验
1.分析下列程序,写出程序的输出结果,再上机运行程序验证其正确性,如果不正确,请认真分析出错原因。
你分析的程序输出结果是:
构造函数被调用!
Main:
a=10b=10
调用func1:
Func1:
a=10b=10
析构函数被调用!
调用func2:
Func2:
调用func3:
程序3(exp_203.cpp)
classMyclass
Myclass(intx1=0,intx2=0)
~Myclass()
{cout<
Myclass(Myclass&
程序的实际输出结果是:
voidfunc1(Myclassob)
{cout<
func1:
"
;
ob.print();
voidfunc2(Myclass*ob)
func2:
ob->
print();
voidfunc3(Myclass&
func3:
{Myclassob(10,10);
main:
ob.print();
func1(ob);
调用func2:
func2(&
ob);
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);
①:
:
person(char*pn)//定义构造函数,为name提供值
{name=②;
if(name!
=NULL)
③;
~person(void)//显示定义析构函数
{delete[]name;
person(constperson&
ob)//定义拷贝构造函数
{name=④;
⑤;
voidperson:
print_name(void)
{cout<
name<
voidmain(void)
{personp1("
张三"
);
personp2=p1;
姓名:
p1.print_name();
p2.print_name();
⑾程序中①处应为person;
②处应为newchar[strlen(pn)+1];
;
③处应为strcpy(name,pn);
④处应为newchar[strlen(ob.name)+1];
⑤处应为strcpy(name,ob.name);
程序5(exp_102.cpp)
//头文件“hscore.h”内容:
定义一个成绩类:
最多可以处理10科成绩及平均成绩
constintM=10;
classscore
floatsc[M],aver;
//表示M科成绩的数组及平均成绩
intm;
//表示实际考试科数
score(void);
//无参构造函数
score(floatx[],intn);
//构造函数重载——初始化成绩
voidset_score(floatx[],intn);
//提供成绩
floatget_score(inti)//得到第i科成绩
{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];
aver<
⑿完善类的定义,程序中,①处应改为:
for(i=0,i<
m,i++)
{sc[i]=x[i];
sum+=sc[i];
}
②处应改为:
}
//程序“exp_205.cpp”:
用成绩类“score”处理成绩:
任意个学生,任意科(不超过10科)
#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);
//普通函数:
按平均成绩排序
voidmain(void)
{intn,m;
学生人数:
cin>
>
n;
考试科数:
cin>
score*p,aver;
p=①;
//动态数组:
用于处理n个学生成绩
if(p==NULL)
内存分配失败!
return;
input(②);
//调用输入成绩函数
print(②);
//调用输出成绩函数
aver=average(②);
//调用平均值计算函数
aver.print_score();
//输出各科平均成绩
sort②);
//成绩排序
//调用输出成绩函数
//释放内存
voidinput(score*p,intn,intm)
{inti,j;
floatx[M];
第"
i+1<
个学生成绩:
for(j=0;
j<
j++)
j+1<
科成绩:
cin>
x[j];
④;
//为某个学生对象提供成绩
voidprint(score*p,intn,intm)//成绩输出函数
//输出某学生的成绩
average(score*p,intn,intm)//用返回引用的方法
floats[M]={0};
staticscoreaver;
//返回的对象必须是静态的
{for(i=0;
s[j]=s[j]+p[i].get_score(j);
s[j]=s[j]/n;
⑥;
//对平均成绩对象提供值
returnaver;
voidsort(score*p,intn,intm)//选择法排序:
按平均成绩由高到低排列
{scoret;
floata;
inti,j,k;
n-1;
{a=p[i].get_aver();
k=i;
for(j=i+1;
if(a<
p[j].get_aver())
{⑦}
if(k!
=i)
{⑧}
⒀完善main()函数,程序中
①处应为newscore[n];
②处应为p,n,m;
③处应为delete[]p;
④处应为p->
set_score(x,j);
⑤处应为cout<
p->
get_score(i)<
endl;
⑥处应为p->
set_score(s,n);
⑦处应为a=p[j].get_aver();
⑧处应为cout<
a;
㈢程序设计实验
模拟一个裁判给比赛选手打分。
1.要求如下:
⑴裁判人数为UMPIRE;
⑵参赛选手为任意人;
⑶裁判给选手打分;
⑷去掉一个最高分,一个最低分,取其平均分为选手得分;
⑸按参赛选手的序号显示选手得分;
⑹按名次显示参赛选手得分(用插入法排序)。
2.提示:
⑴定义一个类名为Result的记分类为选手记分,数据成员至少包括选手编号(用整型)、姓名(用字符数组)、裁判为选手的打分及得分(用实型数组)等,成员函数自定(必须有构造函数),将类的定义保存在“result.h”中;
⑵测试程序(保存在exp_206.cpp中)采用交互方式:
①提示输入参赛选手人数;
②提示输入所有参赛选手的编号及姓名;
③显示比赛开始,请为选手打分;
④显示:
去掉的最高分、最低分,选手得分;
⑤比赛结束,按编号显示选手的得分;
⑥按名次显示选手得分。
#include<
iostream>
string>
vector>
usingnamespacestd;
classresult
{
private:
intid;
stringname;
floatscore[5];
floatave;
public:
result(inti,stringn,floats[5])
{
floatsum=0,max=s[0],min=s[0];
intj;
id=i;
name.assign(n);
for(j=0;
5;
{
score[j]=s[j];
if(max<
s[j])
max=s[j];
if(min>
min=s[j];
sum+=s[j];
}
ave=(sum-max-min)/5;
floatget_ave()
returnave;
intget_id()
returnid;
stringget_name()
returnname;
voiddisplay()
inti;
cout<
编号:
id<
姓名:
cout<
最终得分="
ave<
评委打分:
for(i=0;
cout<
score[i]<
inti,j;
intidsize;
请输入参赛选手人数"
idsize=m;
int*id;
//用指针指向一个数组
id=newint[idsize];
//动态内存分配
vector<
float>
aver;
name;
>
x(m,vector<
(5));
请输入所有参赛选手信息"
stringna;
名选手编号"
id[i];
名选手姓名"
cin>
na;
name.push_back(na);
endl<
==============比赛开始请裁判打分=============="
{
为第"
名选手打分"
名裁判打分"
x[i][j];
=========去掉一个最高分,去掉一个最低分,选手得分========="
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向对象程序设计 面向 对象 程序设计 实验 指导书