C考试试题答案要点.docx
《C考试试题答案要点.docx》由会员分享,可在线阅读,更多相关《C考试试题答案要点.docx(14页珍藏版)》请在冰豆网上搜索。
C考试试题答案要点
C++面向对象程序设计考试试题答案
一、单项选择题(在每小题的四个备选答案中,选出一个正确的答案,
并将其号码填在题干后的括号内。
每小题1分,共20分)
1.面向对象程序设计将数据与____a____放在一起,作为一个相互依存、不可
分割的整体来处理。
A.对数据的操作B.信息
C.数据隐藏D.数据抽象
2.____a____不是面向对象系统所包含的要素。
A.重载B.对象
C.类D.继承
3.按照标识符的要求,____a____符号不能组成标识符。
A.连接符B.下划线
C.大小写字母D.数字字母
4.已知ch是字符型变量,下面正确的赋值语句是___b_____。
A.ch=’123’;B.ch=’\xff’;
C.ch=’\08’;D.ch=”\”;
5.要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用
____a____。
A.内联函数B.递归调用
C.重载函数D.嵌套调用
6.____c____的功能是对对象进行初始化。
A.析构函数B.数据成员
C.构造函数D.静态成员函数
7.在下列关键字中,用以说明类中公有成员的是___a_____。
A.publicB.private
C.protectedD.friend
8._____D___无返回类型,但又有return语句。
A.虚函数B.内联函数
C.友元函数D.类型转换函数
9.类模板的使用实际上是将类模板实例化成一个具体的___A_____。
A.类B.对象
C.函数D.模板类
10.利用友元函数重载“>>”运算符,第2个参数必须为___c_____。
A.指针B.对象
C.引用D.无值
11.用成员函数重载二元运算符@,则显式调用方式为__C______。
A.obj1.operator@(obj2)B.operator@(obj1,obj2)
C.obj1.operator@()D.obj1@obj2
12.通常拷贝构造函数的参数是___c_____。
A.某个对象名B.某个对象的成员名
C.某个对象的引用名D.某个对象的指针名
13.已知一个类A,_____B___是指向类A成员函数的指针。
假设类有三个公有成
员:
voidf1(int),voidf2(int)和inta。
A.A*pB.intA:
:
*pc=&A:
:
a
C.voidA:
:
*paD.A*pp
14.用struct定义类,若它的成员缺省段约束符的说明,其成员是____b____的
成员。
A.私有段B.公有段
C.特殊段D.保护段
15.下列定义中,___A____是定义指向数组的指针p。
A.int*p[5]B.int(*p)[5]
C.(int*)p[5]D.int*p[]
16.C++中的类有两种用法:
一种是类的实例化,即生成类的对象,并参与系
统的运行;另一种是通过_____c___,派生出新的类。
A.复用B.单继承
C.继承D.多继承
17.派生类的对象对它的基类成员中___A_____是可以访问的。
A.公有继承的公有成员B.公有继承的私有成员
C.公有继承的保护成员D.私有继承的公有成员
18.说明静态成员函数的关键字为_____a___。
A.staticB.virtual
C.friendD.void
19.下列运算符中,_____c___运算符在C++中不能重载。
A.?
:
B.+
C.-D.<=
20.cin是____b____类的标准对象的引用。
A.ostreamB.istream
C.stdinD.stdout
二、多项选择题(在每小题的五个备选答案中,选出若干个正确的答
案,并将其号码分别填在题干后的括号内;多选、少选、错选均无分。
每小题2分,共10分)
1.若给出函数声明:
voidf(inta=1,intb=2,intc=3,intd=4);
下面的函数调用合法的有___ABD_____。
A.f()B.f(5)C.f(5,6)
D.f(5,6,7)E.f(5,6,7,8)
2.不能用友元函数重载的运算符有___ABDE_____。
A.=B.[]C.+
D.->E.()
3.对一元运算符进行重载后,正确的显式调用方式有___BD_____。
A.@aB.operator@(a)C.a@b
D.a.operator@()E.a@
4.关于构造函数,正确的描述有___BD____。
A.可以是虚函数B.可以有参数C.可以被继承
D.可以重载E.可以显式调用
5.C++的模板有____DE____模板。
A.运算符B.数据C.类型
D.类E.函数
三、名词解释(每小题2分,共8分)
1.封装性:
封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。
2.类:
实际上是对某种类型的对象定义变量和方法的原型。
它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。
3.构造函数:
是一种特殊的方法主要用来在创建对象时初始化对象即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中特别的一个类可以有多个构造函数可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载
4.内联函数:
,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(,从而节省了每次调用函数带来的额外时间开支。
四、判断分析题(判断正误,将正确的划上“√”,错误的划上“╳”,
并简述理由。
每小题3分,共12分)
1.空类就是没有名字的类。
错。
空类是没有任何成员的类
2.引用类型和指针类型作为函数的形式参数时,对调用函数的实际参数的要
求是一样的,均是地址。
错
3.在派生类中,若基类的一个成员在派生类中也把相同名字定义为一个成员,
则不可调整它的访问。
错。
因为基类构造函数的调用顺序是按照派生类定义时的顺序,而内嵌对象构造函数调用顺序应该按照成员在类中声明的顺序.两种都可以控制
4.对象数组在创建时要求构造函数不能有任何参数。
错。
静态数据成员是一个类的多个对象共享的
五、读程序、得结果(每小题5分,共20分)
1.#include
classA
{inta;
public:
voidseta(intx){a=x;}
voidshowa(){cout<};
classB
{intb;
public:
voidsetb(intx){b=x;}
voidshowb(){cout<
}
classC:
publicA,privateB
{intc:
public:
voidsetc(intx,inty,intz){c=z;seta(x);setb(y);}
voidshowc(){cout<};
main()
{Cc;
c.seta
(1);
c.showa();
c.setc(1,2,3);
c.showc();
}
以上程序的执行结果是____3____。
2.#include
classcsample
{private:
inti;
staticintk;
public:
csample();
voiddisplay();
};
csample:
:
csample(){i=0;k++;}
voidcsample:
:
display(){cout<<”i=”<
intcsample:
:
k=0;
main()
{csamplea,b;
a.display();
b.display();
}
以上程序的执行结果是_____i=0,k=2
I=0,k=2_。
____。
3.#include
classsample
{intx;
public:
voidsetx(inti){x=i;}
intputx(){returnx;}
};
main()
{sample*p;
sampleA[3];
A[0].setx(5);
A[1].setx(6);
A[2].setx(7);
for(intj=0;j<3;j++){p=&A[j];cout<putx()<<””;}
cout<}
以上程序的执行结果是___567_____。
4.#include
staticintdys[]={31,28,31,30,31,30,31,31,30,31,30,31};
classdate
{
intmo,da,yr;
public:
date(intm,intd,inty){mo=m,da=d;yr=y;}
date(){}
voiddisp(){cout<dateoperator+(intday)
{datedt=*this;
day+=dt.da;
while(day>dys[dt.mo-1])
{day-=days[dt.mo-1];
if(++dt.mo==13){dt.mo=1;dt.yr++;}
}
dt.da=day;
returndt;
}
};
main()
{dated1(2,10,2001),d2;
d2=d1+20;
d2.disp();
}
以上程序的执行结果是___3/2/2001___。
六、编程题(每小题15分,共30分)
1.用模板设计一个堆栈类,包含判栈、读栈、入栈和出栈功能,要求用成员
函数重载“()”实现判栈功能,用友元函数重载“--”实现出栈功能。
重载“-”为出栈?
“<<”?
判栈有判空和判满。
#include
usingnamespacestd;
template
classStack
{
private:
intsize;
inttop;
T*space;
public:
Stack(intn);
~Stack()
{
delete[]space;
}
voidpush(Tt);
friendostream&operator<<(ostream&out,Stack&st)
{
while(!
(st.operator()()))
out<returnout;
}
booloperator()()const
{
returntop==size;
}
boolIsfull()const
{
returntop==0;
}
};
template
Stack:
:
Stack(intsize)
{
this->size=size;
top=size;
space=newT[size];
}
template
voidStack:
:
push(Tt)
{
if(!
Isfull())
space[--top]=t;
}
intmain()
{
Stacks(20);//可以指定栈的大小
s.push
(1);
s.push
(2);
s.push(3);
s.push(4);
s.push(5);
s.push(6);
cout<
}
这个没问题,如果是重载-改为:
#include
usingnamespacestd;
template
classStack
{
private:
intsize;
inttop;
T*space;
public:
Stack(intn);
~Stack()
{
delete[]space;
}
voidpush(Tt);
friendStack&operator-(Stack&st)
{
while(!
(st.operator()()))
cout<}
booloperator()()const
{
returntop==size;
}
boolIsfull()const
{
returntop==0;
}
};
template
Stack:
:
Stack(intsize)
{
this->size=size;
top=size;
space=newT[size];
}
template
voidStack:
:
push(Tt)
{
if(!
Isfull())
space[--top]=t;
}
intmain()
{
Stacks(20);//可以指定栈的大小
s.push
(1);
s.push
(2);
s.push(3);
s.push(4);
s.push(5);
s.push(6);
-s;
}
但是这个在VC下不行,在codeblocks下使用mingw32-g++.exe可以正常编译执行,运行截图:
请参考
2.利用基类、派生类和虚函数的概念编写一个程序计算三角形、矩形和圆形
的面积。
#include
constdoublePI=3.1415926;
usingnamespacestd;
structPoint
{
Point()
{
x=y=0;
}
Point(doubleX,doubleY)
:
x(X),y(Y){};
doublex;
doubley;
};
classshape
{
public:
virtualdoubleGetArea()=0;//虚函数,纯虚函数,图形不具体的话,无法求面积
virtualvoidPrint()=0;//虚函数,纯虚函数,图形不具体的话,无法输出面积
};
//三角形类,继承自图形类
classtrigon:
publicshape
{
public:
trigon(Point&A,Point&B,Point&C)
:
a(A),b(B),c(C){};
~trigon(){};
doubleGetArea()
{
//自己找公式吧,根据三点计算面积的
area=0;
returnarea;
}
voidPrint()
{
cout<<"三角形【("<("
<("
<"
<}
private:
trigon(){};
Pointa,b,c;//三角形三个点
doublearea;//面积
};
//矩形类,继承自图形类
classrect:
publicshape
{
public:
rect(double&Top,double&Bottom,double&Left,double&Right)
:
top(Top),bottom(Bottom),left(Left),right(Right)
{
//填充四个点的坐标
pa.x=Left;
pa.y=Top;
pb.x=Left;
pb.y=Bottom;
pc.x=Right;
pc.y=Top;
pd.x=Right;
pd.y=Bottom;
};
~rect(){};
doubleGetArea()//计算矩形面积
{
//
return(right-left)*(bottom-top);
}
voidPrint()
{
cout<<"矩形【("<("
<("
<("
<"
<}
private:
rect(){};
Pointpa,pb,pc,pd;//矩形左上、左下、右上、右下四个点坐标
doubletop,bottom,left,right;//矩形上下左右四个线的坐标线
doublearea;//面积
};
//圆形类,继承自图形类
classcircle:
publicshape
{
public:
circle(Point&C,double&R)
:
c(C),r(R)
{};
~circle(){};
doubleGetArea()
{
//
area=PI*r*r;
returnarea;
}
voidPrint()
{
cout<<"圆形【"<"<"<"
<}
private:
circle(){};
Pointc;//圆心
doubler;//半径
doublearea;//面积
};
intmain(intargc,char*argv[])
{
doubletop,bottom,left,right,radius;
top=2;
bottom=1;
left=1;
radius=2;
radius=5;
PointA(left,bottom),B(left,top),C(radius,top),D(radius,bottom);
trigonTrigon(A,B,C);
rectRect(top,bottom,left,right);
circleCircle(A,radius);
shape*pS;
pS=&Trigon;
pS->Print();
pS=&Rect;
pS->Print();
pS=&Circle;
pS->Print();
return0;
}