10级CPP2试题.docx
《10级CPP2试题.docx》由会员分享,可在线阅读,更多相关《10级CPP2试题.docx(24页珍藏版)》请在冰点文库上搜索。
10级CPP2试题
成
绩
上海大学2010~2011学年度春季学期试卷
课程名:
高级语言程序设计
(二)课程号:
08305002学分:
4
应试人声明:
我保证遵守《上海大学学生手册》中的《上海大学考场规则》,如有考试违纪、作弊行为,愿意接受《上海大学学生考试违纪、作弊行为界定及处分规定》的纪律处分。
应试人应试人学号应试人所在院系
题号
一(30)
二(20)
三(20)
四(30)
得分
得
分
——————————————————————————————————————
一、判断题(每小题2分,共30分)
1.当不指定访问属性时,类(class)的成员的默认访问属性是private,
而结构体(struct)的成员的默认访问属性为public。
(√)
2.类是对象的抽象,而对象是类的具体实例。
(√)
3.可以重载类的构造函数。
(√)
4.可以重载类的析构函数。
(×)
5.只要类的对象不带资源,就不需要定义复制构造函数,而直接利用系统提供的
默认复制构造函数即可。
(×)
6.所有对象(包括全局对象、局部对象、动态对象)都是先构造者后被析构。
(×)
7.对于classA;创建堆对象数组的语句A*p=newA[10];将会调用10次
默认的构造函数。
(√)
8.类的静态数据成员不占用具体对象的数据空间。
(√)
9.只能通过类的对象才能调用类的静态成员函数。
(×)
10.类的友元函数不能访问该类对象的protected及private成员。
(×)
11.系统提供的默认赋值运算符函数的功能是按非静态数据成员依次执行该数据
成员的赋值运算。
(√)
12.重载运算符不能改变运算符的优先级、操作数的个数、结合方向。
(√)
13.创建派生类的对象时,先调用基类的构造函数,后执行派生类的构造函数。
(√)
14.派生类没有继承基类的访问属性为private的数据成员和成员函数。
(×)
15.含有纯虚函数的类为抽象类。
可以创建抽象类的对象。
(×)
得
分
二、填空题(每空2分,共20分)如下是为了处理单向链表所设计的类模板,请根据代码及其运行结果,完成程序。
//LinkList.h(头文件)
#ifndefLINKLIST_H
#defineLINKLIST_H
#include
usingnamespacestd;
templatestructNode
{
Tx;
Node①*next;
};
templateclassLinkList
{
private:
Node*head;
public:
LinkList(intn=0,constT*a=NULL):
head(NULL)
{
Node*p;
if(n<=0||a==NULL)
return;
for(inti=n-1;i>=0;②i--)
{
p=newNode;
p->x=a[i];
p->next=head;
head=p;
}
}
LinkList(constLinkList&link):
head(③NULL或0)//深复制构造
{
*this=link;//利用深赋值运算
}
LinkList&④operator=(constLinkList&link)//深赋值运算
{
if(&link==this)return*this;
FreeList();
Node*p,*q;
for(p=link.head;p!
=NULL;p=p->next)
{
if(head==NULL)
head=q=newNode;
else
{
q->next=newNode;
q=q->next;
}
q->x=⑤p->x;
q->next=NULL;
}
return*this;
}
virtual~LinkList()
{
FreeList();
}
voidInsert(constT&t);//插入一个结点到链首结点前
voidFreeList();//释放所有结点
intNum()const;//统计并返回链表中结点的个数
LinkListoperator+(constLinkList&link)const;
//将两条链表拼接成一条新链表
templatefriend//友元函数,重载插入运算符
ostream&operator<<(ostream&out,constLinkList&link);
//限于篇幅,其他函数略
};
template
LinkList⑥LinkList:
:
operator+(constLinkList&link)const
{
if(head==NULL)returnlink;
if(link.head==NULL)return*this;
LinkListresult(*this);
Node*p,*q;
for(q=result.head;q->next!
=NULL;q=q->next)
;
for(p=link.head;p!
=NULL;p=p->next)
{
q->next=newNode;
q=q->next;
q->x=p->x;
q->next=NULL;
}
returnresult;
}
template
ostream&operator<<(ostream&out,constLinkList&link)
{
out<<"head";
for(Node*p=link.head;p!
=NULL;p=p->next)
out<<"->"<x;
out<<"->NULL";
return⑦out;
}
templatevoidLinkList:
:
Insert(constT&t)
{
Node*p=newNode;
p->x=t;
p->next=head;
head=p;
}
templatevoidLinkList:
:
FreeList()
{
Node*p;
while(head)
{
p=head;
⑧head=head->next;
deletep;
}
}
templateintLinkList:
:
Num()const
{
intn=0;
for(Node*p=head;⑨p!
=NULL或p;p=p->next)
n++;
returnn;
}
#endif
//testLinkList.cpp(源程序文件)
#include
#include
#include"LinkList.h"
usingnamespacestd;
intmain()
{
inta[5]={1,3,5,7,9},b[4]={2,4,6,8};
LinkList<⑩int>linkA(5,a),linkB(4,b),linkC;
cout<linkC=linkA+linkB;
cout<cout<<"====="<charstr[]="Hello";
LinkListlinkX;
for(inti=strlen(str)-1;i>=0;i--)
linkX.Insert(str[i]);
LinkListlinkY=linkX;
cout<return0;
运行结果:
head->1->3->5->7->9->NULL
head->2->4->6->8->NULL
head->NULL
head->1->3->5->7->9->2->4->6->8->NULL
=====
head->H->e->l->l->o->NULL
head->H->e->l->l->o->NULL
}
得
分
三、阅读程序写出运行结果或简答问题(共20分)以下各小题所涉及的类均为如下文件中所设计的classStudent;。
文件Student.h和Student.cpp文件的内容如下。
//Student.h(头文件)
#ifndefSTUDENT_H
#defineSTUDENT_H
#include
#include
usingnamespacestd;
classStudent
{
public:
Student(stringId="****",stringName="NoName",
charGender='m',doubleScore=100);//构造函数
Student(constStudent&s);//复制构造函数
~Student();//析构函数
Student&operator=(constStudent&s);//重载赋值运算符函数
voidChangeId(conststringId);//修改学号
voidChangeName(conststringName);//修改姓名
voidChangeScore(doubleScore);//修改成绩
voidChangeGender(charGender);//修改性别
friendostream&operator<<(ostream&out,constStudent&s);
//重载插入运算符函数
staticvoidShow(ostream&out);//输出平均分、性别比率
private:
//数据成员
stringid,name;//学号、姓名
chargender;//性别
doublescore;//成绩
staticintmale,female;//男生及女生人数(静态数据成员)
staticdoublesum;//所有学生成绩之和(静态数据成员)
};
#endif
―――――――――――――――――――――――――――――――――――――
//Student.cpp(源程序文件)
#include"Student.h"
#include
intStudent:
:
male=0;
intStudent:
:
female=0;
doubleStudent:
:
sum=0;
Student:
:
Student(stringId,stringName,charGender,doubleScore)
:
id(Id),name(Name),gender(Gender),score(Score)
{
if(gender=='m'||gender=='M')
{
gender='m';
male++;
}
else
{
gender='f';
female++;
}
sum+=score;
cout<<"构造对象"<<*this<}
Student:
:
Student(constStudent&s)
:
id(s.id),name(s.name),gender(s.gender),score(s.score)
{
if(gender=='m')
male++;
else
female++;
sum+=score;
cout<<"复制构造对象"<<*this<}
Student:
:
~Student()
{
sum-=score;
if(gender=='m')
male--;
else
female--;
cout<<"析构对象"<<*this<}
Student&Student:
:
operator=(constStudent&s)
{
sum-=score;
if(gender=='m')
male--;
else
female--;
id=s.id;name=s.name;gender=s.gender;score=s.score;
if(gender=='m')
male++;
else
female++;
sum+=score;
return*this;
}
ostream&operator<<(ostream&out,constStudent&s)
{
out<<<returnout;
}
voidStudent:
:
Show(ostream&out)
{
intn=male+female;
if(n==0)
out<<"**无信息**"<else
out<<"average:
"<<<"\tmale:
"<<<"\tfemale:
"<<}
voidStudent:
:
ChangeId(conststringId){id=Id;}
voidStudent:
:
ChangeName(conststringName){name=Name;}
voidStudent:
:
ChangeScore(doubleScore)
{
sum+=Score-score;
score=Score;
}
voidStudent:
:
ChangeGender(charGender)
{
if(gender=='m')
male--;
else
female--;
gender=(Gender=='m'||Gender=='M')?
'm':
'f';
if(gender=='m')
male++;
else
female++;
}
运行结果
(1)
波浪号下划线处不需要填写(下同)
构造对象0001ZhangSanm86
构造对象0002LiSif88
return...
析构对象0002LiSif88
析构对象0001ZhangSanm86
(1)(4分)指出如下程序的运行结果
#include"Student.h"
intmain()
{
Students1("0001","ZhangSan",
'M',86);
Students2("0002","LiSi",
'f',88);
cout<<"return..."<return0;
}
(2)(4分)指出如下程序的运行结果
#include"Student.h"
intmain()
{
Student:
:
Show(cout);
Student*p1,*p2;
p1=newStudent("0001","ZhangSan",'M',86);
p2=newStudent("0002","LiSi",'f',88);
Student:
:
Show(cout);
deletep2;
Student:
:
Show(cout);
deletep1;
return0;
}
运行结果
(2)
**无信息**
构造对象0001ZhangSanm86
构造对象0002LiSif88
average:
87male:
1(50%)female:
1(50%)
析构对象0002LiSif88
average:
86male:
1(100%)female:
0(0%)
析构对象0001ZhangSanm86
(3)(4分)指出如下程序的运行结果
#include"Student.h"
intmain()
{
Students1("0002","LiSi",'F',88),s2;
cout<Student:
:
Show(cout);
s2=s1;
cout<Student:
:
Show(cout);
return0;
}
运行结果(3)
构造对象0002LiSif88
构造对象****NoNamem100
0002LiSif88
****NoNamem100
average:
94male:
1(50%)female:
1(50%)
0002LiSif88
0002LiSif88
average:
88male:
0(0%)female:
2(100%)
析构对象0002LiSif88
析构对象0002LiSif88
(4)(4分)指出如下程序的运行结果
#include"Student.h"
intmain()
{
Students[4]={Student("0001","ZhangSan",'M',86),
Student("0002","LiSi",'f',88),s[0]};
cout<<"Changing..."<s[2].ChangeId("0003");
s[2].ChangeName("WangWu");
s[2].ChangeScore(90);
s[2].ChangeGender('f');
s[3].ChangeId("0004");
s[3].ChangeName("ZhaoLiu");
s[3].ChangeScore(96);
s[3].ChangeGender('f');
Student:
:
Show(cout);
cout<<"ReturntoOperatingSystem."<return0;
}
运行结果(4)
构造对象0001ZhangSanm86
构造对象0002LiSif88
复制构造对象0001ZhangSanm86
构造对象****NoNamem100
Changing...
average:
90male:
1(25%)female:
3(75%)
ReturntoOperatingSystem.
析构对象0004ZhaoLiuf96
析构对象0003WangWuf90
析构对象0002LiSif88
析构对象0001ZhangSanm86
(5)(4分)结合第
(1)-(4)小题,简述Student类的复制构造函数、赋值运算符函数、析构函数的必要性,即:
分别简述仅利用系统所提供的默认复制构造函数、默认赋值运算符函数、默认的析构函数将存在什么问题。
答:
①因为有些对象可能采用复制构造函数创建。
而默认的复制构造函数不修改类的静态数据成员的值,将会导致第(4)小题计算出错;
②仅利用系统提供的默认赋值运算符函数,则第(3)小题计算出错,因为默认的赋值运算符函数不修改类的静态数据成员的值;
③仅利用系统提供的默认析构函数,则第
(2)小题计算出错,因为默认的析构函数不修改类的静态数据成员的值。
得
分
四、设计向量类模板(templateclassVector;)能使如下测试程序输出指定的结果(30分)。
//测试程序testVector.cpp
#include"Vector.h"
intmain()
{
inta[]={1,3,5};
Vectorv1(3,a),v2;
cout<<"请输入一个整数向量,如:
(1,2,3,4,5,6)"<cin>>v2;
cout<<"v1="<v1.ReSize(5);
v2.ReSize(5);
cout<<"v1="<