深圳大学《面向对象程序设计》试卷A卷第1页共14页C++期末考试试卷及答案1一、单项选择题(每题2分,共40分)1.______不是属于面向对象程序设计的特性A.抽象性B.数据相关性C.多态性D.继承性2.将对某一类数据的处理算法应用到另一类数据的处理中,要用到C++的______A.类B.虚函数C.运算符重载D.模板3.C++与C语言最根本的不同之处在于_______A.使用了类B.能够实现变量自动初始化C.支持软件重用D.支持接口重用4.动态内存分配的主要目的是_______A.使程序按动态联编方式运行B.正确合理的使用内存C.提高程序的运行速度D.提高程序的可维护性5.在C++函数的形参前加const关键字,是为了提高函数的_______A.数据封装性B.可理解性C.可维护性D.可重用性6.函数重载的目的是________A.实现共享B.使用方便,提高可读性C.提高速度D.减少空间7.从程序片断:charname[]=C++;course(name);可判断函数course的调用采用的是_______A.传值调用B.带缺省参数值的函数调用C.引用调用D.传址调用8.用来说明类中公有成员的关键字是________A.publicB.privateC.protectedD.friend9.如果一个类的成员函数print()不修改类的数据成员值,则应将其声明为A.voidprint()const;B.constvoidprint();C.voidconstprint();D.voidprint(const);10.下列关于构造函数的论述中,不正确的是_______A.构造函数的函数名与类名相同B.构造函数可以设置默认参数C.构造函数的返回类型缺省为int型D.构造函数可以重载11.在程序代码:A::A(inta,int*b){this-x=a;this-y=b;}中,this的类型是______A.intB.int*C.AD.A*12.内存泄漏是指_______A.内存中的数据出现丢失B.试图释放一个已经释放了的动态分配的堆内存C.函数中局部变量所占的栈内存没有及时回收D.动态分配的堆内存在程序退出后始终被占用13.从程序片断:studentzhangsan(张三,M,22);zhangsan.id(2005131000);可判断id是一个________A.私有成员数据B.私有成员函数C.公有成员数据D.公有成员函数14.友元函数_______A.可以被声明为constB.没有this指针C.可以用类名或对象名来调用D.只能用对象名来调用深圳大学《面向对象程序设计》试卷A卷第2页共14页15.若一个类的成员函数前用static关键字修饰,则该成员函数________A.可以被声明为constB.没有this指针C.可以访问该类的所有成员D.只能用对象名来调用16.C++是用_______实现接口重用的A.内联函数B.虚函数C.重载函数D.模板函数17.公有继承的派生类对象可以访问其基类的________A.公有成员B.公有成员及受保护成员C.受保护成员D.私有成员18.设置虚基类的目的是________A.简化程序B.使程序按动态联编方式运行C.提高程序运行效率D.消除二义性19.下列关于纯虚函数和抽象类的描述中,不正确的是________A.纯虚函数是一个没有具体实现的虚函数B.抽象类是包括纯虚函数的类C.抽象类只能作为基类,其纯虚函数的实现在派生类中给出D.可以定义一个抽象类的对象20.关于运算符重载的不正确的描述是________A.运算符重载函数是友元函数B.体现了程序设计的多态性C.增加新的运算符D.使运算符能对对象操作二、下面的程序是关于CBook类的一个定义,试改正程序中的错误。(共10分)#includeiostream.h#includemath.h#inlcudestringclassCBook{private:char*p_book;public:p_book=newchar[strlen(p_val)+1]CBook(constchar*p_val){p_book=newchar[strlen(p_val)];strcpy(p_book,p_val);}voidprint()const{coutp_bookendl;}~CBook(){delete[]p_book;}};voidmain(){charbook_title[60];CBook*p_book_obj;cout“Enterbooktitle:”;cinp;CBookabook(p);p_book_obj=&abook;p_book_obj-print();}三、根据如下所示程序,回答下列问题(共10分)深圳大学《面向对象程序设计》试卷A卷第3页共14页#includeiostream.hclassCJournal{public:CJournal(){cout“Journaldefaultconstructor”endl;}virtualvoidsubscribe()=0;voidread(){cout“Readpaper”endl;}~CJournal(){cout“Journaldefaultdestructor”endl;}};classCComputerDesign:publicCJournal{public:CComputerDesign(){cout“《ComputerDesign》defaultconstructor”endl;}virtualvoidsubscribe(){cout“Subscribing《ComputerDesign》”endl;}voidread(){cout“Reading《ComputerDesign》”endl;}~CComputerDesign(){cout“《ComputerDesign》defaultdestructor”endl;}};voidmain(){CComputerDesignjournal1;CJournal*p_journal;journal1.subscribe();journal1.read();//①p_journal=&journal1;p_journal-subscribe();p_journal-read();}1.当程序运行到①处时,写出程序运行的输出结果(3分)2.当程序结束时,程序会在第1问的基础上增加哪些输出。(4分)3.若在主函数中定义一个对象CJournaljournal;程序编译时会否出错?为什么?(3分)四、编程题(共40分)1.定义一个商品类CGoods,其中包含商品号(longno)、商品名(char*p_name)、商品价格(doubleprice)三个数据成员,以及相应的构造函数、拷贝构造函数、析构函数、打印数据成员的成员函数。(10分)#includeiostream深圳大学《面向对象程序设计》试卷A卷第4页共14页#includestring.husingnamespacestd;classCCourse{private:longno;char*p_name;floatcredit;public:CCourse(longno_val,charp_val,floatcredit_val);CCourse(constCCourse&r_course);~CCourse(){deletep_name;}voidprint()const;};CCourse:CCourse(longno_val,charp_val,floatcredit_val){no=no_val;p_name=newchar[strlen(p_val)+1];strcpy(p_name,p_val);credit=credit_val;}CCourse:CCourse(constCCourse&r_course){no=r_course.no;p_name=newchar[strlen(r_course.p_name)+1];strcpy(p_name,r_course.p_name);credit=r_course.credit;}voidCCourse:print()const{coutCoursenumbernoendl;coutCoursenamep_nameendl;coutCoursecreditcreditendl;}深圳大学《面向对象程序设计》试卷A卷第5页共14页2.为CGoods类增加一个商品总数(intcount)数据成员,并增加一个成员函数getCount()获取count的值,编写一个友元函数getName()获取商品名称p_name。做如上修改后,重新实现CGoods类(与第1问相同的不用再重复)。(10分)3.为CGoods类定义小于运算符(‘’)和不小于运算符(‘=’)两个运算符重载函数。CGoods类对象大小的比较是根据其商品价格(price)的值的大小来实现的。(与第2问相同的不用再重复)(10分)4.以CGoods类为基类,派生出服装类CClothes和食品类CFood两个派生类,并在这两个类中分别增加一个表示品牌的指针数据成员(char*p_brand)和表示用途的成员函数(voidusedFor()——可分别输出一条表示服装和食品用途的信息)。写出CClothes类和CFood类的完整定义(包括构造、析构和usedFor()成员函数的实现)。(10分)深圳大学《面向对象程序设计》试卷A卷第6页共14页五、附加题(共30分。注意:确保基本题成绩能达到75分以上,再尝试做附加题!)1.在基本题第四题的基础上,在CGoods类增加总商品数(longtotal_goods)和商品总价格(doubletotal_price)两个数据成员,以及相应的获取这两个数据成员值的成员函数getTotalGoods()和getTotalPrice()。(注意说明数据成员和成员函数的存储类型,以便能够用类名来调用getTotalGoods()和getTotalPrice()这两个函数)。为了能够采用动态联编的方式调用派生类的usedFor()成员函数,应该在CGoods类及其派生类CClothes和CFood类中作何改动?(15分)深圳大学《面向对象程序设计》试卷A卷第7页共14页2.编写一个实现两个数交换的函数模板swap,然后使用该函数模板再编写一个对具有n个数组元素(通用类型)的数组采用冒泡排序算法进行排序的函数模板。(15分)试卷参考答案一、单项选择题1-5.BDABC6-10.BDAAC11-15.CADBB16-20.CADDA(每小题答对2分,不答0分,答错0分)二、#includemath.h改为#includestring.hp_book=newchar[strlen(p_val)]改为p_book=newchar[strlen(p_val)+1]深圳大学《面向对象程序设计》试卷A卷第8页共14页CBookabook;改为CBookabook(p);p_book_obj=abook改为p_book_obj=&abook;p_book_obj.print()改为p_book_obj-print();(该对得2分,未改或改错得0分,正确之处该成错误倒扣1分)三、1.JournaldefaultconstructorComputerDesigndefaultconstructorSubscribingComputerDesignReadingComputerDesign(全部答对得3分,答错或漏答一条输出扣1分)2.SubscribingComputerDesignReadingpaperComputerDesigndefaultdest