007《面向对象程序设计》精彩试题及问题详解Word文档下载推荐.docx
《007《面向对象程序设计》精彩试题及问题详解Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《007《面向对象程序设计》精彩试题及问题详解Word文档下载推荐.docx(13页珍藏版)》请在冰点文库上搜索。
D.函数代码多、不常调用
7.在关键字public后面定义的成员为类的(
A.私有成员
B.公用成员
C.保护成员
D.任何成员
8.以下哪个基类中的成员函数表示纯虚函数?
A.virtualvoidtt()=0
B.voidtt(int)=0
C.virtualvoidtt(int)
D.virtualvoidtt(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,请指出错误所在行的行号并给出改正意见。
classfract{
intden;
//分子
intnum;
//分母
public
//1行
fract(intd=0,intn=1):
den(d),num(n){}
//2行
friendfract&
operator+=(fract,fract&
);
//3行
voidshow(){cout<
<
den<
’/’<
num;
}
//4行
};
//5行
operator+=(fractf1,fractf2)
//6行
{
//7行
f1.den=f1.den*f2.num+f1.num*f2.den;
//8行
f1.num*=f2.num;
//9行
returnf1;
//10行
}
voidmain(){
fractfr(3,4);
fr+=fract(5,7);
fr.show();
错误行的行号为____________、____________和____________。
分别改正为____________、____________和____________。
22.下面程序段第13-17行中存在着三条语句错误,请指出错误语句的行号并说明原因。
class
A{
inta;
//2行
public:
A(intaa=0):
a(aa){}
//5行
classB{
inta,b;
constintc;
Ad;
B():
c(0){a=b=0;
//11行
B(intaa,intbb):
d(aa+bb){
//12行
a=aa;
b=bb;
c=aa-bb;
//13行
//14行
//15行
Ba,b(1,2);
//16行
Bx=a,y(b),z(1,2,3);
//17行
错误原因分别为____________、____________和____________。
四、程序填空题(本大题共3小题,每小题6分,共18分)
请按提示要求完成以下程序段的填空。
23.在下面一段类定义中,Derived类是由直接基类Base1和Base2所派生的,Derived类包含有两个间接基类BaseBase,在初始化函数Init中,需要把x1和x2的值分别赋给属于基类Base1的x成员和属于基类Base2的x成员。
classBaseBase{
protected:
intx;
BaseBase(){x=1;
classBase1:
publicBaseBase{
Base1(){}
classBase2:
Base2(){}
classDerived:
____________
(1)____________
{
Derived(){}
voidInit(intx1,intx2){
____________
(2)____________;
____________(3)____________;
voidoutput(){cout<
Base1:
:
x<
’’<
Base2:
endl;
(1)
(2)
(3)
24.#include<
iostream.h>
#include<
stdliB.h>
classA{
int*a;
intn;
intMaxLen;
A():
a(0),n(0),MaxLen(0){}
A(int*aa,intnn,intMM){
n=nn;
MaxLen=MM;
if(n>
MaxLen)exit
(1);
a=newint[MaxLen];
____________(4)____________;
//以i为循环变量把aa数组中每个元素值
//传送给a数组的对应元素中
}
~A();
intGetValue(inti){returna[i];
}//函数体返回a[i]的值
____________(5)____________//析构函数的类外定义
voidmain()
intb[10]={1,2,3,4,5,6,7,8,9,10};
Ar(b,10,10);
inti,s=0;
____________(6)____________;
//以i为循环变量,把r对象的a数据成员中的
//每个元素值依次累加到s中
cout<
"
s="
s<
(4)
(5)
(6)
25.下面是一维数组类ARRAY的定义,ARRAY与普通一维数组区别是:
(1)用()而不是[]进行下标访问,
(2)下标从1而不是从0开始,(3)要对下标是否越界进行检查。
classARRAY{
int*v;
//指向存放数组数据的空间
ints;
//数组大小
ARRAY(inta[],intn);
~ARRAY(){delete[]v;
intsize(){returns;
int&
operator()(intn);
____________(7)____________operator()(intn)
{//()的运算符函数定义
if(____________(8)____________){cerr<
下标越界!
;
exit
(1);
}//exit函数的功能是退出程序运行
return____________(9)____________;
(7)
(8)
(9)
五、程序分析题(本大题共6小题,每小题5分,共30分)
阅读以下程序,写出其运行结果。
26.#include<
classtest{
private:
staticintval;
staticintfunc();
staticvoidsfunc(test&
r);
inttest:
val=10;
func()
{
val--;
returnval;
voidtest:
sfunc(test&
r)
r.a=15;
"
result3="
<
r.a;
voidmain()
resultl="
test:
func()<
testa;
result2="
a.func()<
sfunc(a);
27.#include<
classposition{
intx,y;
voidinit(intinitx,intinity);
intgetxvalue();
intgetyalue();
voidposition:
init(intinitx,intinity)
x=initx;
y=inity;
intposition:
getxvalue()
returnx;
getyalue()
returny;
voidprintout(position&
rl)
rl.getxvalue()<
rl.getyalue()<
'
\n'
;
positiona[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(inti=0;
i<
5;
i++)
printout(*(pa++));
28.#include<
classtest{
virtualvoidfun1(){
cout<
testfun1"
virtualvoidfun2(){
testfun2"
voidfun3(){
testfun3"
classftt:
publictest
voidfun1(){cout<
fttfun1"
virtualvoidfun2(){cout<
fttfun2"
virtualvoidfun3(){cout<
fttfun3"
test*pp;
fttq;
pp=&
q;
pp->
fun1();
fun2();
fun3();
29.#include<
classcomplex{
intreal;
intimag;
complex(intr=0,inti=0):
real(r),imag(i){}
complexoperator++(){real++;
return*this;
}
real<
endl<
imag;
voidmain(){
complexc(5,9);
++c;
c.show();
30.#include<
a(aa){cout<
a<
~A(){cout<
11"
voidmain(){
A*p;
Ax[2]={1,2};
p=newA[3];
delete[]p;
31.#include<
int*a;
A(intx=0):
a(newint(x)){}
~A(){deletea;
intgetA(){return*a;
voidsetA(intx){*a=x;
Ax1,x2(3);
A*p=&
x2;
p->
setA(x2.getA()+5);
x1.setA(15+x1.getA());
x1.getA()<
x2.getA()<
endl;
200710易老师做的参考答案
一、1.B2.C3.B4.D5.C6.C7.B8.A9.C10.D
二、11.单继承12.编译13.virtualpublic14.虚拟的类型参数15.声明
16.空17.常变量18.封装19.构造函数20.const
三、21错误的行为:
136
分别改正为:
friendfract&
operator+=(fract&
fract&
fract&
operator+=(fract&
f1,fract&
f2)
22错误的行为:
131517
B(intaa,intbb):
d(aa+bb),c(aa-bb){//12行
a=aa;
};
Bx=a,y(b),z(1,2);
//17行
23publicBase1,publicBase2
Base1:
x=x1;
Base2:
x=x2;
24for(inti=0;
n;
i++)a[i]=aa[i];
A:
~A(){delete[]a;
for(i=0;
10;
i++)s=s+r.GetValue(i);
25int&
ARRAY:
n>
ss
26resultl=9
resultl=8
resultl=15
2756
22
78
44
55
66
28fttfun1
fttfun2
testfun3
296
9
30120001111111111(每个数据占一行显示)
31158