您的当前位置:首页正文

00710月《面向对象程序设计》精彩试题-及问题详解

2020-07-04 来源:意榕旅游网
实用

全国2007年10月高等教育自学考试

面向对象程序设计试题

课程代码:02328

一、单项选择题(本大题共10小题,每小题2分,共20分)

在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括 号内。错选、多选或未选均无分。 1.以下说法中正确的是( )

A.C++程序总是从第一个定义的函数开始执行 B.C++程序总是从main函数开始执行 C.C++函数必须有返回值,否则不能使用函数

D.C++程序中有调用关系的所有函数必须放在同一个程序文件中 2.以下关于函数模板叙述正确的是( ) A.函数模板也是一个具体类型的函数

B.函数模板的类型参数与函数的参数是同一个概念

C.通过使用不同的类型参数,函数模板可以生成不同类型的函数 D.用函数模板定义的函数没有类型

3.在重载一个运算符时,其参数表中没有任何参数,这表明该运算符是( A.作为友元函数重载的1元运算符 B.作为成员函数重载的1元运算符 C.作为友元函数重载的2元运算符 D.作为成员函数重载的2元运算符 4.构造函数不具备的特征是 ( ) A.构造函数的函数名与类名相同

文档

) 实用

B.构造函数可以重载

C.构造函数可以设置默认参数 D.构造函数必须指定类型说明

5.在C++中,封装是借助什么达到的( )

A.结构 B.数组 C.类 D.函数 6.在哪种情况下适宜采用 inline 定义内联函数?( )

A.函数体含有循环语句 B.函数体含有递归语句 C.函数代码少、频繁调用 D.函数代码多、不常调用 7.在关键字public后面定义的成员为类的( )

A.私有成员 B.公用成员 C.保护成员 D.任何成员 8. 以下哪个基类中的成员函数表示纯虚函数?( )

A.virtual void tt()=0 B.void tt(int) = 0 C.virtual void tt(int) D.virtual void tt(int){}

9.假定AA是一个类,“AA * abc( ) const;”是该类中一个成员函数的原型,若该函数返回this 值,当用x.abc()调用该成员函数后,x的值( ) A.已经被改变 B.可能被改变

C.不变 D.受到函数调用的影响

10.C++ 对 C 语言作了很多改进,即从面向过程变成为面向对象的主要原因是( ) A.增加了一些新的运算符

B.允许函数重载,并允许设置缺省参数

文档

实用

C.规定函数说明符必须用原型 D.引进了类和对象的概念

二、填空题(本大题共10小题,每小题2分,共20分)

请在每小题的空格中填上正确答案。错填、不填均无分。

11.如果一个派生类只有一个唯一的基类,则这样的继承关系称为____________。 12.C++支持两种多态性:____________时的多态性和运行时的多态性。

13.若要保证一个公共的基类在派生类中只产生一个基类子对象,则必须都以____________的方式直接继承它。

14.所有模板都以template关键字和一个____________表开头。

15.若一个函数的定义处于调用它的函数之前,则在程序开始可以省去该函数的____________语句。 16.类型转换函数没有返回值类型,而且参数表为____________。 17.C++提供的预处理命令有嵌入指令,条件编译指令和____________。 18.对象将其大部分实现细节隐藏起来,这种机制称为____________。

19.定义类动态对象数组时,其元素只能靠自动调用该类的____________来进行初始化。 20.在函数体之前加____________关键字可以防止覆盖函数改变数据成员的值。 三、改错题(本大题共2小题,每小题6分,共12分)

21.下面是分数类fract的定义及测试主程序,在类定义及其友元函数定义中1到6行中有三处错误,更正错误后程序应显示41/28,请指出错误所在行的行号并给出改正意见。

class fract{

int den; //分子 int num; //分母

public //1行

文档

实用

fract(int d=0,int n=1):den(d),num(n){ } //2行 friend fract &operator+=(fract,fract&); //3行 void show( ){ cout<}; //5行 friend fract &operator+=(fract f1,fract f 2) //6行 { //7行

f1.den=f1.den*f 2.num+f1.num*f 2.den; //8行 f1.num*=f 2.num; //9行 return f1; //10行 }

void main( ){

fract fr(3,4); fr+=fract(5,7); fr.show( ); }

错误行的行号为____________、____________和____________。 分别改正为____________、____________和____________。

22.下面程序段第13-17行中存在着三条语句错误,请指出错误语句的行号并说明原因。

class A { //1行 int a; //2行 public: //3行

文档

实用

A(int aa=0):a(aa){ } //4行 }; //5行 class B { //6行 int a,b; //7行 const int c; //8行 A d; //9行 public: //10行 B( ):c(0) {a=b=0;} //11行 B(int aa, int bb):d(aa+bb) { //12行 a=aa; b=bb; c=aa-bb; //13行 } //14行 } //15行 B a , b( 1 , 2 ); //16行 B x= a , y( b ) , z( 1 , 2 , 3 ); //17行

错误行的行号为____________、____________和____________。 错误原因分别为____________、____________和____________。 四、程序填空题(本大题共3小题,每小题6分,共18分) 请按提示要求完成以下程序段的填空。

23.在下面一段类定义中, Derived类是由直接基类Base 1和Base 2所派生的,Derived类包含有两个间接基类BaseBase,在初始化函数Init中,需要把x1和x2的值分别赋给属于基类Base1的x成员和属于基类Base2的x成员。

class BaseBase {

文档

实用

protected: int x; public:

BaseBase( ){ x = 1;} };

class Base1: public BaseBase { public: Base1( ){ } };

class Base2: public BaseBase { public: Base2 ( ){ } };

class Derived: ____________(1)____________ { public: Derived( ) { }

void Init(int x1, int x2) { ____________(2)____________; ____________(3)____________; }

void output( ) {cout<文档

实用

};

(1) (2) (3)

24.#include #include class A {

int *a; int n; int MaxLen; public:

A(): a(0), n(0), MaxLen(0) { } A(int *aa, int nn, int MM) { n=nn;

MaxLen=MM; if(n>MaxLen) exit(1); a=new int[MaxLen];

____________(4)____________; //以i为循环变量把aa数组中每个元素值

//传送给a数组的对应元素中

} ~A( );

int GetValue(int i) {return a[i];} //函数体返回a[i]的值 };

____________(5)____________//析构函数的类外定义

文档

实用

void main( ) {

int b[10]={1,2,3,4,5,6,7,8,9,10}; A r(b,10,10); int i,s=0;

____________(6)____________ ; //以i为循环变量,把r对象的a数据成员中的 //每个元素值依次累加到s中 cout<<\"s=\"<(4) (5) (6)

25.下面是一维数组类ARRAY的定义,ARRAY与普通一维数组区别是:(1)用()而不是[]进行下标访问,(2)下标从1而不是从0开始,(3)要对下标是否越界进行检查。

class ARRAY{

int *v; //指向存放数组数据的空间 int s;//数组大小 public:

ARRAY(int a[ ], int n); ~ ARRAY( ){delete [ ]v;} int size( ){ return s;} int& operator ( )(int n); };

文档

实用

____________(7)____________ operator()(int n) { // ()的运算符函数定义

if(____________(8)____________) {cerr<<\"下标越界!\"; exit(1);}//exit函数的功能是退出程序运行

return ____________(9)____________; }

(7) (8) (9)

五、程序分析题(本大题共6小题,每小题5分,共30分)

阅读以下程序,写出其运行结果。

26.#include class test{ private: static int val; int a; public:

static int func( );

static void sfunc(test &r); };

int test::val=10; int test::func( ) { val--;

文档

实用

return val; }

void test::sfunc(test &r) {

r.a=15;

cout<< \" result3= \" <void main( ) {

cout<< \" resultl= \" <cout<< \" result2= \" <27.# include class position{ public: int x,y;

void init(int initx,int inity); int getxvalue( ); int getyalue( );

文档

实用

};

void position::init (int initx,int inity) {

x=initx; y=inity; }

int position::getxvalue( ) {

return x; }

int position::getyalue( ) {

return y; }

void printout(position & rl) {

cout<void main( ) {

position a[6] ={{1,1},{2,2},{3,3},{4,4},{5,5},{6,6}}; position *pa=a;

文档

实用

a[2].init(7,8); pa->init(5,6); for (int i=0;i<5;i++)

printout(*(pa++));

}

28.#include class test{ public:

virtual void fun1( ){

cout << \"test fun1\" <cout << \"test fun2\" <cout << \"test fun3\" <};

class ftt:public test { public:

void fun1( ){cout <<\"ftt fun1\"<文档

实用

};

void main( ) {

test *pp; ftt q; pp = &q; pp->fun1( ); pp->fun2( ); pp->fun3( ); }

29.#include class complex { int real; int imag; public:

complex( int r=0 , int i=0 ): real( r ),imag( i ){ } complex operator++( ){ real ++ ; return *this; } void show( ){ cout<void main( ) { complex c(5,9);

文档

实用

++c; c.show( ); }

30.#include class A { int a; public:

A(int aa=0): a(aa) {cout<void main( ) { A *p;

A x[2]={ 1 , 2 }; p=new A[3]; delete [ ] p; }

31.#include class A { int *a; public:

A(int x=0) : a( new int ( x ) ) { }

文档

实用

~A( ) {delete a;}

int getA( ) {return *a;} void setA(int x) {*a=x;} };

void main( ) { A x1 , x2( 3 ); A *p= &x2;

p->setA( x2.getA( ) + 5 ); x1.setA( 15 + x1.getA( ) );

cout<< x1.getA( ) <<’’<< x2.getA( ) << endl; }

文档

实用

200710易老师做的参考答案

一、1.B 2.C 3.B 4.D 5.C 6.C 7.B 8.A 9.C 10.D

二、11. 单继承 12.编译 13.virtual public 14.虚拟的类型参数 15.声明

16.空 17.常变量 18.封装 19.构造函数 20.const 三、21 错误的行为:1 3 6 分别改正为:public:

friend fract &operator+=(fract &,fract&);

fract & operator +=(fract &f1,fract &f2)

22 错误的行为: 13 15 17

分别改正为: B(int aa, int bb):d(aa+bb),c(aa-bb) { //12行 a=aa; b=bb; //13行 }; //15行 B x=a,y(b),z(1,2); //17行 23 public Base1,public Base2

Base1::x=x1; Base2::x=x2;

24 for (int i=0;ifor(i=0;i<10;i++) s=s+r.GetValue(i);

25 int& ARRAY:: n>s s 26 resultl=9 resultl=8

文档

实用

resultl=15

27 5 6 2 2 7 8 4 4 28

29 30 示)

31 文档

5 5 6 6

ftt fun1 ftt fun2 test fun3

6 9

1 2 0 15 8

0 0 11 11 11 每个数据占一行显 11 11(

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