您好,欢迎来到99网。
搜索
您的当前位置:首页历年考试题-2011级C++面向对象程序设计试题A-计算机学院2012夏

历年考试题-2011级C++面向对象程序设计试题A-计算机学院2012夏

来源:99网
2011-2012学年第2学期

2011级《C++面向对象程序设计》期末考试试题(A卷)

考试时间:2012年6月29日

班级 学号 姓名  本试卷满分100分;

 请将答案写在答题纸上,写明题号,不必抄题,字迹工整、清晰;

 请在答题纸和试题纸上都写上你的班级,学号和姓名,交卷时请将试题纸、答题纸和草纸

一并交上来。

一、单选题(共20分,每题2分)

1. 关注重要的属性,而忽略非本质的细节被称为:

(A) 封装 (B) 隐藏 (C) 抽象 (D) 覆盖 2. 下列哪个最能体现对象与类的关系:

(A)书和图书馆 (B) 林肯和总统 (C) 母亲和女儿 (D) 学生和研究生 3. 相同的操作,但可能有不同的实现,这一面向对象特征被称为:

(A) 复用 (B) 继承 (C) 多态 (D) 名字空间

4. 如果类C以公有继承方式从类B派生,类B以公有继承方式从类A派生,那么类C的成

员函数能访问:

(A) 类B和类A中的私有的数据成员 (B) 仅类C中公有和保护的数据成员 (C) 类B和类A中的保护的数据成员 (D) 仅类C与类B中公有和保护的数据成员 5. 下列哪个类不需要显式定义拷贝构造函数:

(A) 一个字符串类,其构造函数中分配了堆中的内存空间,析构函数中进行了释放 (B) 一个公司雇员类,其任意两个实例对象不能具有相同的员工编号 (C) 一个日志类,其至多只能有一个实例

(D) 一个图书馆类,其包含一个书籍对象的数组

6. 定义类A的静态成员函数A& f(A &a)时,下列不能作为函数返回值的是:

(A) a (B) 类A中定义的类型为A的静态数据成员 (C) *this (D) 函数f中用语句A& b=a; 定义的量b 7. 下列关于对象存储的说法,正确的是:

(A) 对象中不包含所有静态函数的地址,但包含所有非静态函数的地址

(B) 对象中非静态数据成员可能存储在栈区,也可能在堆区,还可能在全局数据区 (C) 对象中静态数据成员可能存储在栈区,也可能在堆区,还可能在全局数据区 (D) 对象中只存放在本类中定义的所有非静态数据成员 8. 运行时多态是通过下列哪种机制实现的:

(A) 静态联编 (B) 虚函数 (C) 内联函数 (D) 运算符重载 9. 假设有如下类定义class B{ /*略*/ }; class A{ public: void fun(B&); /*略*/ }; 则类A、B之间

最可能的关系是: (A) 依赖关系 (B) 聚合关系 (C) 组合关系 (D) 泛化关系 第1页 共5页 10. 下列关于抽象类的描述中,正确的是:

(A) 抽象类中的所有成员函数必须声明为纯虚函数 (B) 抽象类不能实例化,但可以有数据成员

(C) 抽象类没有构造函数,所以自身不能实例化,只能通过派生类实例化 (D) 抽象类和其派生类共用一个虚函数表

二、判断正误,对于你认为错误的论述,说明原因或举出反例。(共20分,每题2分) 1. 在类的非静态成员函数中,可以通过(*this).x的方式访问类的数据成员x。 2. 在自定义类的赋值函数时,应先判断是否是自赋值。 3. 在类Book中可以同时定义多个重载的构造函数,如Book ( ); Book (char* author, char* title)。 4. 静态对象成员会在所属类的析构函数被调用时自动析构。 5. 6. 7. 8. 9. 10.

类A的友元函数可以访问类A及其派生类的私有数据成员和成员函数。 虚基类的所有成员函数都是虚函数。

复用一个已有的类时,应优先选择继承方式,而不是组合方式。 使用异常处理机制不能解决程序的编译时错误和逻辑错误。 构造函数为常函数时,这个类就只能创建常对象。

类成员的初始化是按照初始化列表中的顺序进行,因而程序员可以自己任意指定成员的初始化顺序。

三、回答下列各题(每题4分,共20分)

1. 某个C++应用程序由1个.cpp文件和3个.h文件组成,.cpp文件为mymain.cpp,.h文件分

别为file1.h、file2.h、head.h,文件间的包含关系如下:

//mymain.cpp #include \"file1.h\" #include \"file2.h\" // 略 // file1.h //file2.h #include \" head.h\" #include \"head.h\" // 略 // 略 //head.h int data =10; class A { /* 略 */ }; 请分析该程序是否存在问题,如果存在,如何改进?

2. 如果要编写一个虚函数func,它接收自定义FOO类型的参数,且无返回值;同时强调当对

象处理消息func时,不会修改本对象,也不修改实参。请给出至少3种不同写法的func函数原型。

3. 请说明自定义名字空间的好处。

4. 如何定义一个类,使其至多只能有一个实例?(要求给出示例代码)

5. 请用面向对象方法分析鲸鱼(Whale)、鲤鱼(Carp)、鱼群(Shoal)、游泳(Swim)之间的关系,

可以添加必要的类。

四、(6分) 请用面向对象的方法分析并描述童谣“小耗子,上灯台,偷吃油,下不来,叽里咕

噜滚下来”中的故事。描述时,类、对象、方法的名字可以使用汉字,例如“小猫钓鱼”可以抽象出猫类、鱼类,小猫是猫类的一个实例,某个鱼是鱼类的实例,猫有钓的行为,

则“小猫钓鱼”可描述为: 猫 小猫; 鱼 某个鱼; 小猫.钓(某个鱼);

五、(6分)现请你使用文字,描述一个实际问题,使得该问题是对应于下表中代码的一个应用例

子,同时请指出你所描述的问题中分别与A、B、C、D、E、f、g、DoSome具有对应关系的事物或行为。

class A { public: virtual ~A( ); virtual void f( ) = 0; }; class C { public: virtual ~C( ); virtual void g( ) = 0; }; class B: public A { public: virtual ~B( ); virtual void f( ) { /*略 */ } }; class D: public C { public: virtual ~D( ); virtual void g( ) { /*略 */ } }; class E { public: E(A& a):aA(a) { } void DoSome( C & aC ) { /* 略*/ aA.f( ); /* 略*/ aC.g( ); /* 略*/ } private: A& aA; };

六、分别写出下面两个程序的运行结果(共10分) 1. #include class A{ static int count; public: static void Func(A a); A(int n = 0): mVal (n) { Show ( );} A(const A& a):mVal(a.mVal) { Show( ); } void Show ( ) { mVal += count ++; cout << mVal << endl; } ~A( ) { Show ( ); } private: int mVal; };

void A::Func(A a){ cout << a.mVal ++ << endl; } int A:: count =0; int main( ) { A a(0); A b(a); A c(1); A::Func(b); return 0; } 2. #include class Base { public: virtual ~Base( ) {} virtual void vf( ) { cout<<“Base::vf( )”<vf( ); p->vg( ); p->nvh( ); delete p; return 0; }

七、(8分) 某程序需要定义并实现具有上锁(Lock),开锁(unlock)功能的门(Door)类。另外,还

需要定义带有报警功能的门(AlarmDoor),一个AlarmDoor只能有一个报警器(Alarm),并通过这个报警器实现报警功能。

1) 针对上述需求,请给出相关类的定义,使其较好地符合面向对象设计思想。

2) 如果程序需要多种不同种类的Door,各种类的Door有不同的lock,unlock功能实现;同时还需要多种不同的Alarm,不同种类Alarm的报警功能实现也互不相同。请问你在1)中的设计能否适应这种要求,若能,说明如何适应新要求;若不能,说明如何改进设计来适应新要求。

八、(10分) 小王要在控制台模式中实现一个功能菜单,一个菜单包含一个或多个菜单项,每个

菜单项可以执行一个用户命令,或者显示下一级子菜单。小王所期望的程序输出见下表1,其中选择“1:新增项目”菜单项,会显示下一级子菜单,选择2、3则执行用户命令。小王给出的main函数请见下表2。

请阅读main函数,理解小王的设计思路,并回答下面问题(可以直接使用strcpy,strcmp,strlen库函数):

1) 请说明MenuItem 和 EditMenuItem, DeleteMenuItem是什么关系? 如果想增加其它菜单功能应如何实现?(2分)

2) 要求不改变main函数,根据main函数的需要,给出MenuItem的完整定义和实现。要求MenuItem的构造函数原型必须为: MenuItem (const char* name) (3分)

3) 为实现“1:新增项目”菜单项,小王从MenuItem派生了SubMenu,在SubMenu中的Execute封装了显示下一级菜单和接受用户输入的功能,并从SubMenu继续派生了NewMenuItem。NewMenuItem的定义见下表3。

请根据NewMenuItem的定义和功能要求,给出类SubMenu的完整定义和实现。(3分) 4) 后来,小王发现SubMenu的Execute函数实现的功能和main函数重复了,于是又从SubMenu类派生了MainMenu类,用MainMenu利用类似于NewMenuItem的方法实现了原来main函数的功能。假定MainMenu已经设计好,并提供了一个无参的构造函数。请根据这一改动改写main函数,将原有main函数的功能用MainMenu重新实现。(2分) NewMenuItem new_item; EditMenuItem edit_item; DeleteMenuItem del_item; MenuItem* AllMainItems[ ]={&new_item,&edit_item,&del_item }; int main( ) { (选1后继续提示:) cout << \"请选择:\" << endl; 表请选择: int count=sizeof(AllMainItems)/sizeof(MenuItem*); //菜单个数 1 1:项目类型1 for ( int i=0; im_szName << endl; } 2:项目类型2 int index = -1; 3:项目类型3 cin >> index; if ( index>0 && index <= count ) AllMainItems[index-1]->Execute( ); return 0; } CreateMenuItem item1(1), item2(2), item3(2); MenuItem* CreateMenuItem::AllItems[ ]={&item1,&item2,&item3}; class NewMenuItem : public SubMenu { public : 表 NewMenuItem( ):SubMenu(\"新建项目\ 3 AllCreateItems , sizeof(AllCreateItems)/sizeof(MenuItem*) ) { } };

(全卷完)

(运行时提示:) 请选择: 1:新增项目 2:编辑项目 3:删除项目 表2

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务