99网
您的当前位置:首页历年考试题-2012级C++面向对象程序设计试题A-计算机学院2013夏定稿

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

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

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

考试时间:2013年6月26日

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

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

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

一并交上来。

一、单选题(共12分,每题2分) 1. C++中解决命名冲突的机制是:

(A) 友元 (B) 虚函数 (C) 函数重载 (D) 名字空间 2. 下列哪个不应该出现在头文件中:

(A) extern int count; (B) const int count=10; (C) void fun( ) {/* 略 */} (D) class Time {/* 略 */}; 3. 下列哪个属于函数重载:

(A) int fun( ); float fun( ); (B) int fun(int); int fun(int, int); (C) int fun(int); int fun(const int &); (D) int fun(int *); int fun(int *const); 4. 定义类A的成员函数A* f(A a) const时,下列哪个适合作为函数返回值:

(A) &a (B) 类A中定义的类型为A*的静态数据成员 (C) this (D) dynamic_cast(&a) 5. 不同的对象收到同一消息可以产生完全不同的结果,这一现象称作:

(A) 继承 (B) 多态 (C) 动态绑定 (D) 静态绑定 6. 若类A仅在其成员函数fun中定义并使用了类B的一个对象,类A其他部分的代码都不涉

及类B,那么类A与类B的关系最可能是: (A) 依赖 (B) 继承 (C) 聚合 (D) 组合 二、判断正误,对于你认为错误的论述,说明原因或举出反例。(共20分,每题2分) 1. 代码double dval; float *pi = &dval; 中会发生隐式类型转换,因此不存在语法错误。 2. 已知类A,且语句const A a; a.fun( );是合法的,则fun( )一定是常成员函数。 3. 类B继承类A,那么sizeof(B)的值大于sizeof(A)的值。 4. 单参构造函数一定可以被用来执行隐式类型转换。 5. 类中没有声明虚函数,则不会为该类生成虚拟表。

6. 异常必须在其产生的当前函数中捕获,而不能在外层函数中捕获该异常。

7. 由于抽象类不能实例化,但能派生新类,所以抽象类中的构造函数和拷贝构造函数应该是

protected的。

8. 虚函数可以访问虚函数和非虚函数,但非虚函数不能访问虚函数。 9. 重载的析构函数应与重载的构造函数一一对应。

10. 假设类A及其祖先类中均不含有指针型或引用型数据成员,执行代码块{ A a; A b(a); }时,

即便使用类A的缺省拷贝构造函数也可能造成内存泄露。

第1页 共6页

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

1. 某个C++应用程序由1个.h文件和2个.cpp文件组成,各文件如下: //fun.h class A { public: void fun(int = 0); }; // fun.cpp void A::fun(int num = 0) { /* 略 */ } //main.cpp int main( ) { A obj; obj.fun( ); return 0; } 请指出程序代码中存在哪些问题或有待改进的地方?如何改进?

2. 已知字符串类string,请说明函数void fun(string); void fun(string &); 和void fun(const

string&); 之间在语义和使用上的区别。

3. 可以对局部对象显式调用析构函数吗?请说明理由。

4. 请问如何修改类A的设计,使得既可以在类外得到类A的多个实例,又能够禁止从类A

派生其它类?

class A { public: A(int n):val(n) { } private: int val; };

5. 某订单管理系统中,Customer表示客户类,Product表示产品类,ProductList表示产品列表

类,Order表示产品订单类,OrderItem表示产品订单中的条目类,OrderList表示订单列表类,请分析并给出各类之间的关系。 order和customer是聚合,order和orderitem是组合或聚合,orderitem和product是聚合,product和productlist是聚合

6. 请举例说明在哪些情况下,实现自定义构造函数必须使用初始化列表(至少给出4种)?

7. 请实现派生类B的自定义拷贝构造函数和赋值函数,用于实现类B的深拷贝和深赋值。

A和B类的部分代码如下: class A { public: A(int n1,int n2) { array[0] = n1; array[1] = n2;} private: int array[2]; }; class B: public A { public: B(int m1,int m2,int m3) :A(m1,m2),p(new int(m3)) {} ~B( ) { delete p; } private: int * p; };

四、(5分)某绘图程序已存在矩形(Rect)、椭圆(Ellipse)两种图形元素。现要将三角形(Triangle)

图形元素加入该程序以实现功能扩充。已知某第三方类库中提供了XTriangle类,且完全满足程序新增的Triangle图形元素所需的功能,但XTriangle不是由Shape派生而来,而且由于缺少XTriangle类的源代码,不能从XTriangle类直接派生子类。请在下边给出的类的基础上,利用XTriangle类,定义并实现Triangle类。

class Shape { public: virtual ~Shape( ){ } virtual void Draw( )=0; }; class Rect:public Shape { public: Rect ( ) { /*略 */} virtual ~Rect ( ) { } virtual void Draw ( ) { /*略 */ } }; class Ellipse:public Shape{ public: virtual ~ Ellipse ( ) { } virtual void Draw ( ) { /*略 */ } }; //第三方类库中提供的XTriangle类定义 class XTriangle { public: virtual ~ XTriangle ( ); void DrawIt( ) ; };

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

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

class D { public: virtual ~D( ); virtual void g( )=0; }; class A { public: virtual ~A( ); virtual void f(D&)=0; }; class E: public D { public: virtual ~E( ); virtual void g( ) { /*略*/ } }; class B: public A { public: virtual ~B( ); virtual void f(D& d) { d.g( ); /*其它代码略*/ } }; class F: public D { public: virtual ~F( ); virtual void g( ) { /*略*/ } }; class C: public A { public: virtual ~C( ); virtual void f(D& d) { d.g( ); /*其它代码略*/ } };

六、(8分) 现欲开发一款导弹飞行仿真系统,该系统主要模拟不同型号导弹的发射方式与飞行

特征。需要模拟的导弹型号及其特征如下表所示。 导弹型号 中华(ChinaA) 红鸟(RedBirdB) 东风(SpringC) 远征(ExpeditionD)

发射方式(LaunchMode) 海基型(SeaLaunch) 空基型(AirLaunch) 陆基型(LandLaunch) 海基型(SeaLaunch) 飞行特征(FlyBehavior) 亚音速飞行(SubSonicFly) 亚音速飞行(SubSonicFly) 超音速飞行(SuperSonicFly) 超音速飞行(SuperSonicFly) 将来还会模拟更多型号的导弹。请给出相关类的定义,使其较好地符合面向对象程序设计思想。

七、 (10分)填写代码。 #include class CallBackObject; class Server { public: a) Server(int size) :len(size){ data = new int[len] ; for(int i=0;i< len;++i) data[i]= i+1; a) } ~Server( ) { delete[] data data = new int[len]; } int Total(CallBackObject& obj); private: int len; int * data; }; int Server::Total(CallBackObject& obj) { int sum = 0; for(int i=0; i1. (5分)请分别给出空格1-5中正确的代码,使得主函数1的输出为3和15. 2. (2分)请分别给出空格6-7中正确的代码,使得主函数2的输出为:

平方和=5 平方和=14

3. (3分)请重新实现ClientB中的相关函数,使得主函数2的输出为:

1 2 的平方和=5

1 2 3 的平方和=14

八、 (共12分)小王根据应用的需要,定义并实现了一个适用于特殊格式的图形类(MyPic),其

主要功能包括根据给定的输出选项向指定的设备输出图形。Printer(打印机),Bitmap(位图),Point(点)都是类库中的预定义类。类MyPic的部分代码如下所示: class MyPic { public: //根据指定的页边留白和对齐方式(居中/左对齐)等输出选项,输出到打印机 bool SendTo(Printer& printer, int marginLeft, int marginTop, int marginRight, int marginBottom, int alignKind) { /* 略 */ } //根据指定的页边留白和对齐方式(居中/左对齐) 等输出选项,输出到打印机 //其中一个Point对象表示一个具有(x,y)坐标的点 bool SendTo(Printer& printer, Point marginLT, Point marginRB, int alignKind) {return SendTo(printer,marginLT.x,marginLT.y,marginRB.x,marginRB.y,alignKind); } //根据指定的起始偏移、透明度和位操作掩码等输出选项,输出到位图 bool SendTo(Bitmap& bmp, int xOffset, int yOffset, int transparent, int mask) { /* 略 */ } // 其它略 }; 对于MyPic类,小王发现重载的SendTo函数和过长的参数表影响了使用的方便性。小王希望通过对参数表中多个参数的进一步抽象,去掉函数重载,使类中只有一个SendTo函数,并使该函数只有一个参数。重新设计时,小王需要考虑如下的实际情况:

a. Printer、Bitmap等类是第三方类库中预先定义好的,无法得到完整的源代码,因此不能从Printer、Bitmap等类直接派生新的子类;

b.以后肯定还要继续增加新的输出选项,如增加打印方向选项(横打/竖打)等; c.以后肯定还要增加其它的输出设备,如文件、视窗、晒图仪等;

请回答:

1. (8分)请你修改类MyPic的设计,使新设计满足小王的愿望。可以增加你认为必要的类,要求给出完整的设计方案或示例代码。

2. (2分)请说明在你的方案中,如何适应实际情况b? 3. (2分)请说明在你的方案中,如何适应实际情况c?

(全卷完)