大学C++面向对象试题及参考答案.docx
- 文档编号:9453161
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:20
- 大小:20.44KB
大学C++面向对象试题及参考答案.docx
《大学C++面向对象试题及参考答案.docx》由会员分享,可在线阅读,更多相关《大学C++面向对象试题及参考答案.docx(20页珍藏版)》请在冰豆网上搜索。
大学C++面向对象试题及参考答案
…………试卷装订线………………装订线内不要答题,不要填写考生信息………………试卷装订线…………
姓名
学号
专业班级
学院
重点大学考试试卷(A卷)
2014~2015学年2学期面向对象程序设计课程闭卷
时间120分钟,学时,学分,总分100分,占总评成绩100%年月日
题号
一
二
三
四
五
六
七
八
九
十
合计
满分
20
18
24
38
100
得分
得分
一、单选题(每小题2分,共20分,本题答案填入下表中)
小题号
1
2
3
4
5
6
7
8
9
10
答案
1.在C++中,下列语句,错误的是()。
A.inta(3);B.inta[3];
C.int&a;D.int*a;
2.派生类中的成员函数可以直接访问基类的()。
A.公有成员B.私有成员
C.公有和保护成员D.保护成员
3.在C++中,关于类的析构函数,正确的说法是()。
A.能带形式参数B.函数体中必须有delete语句
C.可以被重载D.无形参,也不可重载
4.一个类拥有多个构造函数,则这些构造函数之间为()。
A.重复关系B.拷贝关系
C.重载关系D.继承关系
5.C++中声明常量的关键字是()。
A.externB.constC.publicD.volatile
6.一个函数功能不太复杂,但要求被频繁调用,该函数应该设计成()。
A.内联函数B.重载函数
C.递归函数D.嵌套函数
7.以下基类中的成员函数表示纯虚函数的是()。
A.virtualvoidtt()=0;B.voidtt(int)=0;
C.virtualvoidtt(int);D.virtualvoidtt(int){}
8.可以在类外用p.a的形式访问派生类对象p的基类成员a,其中a是()。
A.公有继承的公有成员;B.公有继承的私有成员;
C.公有继承的保护成员; D.私有继承的公有成员。
9.对于任意一个类,析构函数的个数最多为()
A.0B.1C.2D.3
10.对于在类中定义的静态数据成员count,下面正确的说法是()
A.count在类外进行初始化
B.该类的每个对象中都有一个独立的静态数据成员count
C.对象创建时产生count
D.count既可以在类外初始化,也可以在类内初始化
得分B)10,10C)20,10D)20,20得分
二、改错题(共3小题,每小题6分,共18分)
1.下面的程序在VC6.0上编译提示errorC2440:
'typecast':
cannotconvertfrom'classComplex'to'float',Nouser-defined-conversionoperatoravailablethatcanperformthisconversion,请指出错误原因并改正。
#include
usingnamespacestd;
classComplex{
public:
Complex(floatr=0,floati=0)
{real=r;imag=i;}
voidprint()
{cout<<'('< private: floatreal,imag; }; intmain() {Complexa(2.2f,4.4f); a.print(); cout< return0; } 2.下面的程序在VC6.0上编译提示errorC2662: 'getX': cannotconvert'this'pointer from'constclassCTest'to'classCTest&',请指出错误原因并改正。 #include usingnamespacestd; classCTest {private: intx; public: CTest(intx) {this->x=x;} intgetX() {returnx;} }; intmain() {constCTestobj(5); cout< return0; } 3.下面的程序在VC6.0上编译无错,运行结果出错: “p1: 葺葺葺葺葺葺葺葺”,请指出错误原因并改正。 #include #include usingnamespacestd; classSTRING{ public: STRING(char*s) { ptr=newchar[strlen(s)+1]; strcpy(ptr,s); } ~STRING() {deleteptr;} voidprint() {cout< private: char*ptr; }; intmain() {STRINGp1("book"); {STRINGp2("pen"); p1=p2; } cout<<"p1: "; p1.print(); return0; } 得分 三、读程序,给出程序的输出结果。 (每小题6分,共24分) 【1】#include usingnamespacestd; classPerson{ public: Person(){cout<<"ConstructorofPerson"< ~Person(){cout<<"DestructorofPerson"< }; classStudent: publicPerson{ public: Student(){cout<<"ConstructorofStudent"< ~Student(){cout<<"DestructorofStudent"< }; classTeacher: publicPerson{ public: Teacher(){cout<<"ConstructorofTeacher"< ~Teacher(){cout<<"DestructorofTeacher"< }; intmain(){ Students; Teachert; return0; } …………试卷装订线………………装订线内不要答题,不要填写考生信息………………试卷装订线………… …………试卷装订线………………装订线内不要答题,不要填写考生信息………………试卷装订线………… 【2】#include usingnamespacestd; classA {public: A(inti){x=i;} voiddispa(){cout< private: intx; }; classB: publicA {public: B(inti): A(i+10){x=i;} voiddispb(){dispa();cout< private: intx; }; intmain(){ Bb (2); b.dispb(); return0; } 【3】#include classCount{ staticintcount; public: Count(){cout< staticintGetc(){returncount;} ~Count(){count--;} }; intCount: : count=5; intmain(){Countc1,c2,c3,c4; cout< : Getc()< return0; } 【4】#include usingnamespacestd; classMyClass{ public: MyClass(inti=0){cout<<1;} MyClass(constMyClass&x){cout<<2;} MyClass&operator=(constMyClass&x){cout<<3;return*this;} ~MyClass(){cout<<4;} }; intmain(){ MyClassobj1 (1),obj2 (2),obj3(obj1); obj1=obj2; return0; } 得分 四、编程题(共38分) 1.下面是一个类的测试程序,请设计出能使用如下测试程序的类。 (12分) intmain() {Testa; a.init(68,55); a.print(); return0; } 其执行结果为: 测试结果: 68-55=13 …………试卷装订线………………装订线内不要答题,不要填写考生信息………………试卷装订线………… 2.请为fraction类(分数类)定义下列重载运算符函数(注意函数原型)(12分) ⑴加法运算+。 ⑵赋值运算=。 ⑶提取运算>>。 classfraction {private: intfz;//分子 intfm;//分母 public: … }; 3.创建一个表示雇员信息的employee类,其中包含数据成员name、empNo和salary,分别表示雇员的姓名、编号和月薪。 再从employee类派生出3个类worker、technician和salesman,分别代表普通工人、科研人员、销售人员。 三个类中分别包含数据成员productNum、workHours和monthlysales,分别代表工人每月生产产品的数量、科研人员每月工作的时数和销售人员每月的销售额。 要求各类中都包含成员函数pay,用来计算雇员的月薪,并假定: 普通工人的月薪=每月生产的产品数×每件产品的赢利×20% 科研人员的月薪=每月的工作时数×每小时工作的酬金 销售人员的月薪=月销售额×销售额提成。 (14分) 重点大学考试试题答案(A卷) 2014~2015学年2学期面向对象程序设计课程 一、单选题(每小题2分,共20分) CCDCBAAABA 二、改错题(共3小题,每小题6分,共18分) 1.main()函数第3句出错,因为类Complex无类类型转换函数,将Complex对象转换成float。 改正: 在Complex中类增加: operatorfloat(){returnreal;} 2.main()函数第2句出错,因为常对象obj不能调用非常成员函数, 改正: 在CTest类中: 将CTest(intx)换成fCTest(intx)const。 或者将main()中constCTestobj(5);换成CTestobj(5); 3.当程序执行对象p2的析构函数时,对象p1的数据成员ptr出现了所谓的“指针悬挂问题”,这说明C++中提供给对象的默认的赋值运算符并不是万能的,解决的办法就是重载赋值运算符“=”,使对象不但能浅拷贝,还能实现深层拷贝。 STRING&STRING: : operator=(constSTRING&s) {if(this==&s)return*this; deleteptr; ptr=newchar[strlen(s.ptr)+1]; strcpy(ptr,s.ptr); return*this; } 三、读程序,给出程序的输出结果。 (每小题6分,共24分) 【1】ConstructorofPerson ConstructorofStudent ConstructorofPerson ConstructorofTeacher DestructorofTeacher DestructorofPerson DestructorofStudent DestructorofPerson 【2】12,2 【3】56789 【4】1123444 四、编程题(共38分=12分+12分+14分) 1.解答: #include classTest……………………………4分 {intx,y; public: voidinit(int,int); voidprint(); }; voidTest: : init(inti,intj)……………………………4分 {x=i;y=j; } voidTest: : print()……………………………4分 {cout<<"测试结果: "< } 2.解答: ①fractionoperator+(fraction&f1,fraction&f2) {……………………………4分 intnfz=f1.fz*f2.fm+f1.fm*f2.fz; intnfm=f1.fm*f2.fm; returnfraction(nfz,nfm); } ②fraction&fraction: : operator=(fraction&f) {……………………………4分 fz=f.fz; fm=f.fm; return*this; } ③istream&operator>>(istream&is,fraction&f) {……………………………4分 is>>f.fz>>f.fm; returnis; } 3.解答: #include usingnamespacestd; classemployee {……………………………4分 protected: charname[20]; intempNo; floatsalary; public: employee(char*cp="李强",intno=1001); employee(employee&); voidsetname(char*cp); voidsetempNo(intno); voidsetsalary(floatsa); char*getname(); intgetempNo(); floatgetsalary(); voiddisplay(); employeecompsalary(employee*emp); }; employee: : employee(char*cp,intno) {inti=0; while(*cp) {name[i]=*cp; i++; cp++; } name[i]='\0'; empNo=no; } employee: : employee(employee&em) {inti=0; while(em.name[i]) {name[i]=em.name[i]; i++; } name[i]='\0'; empNo=em.empNo; salary=em.salary; } voidemployee: : setname(char*cp) {inti=0; while(*cp) {name[i]=*cp; i++; cp++; } name[i]='\0'; } voidemployee: : setempNo(intno) {empNo=no; } voidemployee: : setsalary(floatsa) {salary=sa; } char*employee: : getname() {returnname; } intemployee: : getempNo() {returnempNo; } floatemployee: : getsalary() {returnsalary; } voidemployee: : display() {cout<<"工号为"< } employeeemployee: : compsalary(employee*emp) { if(this->salary>=emp->salary) return*this; else return*emp; } classworker: publicemployee……………………………4分 { public: worker(char*,int,int); voidsetproductNum(intn) {productNum=n;} intgetproductNum() {returnproductNum;} voidpay(); private: intproductNum; staticfloatproper;//每件产品的利润 }; floatworker: : proper=20;//假设每件产品的利润为20元 worker: : worker(char*name,intno,intpronum) : employee(name,no) { productNum=pronum; } voidworker: : pay() { salary=productNum*proper*0.2; } classtechnician: publicemployee……………………………4分 { public: technician(char*,int,float); voidsethours(floath) {workHours=h;} floatgethours() {returnworkHours;} voidpay(); private: floatworkHours; staticfloatpayperhour;//科研人员每小时工作的酬金 }; floattechnician: : payperhour=40;//假设科研人员每小时工作的酬金为40元 technician: : technician(char*name,intno,floathours) : employee(name,no) {workHours=hours; } voidtechnician: : pay() {salary=workHours*payperhour; } classsalesman: publicemployee { public: salesman(char*,int,float); voidsetmonthlysales(intnum) {monthlysales=num;} intgetmonthlysales() {returnmonthlysales;} voidpay(); private: floatmonthlysales; staticfloatpercent;//销售人员的销售提成 }; floatsalesman: : percent=0.5;//假设销售人员的销售提成为50% salesman: : salesman(char*name,intn,floatsn) : employee(name,n) { monthlysales=sn; } voidsalesman: : pay() { salary=monthlysales*percent; } voidmain()……………………………2分 { workerw1("张三",1001,1000); techniciant1("李四",1002,200); salesmans1("王五",1003,10000); w1.pay(); t1.pay(); s1.pay(); cout<<"工人"< cout<<"科研人员"< cout<<"销售人员"< }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大学 C+ 面向 对象 试题 参考答案