};
voidmain()
{Aob1(20,30),ob;
Aob2(ob1);
ob2.print();
//ob=ob1;
//ob.print();
}
问题:
⑺运行该程序的输出结果为:
拷贝构造函数被调用!
a=20b=30
Pressanykeytocontinue
⑻程序中的成员函数A(A&ob)称为拷贝构造函数,该函数的执行时间是在执行_用
类的一个已知对象初始化类的另一个对象被调用的。
⑼将main()中的"Aob2(ob1);”改为"Aob2=ob1;”,重新运行程序,观察输出结果,说明拷贝构造函数也可在用类的一个已知对象给另一个类的对象赋值时
时调用。
⑽将main()函数中加注释的语句去掉前面的“//”,重新运行程序,观测输出结果,说明执
行“ob=ob1;”时调用拷贝构造函数,原因是“ob=ob1;”只是对象的赋值。
㈡知识应用实验
1•分析下列程序,写出程序的输出结果,再上机运行程序验证其正确性,如果不正确,请认真分析出错原因。
程序3(exp_203.cpp)
#include
你分析的程序输出结果:
classMyclass
构造函数被调用!
{private:
Main:
a=10b=10
inta,b;
调用fund:
public:
拷贝构造函数被调用!
Myclass(intx1=0,intx2=0)
Func1:
a=10b=10
{a=x1;b=x2;
析构函数被调用!
cout<<"构造函数被调用!
"<调用func2:
}
Func2:
a=10b=10
~Myclass()
调用func3:
{cout<<"析构函数被调用!
"<Main:
a=10b=10
Myclass(Myclass&ob)
析构函数被调用!
{a=ob.a;b=ob.b;
cout<<"拷贝构造函数被调用!
"<voidmain()
{Myclassob(10,10);
cout<<"main:
";ob.print();
cout<<"调用
fund:
"<func1(ob);
cout<<"调用
func2:
"<func2(&ob);
cout<<"调用
func3:
"<func3(ob);
cout<<"main:
";ob.print();
}
2•完善、调试通过下列程序,并按所要求回答问题。
程序4(exp_204.cpp)
#include
#include
classperson
{private:
char*name;
public:
person(char*pn);〃构造函数声明
~person(void);//析构函数声明
person(constperson&ob);〃拷贝构造函数声明
char*get_name(void)
{returnname;}
voidprint_name(void);
};
1_:
:
person(char*pn)//定义构造函数,为name提供值
{name=②;
if(name!
=NULL)
3;
}
1_:
:
~person(void)//显示定义析构函数
{delete[]name;
}
1_:
:
person(constperson&ob)//定义拷贝构造函数
{name=④;
if(name!
=NULL)
⑤;
}
voidperson:
:
print_name(void)
{cout<voidmain(void)
{personp1("张三");
personp2=p1;
cout<<"姓名:
";p1.print_name();
cout<<"姓名:
";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;isc[i]=0;
aver=0;
}
score:
:
score(floatx[],intn)〃构造函数重载初始化成绩
{inti;floatsum=0;
m=n;
①;
aver=sum/m;
}
voidscore:
:
set_score(floatx[],intn)//提供成绩
{inti;floatsum=0;
m=n;
②
aver=sum/m;
}
voidscore:
:
print_score(void)//输出成绩、平均成绩
{inti;
for(i=0;icout<<""<}
问题:
(12)完善类的定义,程序中,①处应改为:
for(i=0,i{sc[i]=x[i];
sum+=sc[i];}
2处应改为:
for(i=0,i{sc[i]=x[i];
sum+=sc[i];}_
10科)
//程序"exp_205.cpp”:
用成绩类"score”处理成绩:
任意个学生,任意科(不超过
#include
#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;
cout<<"学生人数:
";cin>>n;
cout<<"考试科数:
";cin>>m;
score*p,aver;
p=①;//动态数组:
用于处理n个学生成绩
if(p==NULL)
{cout<<"内存分配失败!
"<return;
}
input(②);〃调用输入成绩函数
print(②);//调用输出成绩函数
aver=average(_②);〃调用平均值计算函数
aver.print_score();//输出各科平均成绩
sort一②);〃成绩排序
print(—②);//调用输出成绩函数
3;//释放内存
}
voidinput(score*p,intn,intm)
{inti,j;floatx[M];
for(i=0;i{cout<<"第"<
"<for(j=0;j{cout<<"第"<”;
cin>>x[j];
}
4;//为某个学生对象提供成绩
}
}
voidprint(score*p,intn,intm)//成绩输出函数
{inti;
for(i=0;i5;//输出某学生的成绩
}
score&average(score*p,intn,intm)//用返回弓丨用的方法
{inti,j;floats[M]={0};
staticscoreaver;〃返回的对象必须是静态的
for(j=0;j{for(i=0;is[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;
for(i=0;i{a=p[i].get_aver();k=i;
for(j=i+1;jif(a
{■⑦}
if(k!
=i)
{⑧}
}
}
(13)完善main()函数,程序中
1处应为newscore[n];
2处应为p,n,m;
3处应为delete[]p;;
4处应为p->setscore(xj);
5处应为cout<getscore(i)<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按名次显示选手得分。
#include
#include
#include
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;j<5;j++)
{
score[j]=s[j];
if(max
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;
cout<<"编号:
"<"<cout<<"最终得分="<";
for(i=0;i<5;i++)
cout<cout<}
};
voidmain()
{
inti,j;
intm;
intidsize;
cout<<"请输入参赛选手人数"<cin»m;
idsize=m;
int*id;//用指针指向一个数组
id=newint[idsize];//动态内存分配
vectoraver;
vectorname;
vector>x(m,vector(5));
cout<<"请输入所有参赛选手信息"<for(i=0;i{
stringna;
cout<<"第"<
cin>>id[i];
cout<<"第"<
cin»na;
name.push_back(na);
}
cout<=============="<for(i=0;i{
cout<<"为第"<
for(j=0;j<5;j++)
{
cout<<"第"<cin>>x[i][j];
}
}
cout<========="<for(i=0;i{
floats[5];
for(j=0;j<5;j++)
s[j]=x[i]j
resulta(id[i],name[i],s);
a.display();
aver.push_back(a.get_ave());
}
for(i=1;ifor(j=i;j>0;j--)
{
if(aver[j]{
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;
}
}
cout<for(i=m-1;i>=0;i--)
cout<<"第"<"<}
四、实验收获与创新
自已拟定一个解决实际题目,分析并抽象为一个类,然后编写类的测试程序(类的定义放在头文件中,测试程序用exp_207.cpp保存),要求:
数据成员不少于三个,至少有一个数组成员或指针成员;
成员函数(方法)自定,但必须显示定义构造函数、析构函数、拷贝构造函数。