面向对象程序设计复习题doc.docx

上传人:b****6 文档编号:8666559 上传时间:2023-02-01 格式:DOCX 页数:18 大小:21.84KB
下载 相关 举报
面向对象程序设计复习题doc.docx_第1页
第1页 / 共18页
面向对象程序设计复习题doc.docx_第2页
第2页 / 共18页
面向对象程序设计复习题doc.docx_第3页
第3页 / 共18页
面向对象程序设计复习题doc.docx_第4页
第4页 / 共18页
面向对象程序设计复习题doc.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

面向对象程序设计复习题doc.docx

《面向对象程序设计复习题doc.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计复习题doc.docx(18页珍藏版)》请在冰豆网上搜索。

面向对象程序设计复习题doc.docx

面向对象程序设计复习题doc

一、单项选择题。

1引入内联函数的主要目的是

A)缩短程序代码,少占用内存空间

B.既可以保证程序的可读性,又能提高程序的运行效率

C)提高程序的执行速度

D)使程序的结构比较清晰

2重载函数是

A)以函数参数来区分,而不用函数的返回值来区分不同的函数

B.以函数的返回值来区分,而不用函数参数来区分不同的函数

C)参数表完全相同而返回值类型不同的两个或多个同名函数

D)参数表和返回值类型都必须是不同的两个或多个同名函数

3有函数原型voidfun2(int*),下面选项中,正确的调用是

A)doublex=2.17;fun2(&x);C)inta=15;fun2(a*3.14);

B)intb=100;fun2(&b);D)fun2(256);

4在C++中,要实现动态联编,必须使用()调用虚函数。

A)类名B)派生类指针C)对象名D)基类指针

5在公有派生情况下,有关派生类对象和基类对象的关系,下列叙述不正确的是

A)派生类的对象可以直接访问基类中的所有成员

B)派生类的对象可以初始化基类的引用

C)派生类的对象可以赋给基类的对象

D)派生类的对象的地址可以赋给指向基类的指针

6设置虚基类的目的是

A)消除两义性B)简化程序

C)提高运行效率D)减少目标代码

7关于构造函数,以下说法错误的是

A)构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象

初始化为一个特定的状态。

在对象创建时由系统自动调用。

B)基类的构造函数可以被派生类所继承。

C)如果程序中未声明,则系统自动产生出一个缺省形式的构造函数。

D)允许为内联函数、重载函数、带缺省形参值的函数。

8下列关于C++函数的说明中,正确的是

A)内联函数就是定义在另一个函数体内部的函数

B)函数体的最后一条语句必须是return语句

C)标准C++要求在调用一个函数之前,必须先声明其原型

D)编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式

9由于常对象不能被更新,因此

A)通过常对象只能调用它的常成员函数

B)通过常对象只能调用静态成员函数

C)常对象的成员都是常成员

D)通过常对象可以调用任何不改变对象值的成员函数

10下列关于虚函数的说明中,正确的是

A)从虚基类继承的函数都是虚函数B)虚函数不得是静态成员函数

C)只能通过指针或引用调用虚函数D)抽象类中的成员函数都是虚函数

11运算符重载是对已有的运算符赋予多重含义,因此

A)可以对基本类型(如int类型)的数据,重新定义“+”运算符的含义

B)可以改变一个已有运算符的优先级和操作数个数

C)只能重载C++中已经有的运算符,不能定义新运算符

D)C++中已经有的所有运算符都可以重载

12模板对类型的参数化提供了很好的支持,因此

A)类模板的主要作用是生成抽象类

B)类模板实例化时,编译器将根据给出的模板实参生成一个类

C)在类模板中的数据成员都具有同样类型

D)类模板中的成员函数都没有返回值

13下列符号中可以用作C++标识符的是

A)_radiusB)foo~barC)elseD)3room

14下列语句中,错误的是

A)constintbuffer=256;B)constinttemp;

C)constdouble*point;D)constdouble*rt=newdouble(5.5);

15有如下程序:

intx=3;

do{

x-=2;

cout<

}while(!

(--x));

执行这个程序的输出结果是

A)1B)30C)l-2D)死循环

16有如下程序:

#include

usingnamespacestd;

intmain()

{

int*p;

*p=9;

cout<<"Thevalueatp:

"<<*p;

return0;

}

编译运行程序将出现的情况是

A)够编译时出现语法错误,不能生成可执行文件

B)运行时一定输出:

Thevalueatp:

9

C)运行时一定输出:

Thevalueatp:

*9

D)运行时有可能出错

17有如下程序:

#include

usingnamespacestd;

intmain()

{

voidfunction(doubleval);

doubleval;

function(val);

cout<

return0;

}

voidfunction(doubleval)

{

val=3;

}

编译运行这个程序将出现的情况是

A)编译出错,无法运行B)输出:

3

C)输出:

3.0D)输出一个不确定的数

18有如下类定义:

classAA

{

inta;

public:

intgetRef()const{return&a;}//①

intgetValue()const{returna;}//②

voidset(intn)const{a=n;}//③

friendvoidshow(AAaa)const{cout<

};

其中的四个函数定义中正确的是

A)①B)②C)③D)④

19有如下程序:

#include

usingnamespacestd;

classBase

{

public:

voidfun(){cout<<"Base:

:

fun"<

};

classDerived:

publicBase

{

public:

voidfun()

{

cout<<"Derived:

:

fun"<

}

};

intmain()

{

Derivedd;

________________;

d.fun();

return0;

}

已知其执行后的输出结果为:

Base:

:

fun

Derived:

:

fun

则程序中下划线处应填入的语句是

A)Base.fun();B)Base:

:

fun()C)Base->fun()D)fun();

20下面是重载为非成员函数的运算符函数原型,其中错误的是

A)Fractionoperator+(Fraction,Fraction);

B)Fractionoperator-(Fraction);

C)Fraction&operator=(Fraction&,Fraction);

D)Fraction&operator+=(Fraction&,Fraction);

21有如下类定义:

classFoo

{

public:

Foo(intv):

value(v){}//①

~Foo(){}//②

private:

Foo(){}//③

intvalue=0;//④

};

其中存在语法错误的行是

A)①B)②C)③D)④

22有如下类定义:

classPoint

{

intx_,y_;

public:

Point():

x_(0),y_(0){}

Point(intx,inty=0):

x_(x),y_(y){}

};

若执行语句Pointa

(2),b[3],*c[4];

则Point类的构造函数被调用的次数是

A)2次B)3次C)4次D)5次

23有如下程序:

#include

usingnamespacestd;

classA

{

public:

A(){cout<<"A";}

~A(){cout<<"~A";}

};

classB:

publicA

{

A*p;

public:

B(){cout<<"B";p=newA();}

~B(){cout<<"~B";deletep;}

};

intmain()

{

Bobj;

return0;

}

执行这个程序的输出结果是

A)BAA~A~B~AB)ABA~B~A~A

C)BAA~B~A~AD)ABA~A~B~A

24有如下程序:

#include

usingnamespacestd;

classBase

{

private:

voidfunl()const{cout<<"funl";}

protected:

voidfun2()const{cout<<"fun2";}

public:

voidfun3()const{cout<<"fun3";}

};

classDerived:

protectedBase

{

public:

voidfun4()const{cout<<"fun4";}

};

intmain()

{

Derivedobj;

obj.funl();//①

obj.fun2();//②

obj.fun3();//③

obj.fun4();//④

return0;

}

其中有语法错误的语句是

A)①②③④B)①②③C)②③④D)①④

25有如下程序:

#include

usingnamespacestd;

classBase

{

public:

voidfunl(){cout<<"Base"<

virtualvoidfun2(){cout<<"Base"<

};

classDerived:

publicBase

{

public:

voidfunl(){cout<<"Derived"<

voidfun2(){cout<<"Derived"<

};

voidf(Base&b){b.funl();b.fun2();}

intmain()

{

Derivedobj;

f(obj);

return0;

}

执行这个程序的输出结果是

A)BaseB)BaseC)DerivedD)Derived

BaseDerivedBaseDerived

26有如下类声明:

classSAMPLE

{

intn;

public:

SAMPLE(inti=0):

n(i){}

voidsetValue(intn0);

};

下列关于setValue成员函数的实现中,正确的是

A)SAMPLE:

:

setValue(intn0){n=n0;}

B)voidSAMPLE:

:

setValue(intn0){n=n0;}

C)voidsetValue(intn0){n=n0;}

D)setValue(intn0){n=n0;}

27.下列函数模板的定义中,合法的是()。

A.templateTabs(Tx){returnx<0?

-x:

x;}

B.templateclassTabs(Tx){returnx<0?

-x:

x;}

C.templateTabs(Tx){returnx<0?

-x:

x;}

D.templateTabs(Tx){returnx<0?

-x:

x;}

28.下列程序的运行结果为()。

#include

classBASE

{public:

BASE(inti){cout<<"调用基类BASE的构造函数:

"<

};

classA:

publicBASE

{public:

A(inta,intb):

BASE(a),b1(b)

{cout<<"调用派生类A的构造函数:

"<

private:

BASEb1;

};

voidmain()

{

Aobj(1,2);

}

A.调用基类BASE的构造函数:

2B)调用基类BASE的构造函数:

1

调用基类BASE的构造函数:

1调用基类BASE的构造函数:

2

调用派生类A的构造函数:

3调用派生类A的构造函数:

3

C)调用基类BASE的构造函数:

2D)调用基类BASE的构造函数:

1

调用派生类A的构造函数:

3调用基类BASE的构造函数:

3

29.下列程序的运行结果为()。

#include

classT

{public:

T(intx){a=x;b+=x;};

staticvoiddisplay(Tc)

{cout<<”a=”<

private:

inta;

staticintb;

};

intT:

:

b=5;

voidmain()

{TA(3),B(5);

T:

:

display(A);

T:

:

display(B);

}

A)a=3b=8B)a=3b=5

a=5b=10a=5b=5

C.a=3b=13D)a=3b=8

a=5b=13a=5b=13

30.下面程序中对一维坐标点类Point进行运算符重载

  #include

  usingnamespacestd;

classpoint

{

  public:

  point(intvaI){x=val;}

  point&operator++(){x++;retum*this;}

  pointoperator++(int){pointold=*this,++(*this);retumold;}

  intGetX()const{retumx;}

  private:

  intx;

  };

  intmain()

  {

  pointa(10);

  cout<<(++a).GetX();

  cout<

  retum();

  }

  编译和运行情况是

  A)运行时输出1011  B)运行时输出1111

  C)运行时输出1112  D)编译有错

二、填空题。

1程序中有如下语句

for(inti=0;i<5;i++)cout<<*(p+i)<<",";

能够依次输出int型一维数组DATA的前5个元素。

由此可知,变量p的定义及初始化语句是______________。

2若下面程序运行时输出结果为

1,A,10.1

2,B,3.5

请将程序补充完整。

#include

usingnamespacestd;

intmain()

{

voidtest(int,char,double_____________);

test(1,'A',10.1);

test(2,'B');

return0;

}

voidtest(inta,charb,doublec)

{

cout<

}

3有如下类声明:

classMyClass

{

inti;

private:

intj;

protected:

intk;

public:

intm,n;

};

其中,私有成员的数量为_____________。

4有如下程序:

#include

usingnamespacestd;

classONE

{

public:

virtualvoidf(){cout<<"l";}

};

classTWO:

publicONE

{

public:

TWO(){cout<<"2";}

};

classTHREE:

publicTWO

{

public:

virtualvoidf(){TWO:

:

f();cout<<"3";}

};

intmain()

{

ONEaa,*p;

TWObb;

THREEcc;

p=&cc;

p->f();

return0;

}

执行上面程序的输出是_____________。

5有如下程序:

#include

usingnamespacestd;

classPARENT

{

public:

PARENT(){cout<<"PARENT";}

};

classSON:

publicPARENT

{

public:

SON(){cout<<"SON";}

};

intmain()

{

SONson;

PARENT*p;

p=&son;

return0;

}

执行上面程序的输出是_____________。

6若以非成员函数形式,为类Bounce重载“!

”运算符,其操作结果为一bool型数据,则该运算符重载函数的原型是_____________。

7下面是复数类complex的定义,其中重载的运算符“+”的功能是返回一个新的复数对象,其实部等于两个操作对象实部之和,其虚部等于两个操作对象虚部之和;请补充完整:

classcomplex

{

doublereal;//实部

doubleimag;//虚部

public:

complex(doubler,doublei):

real(r),imag(i){}

complexoperator+(complexa)

{returncomplex(_____________);

}

};

8已知一个函数模板定义为

templateT1,typenameT2>

T1FUN(T2n){returnn*5.0;}

若要求以int型数据7为函数实参调用该模板函数,并返回一个double型数据,则该调用应表示为_____________。

9.设有数组和指针变量定义为:

inta[2][3]={{1,2},{3,4,5}},*p=&a[0][2];则表达式*(p+1)的值为:

10.有字符数组和字符指针定义:

chars1[]=”string”,chars2[]=”char”;char*constps=s1;则使用指针ps进行操作时,可以改变ps,但不能改变ps。

11.设Cat是已定义的类,整型变量a是Cat类的公有成员变量,p是Cat类的对象指针,且已指向Cat类的对象c,则用指针p给整型成员变量a赋值5的语句为:

12.在C++语言中,运算符可以重载,运算符重载实质上就是函数的重载,运算符重载实现的多态性属于:

13.在C++语言中,运算符可以重载,运算符重载实质上就是函数的重载,设后置运算符“++”在类A的定义中被重载为成员函数,则对A类对象a作运算a++,与该运算表达式等价的函数调用形式为:

14.当保护继承时,基类的成员在派生类中成为保护成员,不能通过派生类的对象来直接访问该成员。

15.在类中,____________成员为类的所有对象所共享。

16.如果使用数组名作为函数参数,形实结合时,传递的是__________。

17.有如下定义:

classMA

{

  intvalue;

 public:

   MA(intn=0):

valut(n){}

};  MA*ta,tb;

  其中MA类的对象名标识符是_____________。

18.若将一个二元运算符重载为类的成员函数,其形参个数应该是________个。

19.有如下程序:

  #include

  usingnamespacestd;

  classDA{

  intk;

  public:

  DA(intx=1):

k(x){}

  ~DA(){cout<

  };

  intmain(){

  DAd[]={DA(3),DA(3),DA(3)};

  DA*p=newDA[2];

  delete[]p;

  return0;

  }

这个程序的输出结果是____________。

20.C++语言中的多态性分为编译时的多态性和__________时的多态性。

三、简答题。

1.什么叫做友元函数,什么叫做友元类?

2.什么叫做多态性,面向对象的多态性可以分为哪四类?

3.什么叫做作用域?

C++中有哪几种类型的作用域?

4.对比简述C语言中函数内静态局部变量与C++中类的静态成员变量的特点。

5.简述用虚函数实现动态多态性的三个关键之处。

6.什么是内联函数,它有哪些特点?

7.列出拷贝构造函数被调用的三种情况。

8.比较类的三种继承方式public、protected、private之间的差别。

9.什么是虚基类?

有何作用?

10.什么是编译时的多态?

具体包括哪些类型?

11.函数模板与函数重载有哪些区别?

12.构造函数与析构函数有什么作用?

四、综合编程题。

1.函数编程:

定义一函数模板swap,它能实现x、y值的交换,在main函数中用任意两个整数、两个浮点数分别使用这个函数模板。

2.函数编程:

定义一函数voidContraryStr(char*str),它能实现字符串的逆序输出,在main函数中用任意字符串测试该函数。

3.类编程:

定义一个表示工人的类Worker,有两个普通数据成员工龄age和工资pay,有一个静态成员人数sum;定义一个有二个参数的构造函数,给age和pay赋值,令sum++;给sum初始化为0,定义一个静态成员函数getsum,用于获得sum的值;在main函数中以不同的方式定义二个工人对象,分别用二个对象和类名3种方式调用getsum函数并输出相应人数。

4.派生类和虚函数编程:

(1)定义一个抽象类Shape,并且提供二个纯虚函数:

计算并返回面积函数reArea及计算并返回体积函数reVolume。

(2)由Shape类派生Cube(正方体)类,它包括私有数据成员length(边长),还包含构造函数和两个纯虚函数的实现。

(3)由Shape类派生Ball(球形)类,它包括私有数据成员radius(半径),也包含构造函数和两个纯虚函数的实现。

(注:

球表面积公式=4πR2,球体积公式=(4π/3)R3)。

(4)在main函数中创建矩形类、球类对象存入一个shape类指针数组中,通过for循环将数组中各类图形的面积及体积输出。

(30分)

5.运算符重载编程:

(1)设计一个简单分数类Fenshu,其包含两个整数的类数据成员分子fenzi、分母fenmu,定义并实现一个有两个整数作参数的构造函数,并定义一个普通成员函数

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1