面向对象程序设计期末复习题.docx
《面向对象程序设计期末复习题.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计期末复习题.docx(15页珍藏版)》请在冰点文库上搜索。
面向对象程序设计期末复习题
面向对象程序设计试题
一、单项选择题(本大题共12小题,每小题2分,共24分)
在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。
错选、多选或未选均无分。
1.有关C++编译指令,以下叙述正确的是()
A.C++每行可以写多条编译指令
B.#include指令中的文件名可含有路径信息
C.C++的编译指令可以以#或//开始
D.C++中不管#if后的常量表达式是否为真,该部分都需要编译
2.在C++中把不返回任何类型的函数应该说明为 ()
A.intB.char
C.voidD.double
3.以下有关析构函数的叙述不正确的是()
A.析构函数没有任何函数类型
B.析构函数的作用是在对象被撤销时收回先前分配的内存空间
C.析构函数可以有形参
D.一个类只有一个析构函数
4.若Sample类中的一个成员函数说明如下:
voidset(Sample&a),则Sample&a的含义是()
A.指向类Sample的名为a的指针
B.a是类Sample的对象引用,用来作函数Set()的形参
C.将a的地址赋给变量Set
D.变量Sample与a按位与的结果作为函数Set的参数
5.以下叙述错误的是()
A.基类的保护成员在公有派生类中仍然是保护成员
B.基类的保护成员在派生类中仍然是保护成员
C.基类的保护成员在私有派生类中是私有成员
D.基类的保护成员不能被派生类的对象访问
6.假设ClassY:
publicX,即类Y是类X的派生类,则说明一个Y类的对象时和删除Y类对象时,调用构造函数和析构函数的次序分别为()
A.X,Y;Y,XB.X,Y;X,Y
C.Y,X;X,YD.Y,X;Y,X
7.下列虚基类的说明中,正确的是()
A.classvirtualB:
publicAB.classB:
virtualpublicA
C.virtualclassB:
publicAD.classB:
publicAvirtual
8.要实现动态联编必须()
A.通过成员名限定来调用虚函数B.通过对象名来调用虚函数
C.通过派生类对象来调用虚函数D.通过对象指针或引用来调用虚函数
9.在派生类中定义虚函数时,可以与基类中相应的虚函数不同的是()
A.参数类型B.参数个数
C.函数名称D.函数体
10.下列关于静态数据成员的描述中正确的是()
A.静态数据成员是类的所有对象所共有的
B.静态数据成员要在构造函数内初始化
C.类的每个对象有自己的静态数据成员
D.静态数据成员不能通过类的对象调用
11.与C语言printf("Hello,World\n");语句功能相同的C++语句是()
A.cout>>"Hello,World\n";B.cout<<"Hello,World\n";
C.cin>>"Hello,World\n";D.cin<<"Hello,World\n";
12.实现两个相同类型数加法的函数模板的声明是()
A.add(Tx,Ty)B.Tadd(x,y)
C.Tadd(Tx,y)D.Tadd(Tx,Ty)
二、填空题(本大题共8小题,每小题2分,共16分)
请在每小题的空格中填上正确答案。
错填、不填均无分。
13.在面向对象程序设计中,将一组数据和这组数据有关的操作集合组装在一起形成对象,这个过程叫________;不同的对象可以调用相同名称的函数并导致完全不同的行为的现象称为________。
14.假如一个类的名称为MyClass,则这个类缺省的构造函数名称为________;使用这个类的一个对象初始化该类的另一个对象时,可以调用________构造函数来完成此功能。
15.局部对象和全局对象中,在同一程序中________生存期最长;this指针始终指向当前正在发出成员函数调用命令的________。
16.所谓赋值兼容规则是指在公有派生情况下,一个________类的对象可以作为________类的对象来使用的地方。
17.带有________的类称为抽象类,它只能作为________来使用。
18.控制格式输入输出的操作中,函数________是设置域宽的,函数________是设置填充字符。
(要求给出函数名和参数类型)
19.类模板用来表达具有相同________的数据________集。
20.对已有的运算符赋予多重含义,使同一运算符作用于不同类型的数据,称为________,它的实质就是________。
三、改错题(本大题共5小题,每小题2分,共10分)
21.下面类的定义中有一处错误,请用下横线标出错误所在行并说明出错原因。
以下是引用片段:
classMyClass{
intx=20,y;
public:
MyClass(intaa,intbb);
intGetX();
intGetY();
};
22.以下程序实现交换a,b变量的值,请用下横线标出错误所在行并给出修改意见。
以下是引用片段:
voidswap(intm,intn)
{inttemp=m;m=n;n=temp;}
voidmain()
{inta=5,b=10;
swap(a,b);
cout<<"a="
}
25.下面程序中有一处错误,请用下横线标出错误所在行并说明出错原因。
以下是引用片段:
classA{
intx;
friendclassB;
};
classB{};
classC:
publicB{
voidfunc(A*p);
};
voidC:
:
func(A*p)
{p->x--;}
四、完成程序题(本大题共5小题,每小题4分,共20分)
26.为使下列程序输出结果为:
Y=1,Y=3,Z=5
请在横线处填上适当的字句,以使程序完整。
以下是引用片段:
#include
classB{
private:
intY;
public:
B(inty=0){Y=y;}
voidprint(){cout<<"Y="<
};
classD:
publicB{
private:
Bb;
intZ;
public:
D(intx,inty,intz):
B(x),b(y){Z=z;}
voidprint(){
①________;//打印基类B中的成员Y
②________;//打印类成员b中的Y值
cout<<"Z="<
}
};
voidmain()
{Dd(1,3,5);
d.print();
}
27.在下面横线处填上适当字句,完成求最大值函数模板的定义。
以下是引用片段:
#include
template
TMax(Tx,Ty)
{
return(x>y?
x:
y);
}
①________
TMax(Tx,Ty,Tz)
{
Tt=Max(x,y);
return(②________);
}
voidmain()
{
intx;doubley;
x=Max(5,6);y=Max(12.3,3.4,7.8);
cout<<"x="< }
28.在下面横线处填上适当字句,完成Distance函数的定义。
以下是引用片段:
#include
#include
classPoint
{
private:
doubleX,Y;
public:
Point(doublex=0,doubley=0){X=x;Y=y;}
voidMove(doublex,doubley){X=x;Y=y;}
frienddoubleDistance(Point&p1,Point&p2);//计算两点间距
};
doubleDistance(Point&p1,Point&p2)
{doubledx=①________;
doubledy=②________;
returnsqrt(dx*dx+dy*dy);
}
voidmain()
{
Pointa(1,1);
Pointb(a);
b.Move(4,5);
cout< }
29.为使下列程序输出结果为:
A∷f()
B∷f()
C∷f()
请在横线处填上适当的字句,以使程序完整。
以下是引用片段:
#include
classA{
public:
①________{cout<<"A:
:
f()\n";}
};
classB:
publicA{
public:
voidf(){cout<<"B:
:
f()\n";}
};
classC:
publicA{
public:
voidf(){cout<<"C:
:
f()\n";}
};
voidmain()
{
Aa,②________;
Bb;Cc;
p=&a;p->f();
p=&b;p->f();
p=&c;p->f();
}
30.在下面横线处填上适当字句,完成类成员函数的定义。
以下是引用片段:
#include
classComplex{
private:
floatreal,imag;
public:
Complex(floatr=0,floati=0){real=r;imag=i;}
voidDisplay(){
cout< if(imag>0)cout<<"+"<
elseif(imag<0)cout<
cout< }
Complexoperator+(Complex&b);
friendComplexoperator-(Complex&a,Complex&b);
};
ComplexComplex:
:
operator+(Complex&b)
{
Complex*t=newComplex(①________);
return*t;
}
Complexoperator-(Complex&a,Complex&b)
{
Complex*t=newComplex(②________);
return*t;
}
voidmain()
{
Complexc1(4.0,5.0),c2(2.0,-5.0),c3;
c3=c1+c2;
c3.Display();
c3=c1-c2;
c3.Display();
}
五、程序分析题(本大题共6小题,每小题5分,共30分)
31.写出下面程序的输出结果。
以下是引用片段:
#include
#include
inti=1;
voidother(void)
{
staticinta=2,b;
intc=10;
a=a+1;i=i+3;c=c+5;
cout<
b=a;
}
voidmain(void)
{
staticinta;
intb=-5,c=0;
voidother(void);
cout<<"iabc\n";
cout<
c=c+8;other();
cout<
i=i+10;other();
}
32.写出下面程序的输出结果。
以下是引用片段:
#include
classA
{
private:
intX,Y;
public:
A(){
X=Y=0;
cout<<"DefaultConstructorcalled."<
}
A(intxx,intyy){
X=xx;Y=yy;
cout<<"Constructorcalled."<
}
~A(){
cout<<"Destructorcalled."<
}
};
voidmain()
{
A*p1=newA;
deletep1;
p1=newA(1,2);
deletep1;
}
33.写出下面程序的输出结果。
以下是引用片段:
#include
classA{
private:
inta;
public:
voidset(intx){a=x;}
voidshow(){cout<<"a="<
};
classB:
publicA{
private:
intb;
public:
voidset(intx=0){A:
:
set(x);b=x;}
voidset(intx,inty){A:
:
set(x);b=y;}
voidshow(){A:
:
show();cout<<"b="<
};
voidmain(){
Bb;
b.set(12);b.show();
b.set(34,56);b.show();
}
34.写出下面程序的输出结果。
以下是引用片段:
#include
classA
{
private:
constinta;
staticintb;
public:
A(inti):
a(i),r(a){b++;}
voidprint(){cout<
constint&r;
};
intA:
:
b=0;
voidmain()
{Aa1(33);a1.print();
Aa2(44);a2.print();
}
35.写出下面程序的输出结果。
以下是引用片段:
#include
voidmain(void)
{intn=6,k;
cout< for(k=2;k if(n%k==0)
cout< cout< }
36.写出下面程序的输出结果。
以下是引用片段:
#include
classB{
public:
virtualintf(){return0;}
};
classD:
publicB{
public:
intf(){return100;}
};
voidmain(){
Dd;
B&b=d;
cout< cout<:
f()< }