c++对c语言做了很多改进,即从面向过程变成为面向对象的主要原因是,2007年10月自考面向对象程序设计试题...

一、单项选择题(本大题共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<<:x>

};

(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<

}

(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<

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= " <<:func>

test a;

cout<< " result2= " <

test::sfunc(a);

}

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" <

virtual void fun2(){

cout << "test fun2" <

void fun3(){

cout << "test fun3" <

};

class ftt:public test

{

public:

void fun1(){cout <

virtual void fun2(){cout << "ftt fun2"<

virtual void fun3(){cout << "ftt fun3"<

};

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<

~A() {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<

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值