第1页福建工程学院2014--2015学年第一学期期末考试(A卷)共9页课程名称:面向对象程序设计考试方式:开卷()闭卷(√)题号一二三四五六七八九十总分统分人签名得分考生注意事项:1、本试卷共9页,请查看试卷中是否有缺页。2、考试结束后,考生不得将试卷、答题纸和草稿纸带出考场。教师注意事项:如果整门课程由一个教师评卷的,只需在累分人栏目签名,题首的评卷人栏目可不签名。一、单项选择题(每小题2分,共30分)1.下列各项描述中(A)是错误的。A.同一个类的两个对象占用相同的内存空间。B.在类外部直接使用类中的私有成员是错误的。C.一个对象数组中的所有数组元素属于同一个类。D.在类外部定义成员函数是,必须使用作用域运算符::。2.编写C++程序一般需经过的几个步骤,(B)描述次序是正确的。A.编译、编辑、连接、调试B.编辑、编译、连接、调试C.编译、调试、编辑、连接D.编辑、调试、编译、连接3.下列描述类的成员函数的选项中,(C)是错误的。A.构造函数B.析构函数C.友元函数D.拷贝构造函数4.继承机制的作用是(C)A.信息隐藏B.数据封装C.定义新类D.数据抽象第2页5.假定A为一个类,则执行“Aa(2),b[3],*p[4];”语句时共调用该类构造函数的次数为(B)。A.3B.4C.5D.96.以下关于基类中的成员函数的描述中,(C)是表示纯虚函数的。A.virtualvoidvf(int)B.voidvf(int)=0C.virtualvoidvf()=0D.virtualvoidyf(int){}7.如果表达式++a中的“++”是作为成员函数重载的运算符,若采用运算符函数调用格式,则可表示为(D)A.a.operator++(1)B.operator++(a)C.operator++(a,1)D.a.operator++()8.以下叙述中(C)是正确的。A.构造函数调用虚函数采用动态联编B.构造函数可以说明为虚函数C.当基类的析构函数是虚函数时,它的派生类的析构函数也是虚函数D.析构函数调用虚函数采用动态联编9.c++程序中,(C)可以解决二义性问题。A.只有使用作用域分辨操作符B.使用作用域分辨操作符或赋值兼容规则C.使用作用域分辨操作符或虚基类D.使用虚基类或赋值兼容规则得分评卷人密封线班级:______姓名:______学号:______第3页10.下面运算符中,(C)不能被重载。A.=B.-C.?:D.[]11.下列有关模板和继承的叙述中(D)是正确的。A.模板和继承都可以派生出一个类系B.从类系的成员看,模板类系的成员比继承类系的成员较为稳定C.从动态性能看,继承类系比模板类系具有更多的动态特性D.相同类模板的不同实例一般没有联系,而派生类各种类之间有兄弟父子等关系12.C++的继承性允许派生类继承基类的(A)。A.部分特性,并允许增加新的特性或重定义基类的特性B.部分特性,但不允许增加新的特性或重定义基类的特性C.所有特性,并允许增加新的特性或重定义基类的特性D.所有特性,但不允许增加新的特性或重定义基类的特性13.一个函数功能不太复杂,但要求被频繁调用,则应把它定义为(A)。A.内联函数B.重载函数C.递归函数D.嵌套函数14.假定A为一个类,px为指向该类的一个含有n个对象的动态数组的指针,则执行“delete[]px;”语句时共调用该类析构函数的次数为(C)A.0B.1C.nD.n+115.C++中,真正能实现运行时多态的函数是(D)。A.内联函数B.重载函数C.纯虚函数D.虚函数二、填空题(每空1分,共20分)第4页1.在类中,将关键字__const________写在函数体之前函数头之后,说明该函数是一个__const成员函数________,可以防止函数改变数据成员的值。。2.类中可以有许多相同名称,但参数类型或个数不同的成员函数,称为函数重载。3.对于双目运算符,若重载为类的成员函数,有1个参数;若重载为友元函数,则有2个参数。4.在C++中,声明布尔类型变量所用的关键字是__bool_____。5.所有模版都是以__template、____关键字和一个形参表开头的。6.如果一个类中有一个或多个纯虚函数,则这个类称为抽象类。7.设要把一个文件输出流对象myFile与文件“f:\myText.txt相关联,所用的C++语句是:myFile.open(“f:\\myText.txt”);//ofstreammyFile(“f:\\myText.txt”)。8.假设类X的对象x是类Y的成员对象,则“YObj”语句执行时,先调用类_____X_____的构造函数,再调用类___Y_____的构造函数。9.基类的公有成员在私有派生类中是____私有______成员,基类的保护成员在公有派生类中是___保护_______成员。10.对虚函数使用对象指针或引用,系统使用__动态_______联编,对虚函数使用对象调用时,系统使用____静态______联编。11.执行__deletep____操作将释放由p所指向的动态分配的数据空间。12.静态成员定义的关键字为_static________,一般通过__成员名限定______来访问静态成员。13.重载“”操作符时,应声明为_____输出重载_______函数。14.假定用户为类A定义了一个构造函数“A(intaa=0):a(aa){}”,则创建该类的对象时,构造函数可以有_____2___种不同的调用格式。得分评卷人班级:______姓名:______学号:______密封线三、程序分析(每小题4分,共20分)第5页1.阅读程序,写出运行结果:#includeiostream.hclassSample{private:intx;public:Sample(){}Sample(inta){x=a;}voiddisp(){coutx=xendl;}Sampleoperator+(Sample&);friendSampleoperator-(Sample&,Sample&);};SampleSample::operator+(Sample&s){returnSample(x+s.x);}Sampleoperator-(Sample&s1,Sample&s2){returnSample(s1.x-s2.x);}voidmain(){Sampleobj1(5),obj2(10),obj3;obj3=obj1+obj2;obj3.disp();(obj1-obj2).disp();}2.阅读程序,写出运行结果:#includeiostream.hclassa{public:virtualvoidfunc(){coutfuncinclassaendl;}};classb{public:virtualvoidfunc(){coutfuncinclassbendl;}};classc:publica,publicb第6页{public:voidfunc(){coutfuncinclasscendl;}};voidmain(){cc;a&pa=c;pa.func();b&pb=c;pb.func();}3.阅读程序,写出运行结果#includeiostream.hclassA{public:A(char*s){coutsendl;}};classB:virtualpublicA{public:B(char*s1,char*s2):A(s1){couts2endl;}};classC:virtualpublicA{public:C(char*s1,char*s2):A(s1){couts2endl;}};classD:publicB,C{public:D(char*s1,char*s2,char*s3,char*s4):B(s1,s2),C(s3,s4),A(s1){couts4endl;}};voidmain(){Dd(classA,classB,classc,classD);}得分评卷人班级:______姓名:______学号:______密封线运行结果:funcinclasscfuncinclassc运行结果:classAclassBclassDclassD运行结果:X=15X=-5第7页4.阅读程序,写出运行结果。#includeiostream.hclassA{protected:intx;public:A(intx){A::x=x;coutclassAendl;}};classB{private:Aa1;public:B(intx):a1(x){coutclassBendl;}};classC:publicB{private:Aa2;public:C(intx):B(x),a2(x){coutclassCendl;}};classD:publicC{public:D(intx):C(x){coutclassDendl;}};voidmain(){Ddoobj(10);}5.阅读程序,写出运行结果。#includestring.hclassSample{private:char*str;public:Sample(char*s){str=newchar[strlen(s)+1];strcpy(str,s);第8页}voiddisp(){coutstr=strendl;}char&operator[](int);};char&Sample::operator[](inti){return*(str+i);}voidmain(){char*s=olympics;Sampleobj(s);obj.disp();intn=strlen(s);while(n=0){obj[n-1]=obj[n-1]-32;n--;}obj.disp();}四、编程题(每题10分,共30分)1.编写复数类Complexnumber,其属性为:real(实部),img(虚部)。完成复数的加法运算Add()和减法运算Sub()及对应的+运算符和-运算符重载。#includeiostreamusingnamespacestd;classComplexnumber{private:doublereal;doubleimg;public:Complexnumber(doublerr=1.0,doubleii=1.0){real=rr,img=ii;}Complexnumberoperator+(Complexnumbercom);得分评卷人班级:______姓名:______学号:______密封线运行结果:classAclassBclassAclassCclassD运行结果:str=olympicsstr=OLYMPICSComplexnumberoperator-(Complexnumbercom);doubleget_real(){returnreal;}doubleget_img(){returnimg;}friendComplexnumberAdd(Complexnumbera,Complexnumberb);friendComplexnumberSub(Complexnumbera,Complexnumberb);};ComplexnumberComplexnumber::operator+(Complexnumbercom){Complexnumbercc;cc.img=img+com.img;cc.real=real+com.real;returncc;}ComplexnumberComplexnumber::operator-(Complexnumbercom){Complexnumbercc;cc.img=img-com.img;cc.real=real-com.real;returncc;}ComplexnumberAdd(Compl