1、10级CPP2试题成绩上海大学20102011学年度春季学期试卷课程名: 高级语言程序设计(二) 课程号: 08305002 学分: 4 应试人声明: 我保证遵守上海大学学生手册中的上海大学考场规则,如有考试违纪、作弊行为,愿意接受上海大学学生考试违纪、作弊行为界定及处分规定的纪律处分。应试人 应试人学号 应试人所在院系 题号一(30)二(20)三(20)四(30)得分得分 一、判断题(每小题2分,共30分)1. 当不指定访问属性时,类(class)的成员的默认访问属性是private,而结构体(struct)的成员的默认访问属性为public。 ()2. 类是对象的抽象,而对象是类的具体实例
2、。 ()3. 可以重载类的构造函数。 ()4. 可以重载类的析构函数。 ()5. 只要类的对象不带资源,就不需要定义复制构造函数,而直接利用系统提供的默认复制构造函数即可。 ()6. 所有对象(包括全局对象、局部对象、动态对象)都是先构造者后被析构。 ()7. 对于class A;创建堆对象数组的语句A *p = new A10;将会调用10次默认的构造函数。 ()8. 类的静态数据成员不占用具体对象的数据空间。 ()9. 只能通过类的对象才能调用类的静态成员函数。 ()10. 类的友元函数不能访问该类对象的protected及private成员。 ()11. 系统提供的默认赋值运算符函数的功
3、能是按非静态数据成员依次执行该数据成员的赋值运算。 ()12. 重载运算符不能改变运算符的优先级、操作数的个数、结合方向。 ()13. 创建派生类的对象时,先调用基类的构造函数,后执行派生类的构造函数。 ()14. 派生类没有继承基类的访问属性为private的数据成员和成员函数。 ()15. 含有纯虚函数的类为抽象类。可以创建抽象类的对象。 ()得分二、填空题(每空2分,共20分)如下是为了处理单向链表所设计的类模板,请根据代码及其运行结果,完成程序。/ LinkList.h (头文件)#ifndef LINKLIST_H#define LINKLIST_H#include using na
4、mespace std;template struct Node T x; Node *next ;template class LinkListprivate: Node *head;public: LinkList(int n=0, const T *a=NULL) : head(NULL) Node *p; if(n=0; i- ) p = new Node; p-x = ai; p-next = head; head = p; LinkList(const LinkList &link) : head(NULL或0) / 深复制构造 *this = link; / 利用深赋值运算 Li
5、nkList & operator =(const LinkList &link) / 深赋值运算 if(&link = this) return *this; FreeList(); Node *p, *q; for(p=link.head; p!=NULL; p=p-next) if(head=NULL) head = q = new Node; else q-next = new Node; q = q-next; q-x = p-x ; q-next = NULL; return *this; virtual LinkList() FreeList(); void Insert(con
6、st T &t); / 插入一个结点到链首结点前 void FreeList(); / 释放所有结点 int Num() const; / 统计并返回链表中结点的个数 LinkList operator+(const LinkList &link) const; / 将两条链表拼接成一条新链表 template friend / 友元函数,重载插入运算符 ostream & operator(ostream &out, const LinkList &link); / 限于篇幅,其他函数略;template LinkList LinkList: operator+(const LinkList
7、 &link) const if(head=NULL) return link; if(link.head=NULL) return *this; LinkList result(*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 = new Node; q = q-next; q-x = p-x; q-next = NULL; return result;template ostream & operator(ostream &
8、out, const LinkList &link) out head; for(Node *p=link.head; p!=NULL; p=p-next) out x; out NULL; return out ;template void LinkList:Insert(const T &t) Node *p = new Node; p-x = t; p-next = head; head = p;template void LinkList:FreeList() Node *p; while(head) p = head; head = head-next ; delete p; tem
9、plate int LinkList:Num() const int n=0; for(Node *p=head; p!=NULL或p ; p=p-next) n+; return n;#endif/ testLinkList.cpp (源程序文件)#include #include #include LinkList.husing namespace std;int main() int a5 = 1, 3, 5, 7, 9, b4 = 2, 4, 6, 8; LinkList linkA(5, a), linkB(4, b), linkC; cout linkA n linkB n lin
10、kC endl; linkC = linkA + linkB; cout linkC endl; cout = endl; char str = Hello; LinkList linkX; for(int i=strlen(str)-1; i=0; i-) linkX.Insert(stri); LinkList linkY = linkX; cout linkX n linkY 1 - 3 - 5 - 7 - 9 - NULLhead - 2 - 4 - 6 - 8 - NULLhead - NULLhead - 1 - 3 - 5 - 7 - 9 - 2 - 4 - 6 - 8 - NU
11、LL=head - H - e - l - l - o - NULLhead - H - e - l - l - o - NULL得分三、阅读程序写出运行结果或简答问题(共20分)以下各小题所涉及的类均为如下文件中所设计的class Student;。文件Student.h和Student.cpp文件的内容如下。/ Student.h (头文件)#ifndef STUDENT_H#define STUDENT_H#include #include using namespace std;class Studentpublic: Student( string Id=*, string Name
12、=NoName, char Gender=m, double Score=100); / 构造函数 Student(const Student &s); / 复制构造函数 Student(); / 析构函数 Student & operator=(const Student &s); / 重载赋值运算符函数 void ChangeId(const string Id); / 修改学号 void ChangeName(const string Name); / 修改姓名 void ChangeScore(double Score); / 修改成绩 void ChangeGender(char G
13、ender); / 修改性别 friend ostream & operator(ostream &out, const Student &s); / 重载插入运算符函数 static void Show(ostream &out); / 输出平均分、性别比率private: / 数据成员 string id, name; / 学号、姓名 char gender; / 性别 double score; / 成绩 static int male, female; / 男生及女生人数(静态数据成员) static double sum; / 所有学生成绩之和(静态数据成员);#endif/ Stu
14、dent.cpp (源程序文件)#include Student.h#include int Student:male = 0;int Student:female = 0;double Student:sum = 0;Student:Student(string Id, string Name, char Gender, double Score) : id(Id), name(Name), gender(Gender), score(Score) if(gender=m | gender=M) gender = m; male+; else gender = f; female+; sum
15、 += score; cout 构造对象 *this endl;Student:Student(const Student &s) : id(s.id), name(s.name), gender(s.gender), score(s.score) if(gender=m) male+; else female+; sum += score; cout 复制构造对象 *this endl;Student:Student() sum -= score; if(gender=m) male-; else female-; cout 析构对象 *this endl;Student & Student
16、:operator=(const Student &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, const Student &s) out setw(4) s.id left setw(10) s.name right s.gen
17、der s.score; return out;void Student:Show(ostream &out) int n = male + female; if(n=0) out * 无信息 * endl; else out average: sum/n tmale: male ( 100*male/n %) tfemale: female ( 100*female/n %) endl;void Student:ChangeId(const string Id) id = Id; void Student:ChangeName(const string Name) name = Name;
18、void Student:ChangeScore(double Score) sum += Score-score; score = Score;void Student:ChangeGender(char Gender) if(gender=m) male-; else female-; gender = (Gender=m | Gender=M)? m : f; if(gender=m) male+; else female+;运行结果(1)波浪号下划线处不需要填写(下同)构造对象 0001 Zhang San m 86 构造对象 0002 Li Si f 88 return. 析构对象
19、0002 Li Si f 88 析构对象 0001 Zhang San m 86 (1) (4分)指出如下程序的运行结果#include Student.hint main() Student s1(0001, Zhang San, M, 86); Student s2(0002, Li Si, f, 88); cout return. endl; return 0;(2) (4分)指出如下程序的运行结果#include Student.hint main() Student:Show(cout); Student *p1, *p2; p1 = new Student(0001, Zhang
20、San, M, 86); p2 = new Student(0002, Li Si, f, 88); Student:Show(cout); delete p2; Student:Show(cout); delete p1; return 0;运行结果(2)* 无信息 * 构造对象 0001 Zhang San m 86 构造对象 0002 Li Si f 88 average: 87 male: 1 (50%) female: 1 (50%) 析构对象 0002 Li Si f 88 average: 86 male: 1 (100%) female: 0 (0%) 析构对象 0001 Zh
21、ang San m 86 (3) (4分)指出如下程序的运行结果#include Student.hint main() Student s1(0002, Li Si, F, 88), s2; cout s1 n s2 endl; Student:Show(cout); s2 = s1; cout s1 n s2 endl; Student:Show(cout); return 0;运行结果(3)构造对象 0002 Li Si f 88 构造对象 * NoName m 100 0002 Li Si f 88 * NoName m 100 average: 94 male: 1 (50%) fe
22、male: 1 (50%) 0002 Li Si f 88 0002 Li Si f 88 average: 88 male: 0 (0%) female: 2 (100%) 析构对象 0002 Li Si f 88 析构对象 0002 Li Si f 88 (4) (4分)指出如下程序的运行结果#include Student.hint main() Student s4 = Student(0001, Zhang San, M, 86), Student(0002, Li Si, f, 88), s0 ; cout Changing. endl; s2.ChangeId(0003); s2
23、.ChangeName(Wang Wu); s2.ChangeScore(90); s2.ChangeGender(f); s3.ChangeId(0004); s3.ChangeName(Zhao Liu); s3.ChangeScore(96); s3.ChangeGender(f); Student:Show(cout); cout Return to Operating System. endl; return 0;运行结果(4)构造对象 0001 Zhang San m 86 构造对象 0002 Li Si f 88 复制构造对象 0001 Zhang San m 86 构造对象 *
24、 NoName m 100 Changing. average: 90 male: 1 (25%) female: 3 (75%) Return to Operating System. 析构对象 0004 Zhao Liu f 96 析构对象 0003 Wang Wu f 90 析构对象 0002 Li Si f 88 析构对象 0001 Zhang San m 86 (5) (4分)结合第(1)-(4)小题,简述Student类的复制构造函数、赋值运算符函数、析构函数的必要性,即:分别简述仅利用系统所提供的默认复制构造函数、默认赋值运算符函数、默认的析构函数将存在什么问题。 答: 因为有些
25、对象可能采用复制构造函数创建。而默认的复制构造函数不修改类的静态数据成员的值,将会导致第(4)小题计算出错; 仅利用系统提供的默认赋值运算符函数,则第(3)小题计算出错,因为默认的赋值运算符函数不修改类的静态数据成员的值; 仅利用系统提供的默认析构函数,则第(2)小题计算出错,因为默认的析构函数不修改类的静态数据成员的值。得分 四、设计向量类模板(template class Vector;)能使如下测试程序输出指定的结果(30分)。/ 测试程序 testVector.cpp#include Vector.hint main() int a = 1, 3, 5; Vector v1(3, a), v2; cout 请输入一个整数向量,如:(1, 2, 3, 4, 5, 6) v2; cout v1 = v1 nv2 = v2 endl; v1.ReSize(5); v2.ReSize(5); cout v1 = v1 nv2