C++期末复习题带答案.docx
《C++期末复习题带答案.docx》由会员分享,可在线阅读,更多相关《C++期末复习题带答案.docx(14页珍藏版)》请在冰豆网上搜索。
C++期末复习题带答案
C++复习电子版(带答案)
一、选择题(20分)
1.面向对象的程序设计语言必须具备的关键要素是(D)
A.抽象和封装B.抽象和多态性
C.抽象,封装和继承性D.抽象,封装,继承和多态性
2.下列说法中正确的是(A)
A.类中的函数成员可以在类体中定义,也可以在类体之外定义
B.类定义中只能声明函数成员的函数头,不能定义函数体
C.类中的函数成员在类体之外定义时必须要与类的定义放在同一文件中
D.在类体之外定义的函数成员不能操作该类的私有数据成员
3.在下列成对的表达式中,运算符“+”的意义不相同的一对是(C)
A.5.0+2.0和5.0+2B.5.0+2.0和5+2.0
C.5.0+2.0和5+2D.5+2.0和5.0+2
4.类的成员的初始化是通过函数完成的,这个函数通常是(B)
A.析构函数B.构造函数
C.其他成员函数D.友元函数
5.下列关键字中,用以说明类中公有成员的是(D)
A.friendB.private
C.protectedD.public
6.静态成员函数没有(B)
A.返回值B.this指针
C.指针参数D.返回类型
7.当一个类的某个函数被说明为virtual时,该函数在该类的所有派生类中(A)
A.都是虚函数
B.只有被重新说明时才是虚函数
C.只有被重新说明为virtual时才是虚函数
D.都不是虚函数
8.假定AB为一个类,则执行“ABx:
”语句时将自动调用该类的(D)
A.有参构造函数B.析构函数
C.拷贝构造函数D.无参构造函数
9.在c++中实现封装是借助于(B)
A.枚举B.类
C.数组D.函数
10.所有在函数中定义的变量,都是(B)
A.全局变量B.局部变量
C.静态变量D.寄存器变量
二、填空题(20分)
11.静态成员函数,友元函数,构造函数和析构函数中,不属于类的成员函数的是_友元函数___。
12.C++中,类的继承方式有___公有继承_____,___保护继承______和私有继承三种方式。
13.语句序列ifstreamdatafile;
datafile.open(“data.dat”);
的功能可用一个语句实现,这个语句是__ifstreamdatafile(“data.dat”);___。
14.一般将运算符重载为类的友元函数或者类的___成员函数______。
15.当一个类中含有___纯虚__函数时,这个类便成为抽象类。
16.在C++中,虚函数实现了类族的___多态__性。
17.通过C++语言中类的继承机制,可以扩充和完善已有类派生出新类,以适应新的需求。
18.为了在对象生存期结束时清理释放其指针成员所指向的动态存储空间,通常需要为该类定义___析构函数____。
19.在函数头与函数体之间加_____const_______关键字可以防止该函数改变数据成员的值。
20.A是一个类,已有语句“A*p;p=newA[10];”。
要释放由p指向的动态空间,正确的语句应该是___delete [] p;____。
三、改错题(5题,10分)
21.下面的类定义有一处错误,请用下横线标出错误所在行并改正错误。
classA{
inta;
public:
A(intaa):
a=aa{}A(intaa){a=aa;}
};
答案:
A(intaa):
a=aa{}错误,改为A(intaa):
a(aa){}
22.下面的程序先把字符串“Lookout!
”输出到一个文件中,然后再从该文件输入,并显示在屏幕上,显示效果为Lookout!
。
程序中有一处错误,请用下横线标出错误所在行,并给出更改意见。
#include
voidmain(){
ofstreamoutf(“D:
\tem.dat”,ios:
:
trunc);
outf<<“Lookout!
”;
outf.close();
ifsteaminf(“D:
\tem.dat”);
chark[20]; 改:
inf.getline(k,20);//inf>>kinf>>k; count< inf.close();
}
答案:
inf>>k;错误,它只能读出Look,应改为,inf.getline(k,20);
23.下面的程序有一处错误,请用下横线标出错误所在行并改正错误。
#include
classTest{
public;
staticintx;
};
intx=20;//对类成员初始化
voidmain()
{
cout<:
x;
}
答案:
intx=20;错误,应改为intTest:
:
x=20;
24.下面的程序类B的定义中有一处错误,请用下横线标出错误所在行并说明错误原因。
#include
#include
classA{
public:
A(constchar*nm){strcpy(name,nm);}
private:
charname[80];
};
classB:
publicA{
public:
B(constchar*nm):
A(nm){}
voidPrintName()const;
};
voidB:
:
PrintName()const{
cout<<“name:
”< }
voidmain(){
Bb1(“wangli”);
b1.PrintName();
}
答案:
cout<<“name:
”<因为name是类A私有成员继承而来,不能被派生类访问。
25.用下横线标出下面程序main函数中的错误所在行,并说明错误原因。
#include
classLocation{
private:
intX,Y;
public;
voidinit(intinitX,intinitY);
intsumXY();
};
voidLocation:
:
init(intinitX,intinitY)
{
X=initX;
Y=initY;
}
intLocation:
:
sumXY()
{
returnX+Y;
}
voidmain()
{
LocationA1;
intx,y;
A1.init(5,3);
x=A1.X;y=A1.Y;(私有成员不能直接访问!
)
cout<} }
四、完成程序题(5题,20分)
26.完成下面类中的成员函数的定义。
classtest
{
private:
intnum;
floatx;
public:
test(int,floatf);
test(test&);
};
test:
:
test(intn,floatf)
{num=n;
1①____x=f_______________;
}
test:
:
test(test&t)
{
2___num=t.num_______________;
X=t.X;
}
27.在下面的横线处填上适当的内容,是程序完整。
#include
#include
Classloc{
Private:
Floatx,y;
Public:
loc(①floatx1,floaty1)
{
x=x1;
y=y1;
}
floatgetx(){returnx;}
floatgety(){returny;}
②staticfloatdis(loc&,loc&);
};
floatloc:
:
dis(loc&a,loc&b)
{
flostdx=a.x-b.x;
flostdy=a.y-b.y;
returnsqrt(dx*dx+dy*dy);
}
voidmain()
{
locpl(3.5,4.5),p2(5.5,6.5);
floatd=loc:
:
dis(p1,p2);
cout<<“Thedistanceis”<}
28.在下面程序中的横线处填上适当内容,使程序完整。
#include
classvehicle
{
protected:
intsize;
intspeed;
public;
voidsetSpeed(ints){speed=s;}
①____virtual____int____getSpeedLevel(){returnspeed/10;}
};
classcar:
publicvehicle
{
public:
intgetSpeedLeve(){returnspeed/5;}//求派生类小汽车速度级
};
classtruck:
publicvehicle
{
public:
intgetspeedLevel(){returnspeed/15;}//求派生类大卡车类速度级
};
intmaxSpeedLevel(vehicle②&v2,vehicle③&v1)//比较交通工具类族中速度级
{
if(v1.getSpeedLevel()>v2.getSpeedLevel())
return1;
else
reutrn2;
}
voidmain()
{
turckt;
carc;
t.setSpeed(130);
c.setSpeed(60);
cout<}
29.在下面横线处填上合适内容,完成类B的定义。
#include
classA{
public:
A(){a=0;}
A(inti){a=i;}
voidprint(){cout<private:
inta;
};
classB:
publicA{
public:
B(){b1=b2=0}//默认无参构造函数
B(①____inti______){b1=i;b2=0;}//需一个参数i的构造函数
B(inti,intj,intk);②_____A=i______{b1=j;b2=k;}//使a的值为i
voidprint(){A:
:
print();cout<private:
intb1,b2;
}
30.根据注释在空白处填写适当内容。
classLocation{
private:
intX,Y;
public:
voidinit(intinitX,intinitY);
intGetX();
intGetY();
};
voidLocation:
:
init(intinitX,intinitY)
{
X=initX;
Y=initY;
}
intLocation:
:
GetX()
{
reutrnX;
}
intLocation:
:
GetY()
{
reutrnY;
}
#include
voidmain()
{
LocationA1;A1.init(20,90);
①____Location&rAL=Al_;______//定义一个指向A1的引用rA1
②____cout<}
一,程序分析题(4题,16分)
31.写出下面程序的输出结果:
(3.7.9.1.5.4)
#include
classFunArray
{
int*pa;//指向一个数据空间
intsize;//数组元素个数
public:
FunArray(inta[],intthesize):
pa(a),size(thesize){}
intSize(){returnsize;}
int&operator[](intindex){returnpa[index-1];}
};
voidmain()
{
ints[]={3,7,2,1,5,4};
FunArrayma(s,sizeof(s)/sizeof(int));
ma[3]=9;
for(inti=1;i<=ma.Size();i++)cout<}
32.写出下面程序的输出结果:
#include
template
classTclass{
Tx,y;
public:
Tclass(Ta,Tb):
x(a){y=b;}
Tclass(Ta){y=(T)0,x=a;}
voidpr(){
charc;
c=(y>=(T)0?
′+′:
′-′);
cout<(T)0?
y:
-y)<<″i″<}
};
voidmain()
{
Tclassa(10.5,-5.8);
a.pr();
Tclassb(10);
b.pr();
}
33.写出下面程序的输出结果:
#include
classTest{
private:
staticintval;
inta;
public;
staticintfunc();
voidsfunc(Test&r);
};
intTest:
:
val=200;
intTest:
:
func()
{
returnval++;
}
voidTest:
:
sfunc(Test&r)
{
r.a=125;
cout<<″Result3=″<}
voidmain()
{
cout<<”Result1=”<:
func()<Testa;
cout<<”Result2=”<a.sfunc(a);
}
34.写出下面程序的输出结果:
#include
classA
{public;
virtualvoidprint(){cout<<”ThisisclassAprinting.”<};
classB:
publicA
{public:
voidprint(){}
};
classC:
publicB
{public:
voidprint(){cout<<”ThisisclassCprinting.”<};
voidshow(A&a){a.print();}
voidmain()
{Aa;
Bb;
Cc;
show(a);
show(b);
show(c);
}
二,程序编写(14分)
35.用面向对象的方法,设计数组类检验及学生类。
编写一个程序从键盘输入10个学生的基本情况,每个学生的信息包括学号(No),姓名(Name),成绩(Score),要求按每个学生的成绩由低到高排序输出。
要求:
(1)用UML图对数组类检验及学生类的结构进行编程。
(4分)
(2)编程实现类的结构,成员函数及测试用的主函数(10分)