面向对象程序设计-试卷a(附答案)
![面向对象程序设计-试卷a(附答案)](https://img.360docs.net/img72/1dbp9n8zdejku0gkpr34imej1y9s9nfk-21.webp)
![面向对象程序设计-试卷a(附答案)](https://img.360docs.net/img72/1dbp9n8zdejku0gkpr34imej1y9s9nfk-12.webp)
东莞理工学院(本科)试卷(A卷)
2012 --2013学年第二学期
《面向对象程序设计》试卷
开课单位:计算机学院,考试形式:闭卷,允许带入场
一.单项选择题(15小题,每小题2分,共30分,请将正确答案填写在以下
1、在类定义的外部,可以被访问的成员有()
A、所有类成员
B、private的类成员
C、public或private的类成员
D、public的类成员
2、下列关于C++语言类的描述中错误的是( ) 。
A 、类用于描述事物的属性和对事物的操作
B、类与类之间通过封装而具有明确的独立性
C、类与类之间必须是平等的关系,而不能组成层次结构
D、类与类之间可以通过一些方法进行通信和联络
3、下列数组定义中,不正确的是()。
A、int x[1][3];
B、int x[2][2]={1,2,3};
C、int x[2][]={1,2,3,4 };
D、int x[][2]={1,2,3,4 }
4、定义析构函数时,应该注意:()
A、其名与类名完全相同
B、返回类型是void类型
C、无形参,也不可重载
D、函数体中必须有delete语句
5、下列函数中,正确的递归函数是()。
A 、int Fun(int n){ if(n<1) return 1; else return n*Fun(n+1); }
B 、int Fun(int n){ if (abs(n)<1) return 1; else return n*Fun(n/2); }
C 、int Fun(int n){ if(n>1) return 1; else return n*Fun(n*2); }
D、int Fun(int n){ if(n>1) return 1; else return n*Fun(n-1); }
6、在C++中编译器所生成的文件的扩展名为()[答案修改过]
A、.cpp
B、.obj
C、.lib
D、.exe
7、派生类的对象对它的基类成员中的()是可以访问
A、公有继承的公有成员
B、公有继承的私有成员
C、公有继承的保护成员
D、私有继承的公有成员
8. C++设置虚基类的目的是( )
A、消除二义性
B、简化程序
C、提高运行效率
D、减少目标代码
9. 以下关于this指针的叙述中正确的是:()
A、任何与类相关的函数都有this指针;
B、类的成员函数都有this指针;
C、类的友员函数都有this指针;
D、类的非静态成员函数才有this指针;
10实现运行时的多态性采用( )
A、重载函数
B、构造函数
C、析构函数
D、虚函数
11、若有inta[10]={0,1,2,3,4,5,6,7,8,9},*p=&a[5];则() 不是对a数组元素的正确引用(其中0≤i<10)
A、p[i]
B、*(*(p+i) )
C、a[p-a]
D、* (&a[i])
12、int Func(int,int);不可与下列哪个函数构成重载()
A、int Func(int,int,int);
B、double Func(int,int);
C、double Func(double,double);
D、double Func(int,double);
13、局部变量可以隐藏全局变量,那么在有同名全局变量和局部变量的情形时,可以用()提供对全局变量的访问。【内层隐藏外层】
A 、域运算符B、指针C、重载D、引用
14下列描述中,正确的是:()
A、所有的运算符号都可以重载。
B、基类类型的指针可以指向子类,子类类型的指针也可以指向基类。【只有public继承
前一个说法才成立】
D、动态联编要满足两个条件:被调用的成员函数是虚函数;用指针或引用调用虚函数。
15、下面类的定义,有()处错误。
class MyClass
{
private: int i=0; 2
public: void MyClass(); 3
~MyClass(int Value); 4
} 1
A、1
B、2 C 、3 D、4
二.填空题(每题2分,共20分)
1、static加在局部变量定义前,改变局部变量的生存期但不改变它作用域的。
2. 类的私有成员只能被它的成员函数和友元函数访问。
3. 一个抽象类的派生类可以实例化的必要条件是实现了所有的纯虚函数。
4、假定AB为一个类,有类AB的两个对象a1,a2;则执行语句AB *a[10]={&a1,&a2};时系
统自动调用该类的构造函数的次数为0 。
5、通过C++语言中类的继承和派生机制,可以扩充和完善已有类以适应新的需求。
【答案修改过】
6. 若在类的定义体中给出了一个成员函数的完整定义,则该函数属于内联函数。
7. 不同对象可以调用相同名称的函数,但可导致完全不同的行为的现象称为多态。
8. 对象的核心概念就是通常所说的继承、封装和多态性。
9. 在一个类中可以定义 1 个析构函数。
10、若只需要通过一个成员函数读取数据成员的值,而不需要修改它,则应在函数头的后
面加上const 关键字。
三.判断题,对的打T错的打F。(5小题,每小题2分,共10分)
1. 函数形参的作用域是该函数的函数体。(√)
2. 纯虚函数必须在抽象类中,所以抽象类中的成员函数必须是纯虚函数。(×)
3. 派生类中至少包含了它的所有基类的成员,在这些成员中可能有的是不可访问。(√)[答案修改过]
4. 可以在类的构造函数中对静态数据成员进行初始化。(×)
5. 构造函数和析构函数都可以定义为虚函数。(×)。
四.程序填空(每题6分,共18分)
根据程序的功能描述,将程序下划线空白处内容补充完整(每空白3分)
1. 阅读下面是一段关于类的派生的程序,请完成填空。
以下程序是定义一个计数器类counter,对其重载运算符“+”,请填空。
class counter
{
private: int n;
public:
counter() {n=0;}
counter(int i){n=i;}
counter operator +(counter &c) 面是动态创建一个8x9x8的三维数组的一段程序,请按提示完成填空。
#include
using namespace std;
int main() {
float ***cp=new float**[8];程序1
#include
using namespace std;
class base {
public:
static int n;
base(int x) { n=x;}
virtual void set(int m) {n = m; cout << n <<' ';}
};
int base::n=0;
class deriveA:public base {
public:
deriveA(int x):base(x) { }
void set(int m) { n += m; cout << n <<' ';}
};
class deriveB:public base { Array public:
deriveB(int x):base(x) { }
void set(int m) { n +=m; cout < }; int main() { deriveA dl(0); deriveB d2(1); base *pbase; pbase = &dl; pbase->set(1); pbase->base::set(0); pbase = &d2; pbase->set(1); pbase->base::set(3); cout< return 0; } 输出结果:2 0 1 3 2. 程序2 #include using namespace std; class Base1 { public: int i; Base1(int x) { i=x;cout << "Constructing Base1 " << i << endl; } }; class Base2: public Base1{ public: Base2(int j): Base1(j){ cout << "Constructing Base2 " << j << endl; } }; class Base3 { public: Base3() { cout << "Constructing Base3 *" << endl; } }; class Derived: public Base2, public Base3 { public: int h; Derived(int a, int b, int c, int d): member2(d), member1(c), Base2(b) {h=a; } private: Base1 member1; Base2 member2; Base3 member3; }; int main() { Derived obj(1, 2, 3, 4); return 0; } 输出结果: Constructing Base1 2 Constructing Base2 2 Constructing Base3 * Constructing Base1 3 Constructing Base1 4 Constructing Base2 4 Constructing Base3 * 六、程序设计(12分) 定义一个抽象类Stereo,函数Volume为纯虚函数,用来计算体积。由抽象类分别派生出立方体Cube类、球体Sphere类、圆柱体Cylinder类,并求其体积(其中球体的体积公式为V=4/3*PI*R*R*R)。各立体形状的相关数据成员(其中:r代表半径,l代表长度,w代表宽度,h代表高度)属性都为private,并且通过各类的构造函数设置。total是一个通用的,用以求不同立体形状的体积总和的全局函数。 1)定义和实现各个类,给出相关的成员数据、构造函数和必要的成员函数即可。(4分,每个类1分) 2)定义和实现total函数,注意该函数为全局函数不是某各类的成员函数。(4分)3)编写main函数进行测试,功能要求如下:a、用基类指针数组,使它的每一个元素指向一个派生类的对象,并且所有形状立方体对象都进行内存动态分配和回收(即用new和delete操作符);b、主函数内调用total输出所有形状立方体的体积之和。(4分) 注:主函数中用到的构造函数和total函数如下 Cube,,; //实参为立方体的长、宽、高。 Sphere; //实参为球体的半径。 Cylinder,; //实参为圆柱体的底面半径、高。 total(s,3);// 实参s为基类指针数组,3为数组的大小。 #include using namespace std; class Stereo { public: virtual float Volume(void)=0; }; class Cube:public Stereo { public: Cube( float l=1,float w=1,float h=1 ):l(l),w(w),h(h){} float Volume(void) { return l*w*h; } private: float l,w,h; }; class Sphere:public Stereo { public: Sphere( float r=1 ):r(r){} float Volume(void) { return 4/3**r*r*r; } private: float r; }; class Cylinder:public Stereo { public: Cylinder( float r=1, float h=1 ):r(r),h(h){} float Volume(void) { return *r*r*h; } private: float r,h; }; void total( Stereo **p ,int n ) { float V; for( int i=0; i { V+=p[i]->Volume(); } cout << "所有形状立方体的体积之和为:" << V << endl; } int main() { Stereo *s[3]; s[0] = new Cube,,; s[1] = new Sphere; s[2] = new Cylinder,; total(s,3); delete []s; return 0; }