C++试题及答案.docx
《C++试题及答案.docx》由会员分享,可在线阅读,更多相关《C++试题及答案.docx(36页珍藏版)》请在冰点文库上搜索。
C++试题及答案
C++试卷
一、选择题(每题1分)
1.下面是关于构造函数的说法,不正确的是()。
A.C++规定,每一个类必须有一个构造函数,没有构造函数就不能创建对象
B.如果没有提供一个类的构造函数(一个都未提供),则C++提供一个默认的构造函数,该默认构造函数是个无参构造函数,它仅仅负责创建对象
C.虽然一个类定义了一个构造函数(不一定是无参构造函数),C++仍然提供默认的构造函数
D.与变量定义类似,在用默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象的位模式全为0,否则,对象值是随机的
2.在下列说法中,不正确的是()。
A.静态成员函数不能利用this指针
B.只有非静态成员才可以使用this关键字,因为静态成员没有this指针
C.析构函数不接受任何参数,也不带有任何类型的返回值
D.虚机制在构造函数和析构函数中仍然可以很好地工作,以实现多态性
3.多重继承的构造顺序一般可分为4步,下面给出这4个步骤:
step1:
任何非虚拟基类的构造函数按照它们被继承的顺序构造。
step2:
任何虚拟基类的构造函数按照它们被继承的顺序构造。
step3:
任何成员对象的构造函数按照它们声明的顺序构造。
step4:
类自己的构造函数。
这4个步骤的正确顺序是()。
A.step4、step3、step1、step2B.step2、step4、step3、step1
C.step2、step1、step3、step4D.step3、step4、step1、step2
4.若程序中有非法操作,则()。
A.eofbit置位B.failbit置位C.badbit置位D.hardbit置位
5.设置填充字符的函数是()。
A.intios:
:
width(int)B.intios:
:
width()C.charios:
:
fill(char)D.charios:
:
fill()
6.返回当前精度的成员函数是()。
A.intios:
:
width(int)B.intios:
:
width()C.intios:
:
precision()D.intios:
:
precision(int)
7.要求浮点输出时必须带有一个小数点的格式控制常量是()。
A.sowbaseB.showposC.showpointD.fixed
8.目前推荐的C++标准()虚构造函数。
A.不支持B.支持C.曾经支持过D.已经由过去的不支持改为支持
9.下列对模板的声明,正确的是()。
A.templateB.template
C.templateD.template
10.友元运算符obj++被C++编译器解释为()。
A.operator++(obj)B.operator++(obj,0)
B.obj.operator++()D.obj.operator++(0)
11.C++的运算符函数的返回类型()。
A.可以是任意类型B.不可以是int类型
C.不能是void类型D.不可以是float类型
12.声明类test的复制构造函数的正确形式是()。
A.inttestB.voidtestC.test(void)D.test(test&)
13.一个const对象()。
A.能访问所有成员函数B.只能访问const成员函数
C.也能访问volatile成员函数D.能访问const和volatile成员函数
14.下面关于类的对象性质的描述,正确的是()。
A.对象之间不可以相互赋值B.不可以说明指向对象的指针
C.对象不能用作数组元素D.一个对象能用作另一个对象的成员
二、填空题(每题2分)
1.在c++中,除具有、语句的函数不能说明为内联函数外,其它函数都可以说明为内联函数。
2.在c++中,封装可以由、和等关键字提供。
3.若example是已定义的类,在程序结束之前,共计存在个对象。
#include”example”
main()
{exampleX(0);
X=5;X.print();
X=example(10);
X.print();
}
4.由于二义性原因,一个类不能从同一个类中直接一次以上,如果必须这样做,可以使用一个。
5.在c++中,如果在多条继承路径有一个公共的基类,如果想使这个公共的基类只产生一个拷贝,则可以将这个基类说明为。
使用关键字说明。
6.简单成员函数是指声明中不含有、、关键字的函数。
7.静态成员为该类的所有共享,它们被存储于一个中。
8.在c++中声明和时使用volatile或const均是非法的。
9.当访问私有静态数据成员时,可通过定义公有的来访问。
10.有关继承,静态成员被继承,友元被继承。
11.c++不允许重载、、、运算符。
12.、、、四个运算符只能用类运算符来重载。
13.c++提供两种格式控制方式,一种是,另一种是。
14.如果Empty是从某个其它类派生出来的,而且这个其它类又有一个析构函数,c++也将为Empty写一个。
15.当一个基类定义了赋值或初始化语义,而其派生类却未定义赋值或初始化语义时,c++编译器为该派生类自动生成一个或函数。
16.如果程序员定义classEmpty{};,下列各语句将产生的函数名称是:
a. constEmptye1;//
b. Emptye2=e1;//
c. e2=e1;//
d. Empty*pe2=&e2;//
e. constEmpty*pe1=&e1;//
三、改错题(每题7分)
1.仔细阅读下面的程序,找出类定义中的错误及其理由,并以尽量少的改动使其能够正确编译运行并给出运行结果。
#include
classtest{
intm;
intGet(){returnm;}
public:
statictest(inti){m=i;}
voidSet(inti){m=i;}
voidShow(){cout<~test(){cout<};
voidmain()
{
testa(25);
a.Show();
a.Set(45);
a.Show();
testc;
c.Set(55);
c.Show();
}
2.仔细阅读下面的程序,改正其中的错误并给出运行结果。
#include
#include
main()
{
ifstreamout("myfile2");
if(!
out){
cout<<"can'topenmyfile2."<return1;
}
charstr[]="Howareyou?
";
char*p=str;
while(*p)
{out.put(*p);}
out.close();
ofstreamin("myfile2");
if(!
in){
cout<<"can'topenmyfile2."<return1;
}
charch;
while(!
in){
in.get(ch);
cout<}
in.close();
return0;
}
四、程序分析(每题10分)
1.分析下面的程序,写出输出结果。
#include
#include
classbase{
public:
virtualchar*fun(void)const=0;
};
char*base:
:
fun(void)const
{return"base";}
classderived1:
virtualpublicbase{
public:
char*fun(void)const{
return"derived1";
}
};
classderived2:
virtualpublicbase{
public:
char*fun(void)const{
return"derived2";
}
};
classsubderived:
publicderived1,publicderived2{
public:
char*fun(void)const{
char*pch;
pch=newchar[strlen(derived1:
:
fun())+strlen(derived2:
:
fun())+1];
strcpy(pch,derived1:
:
fun());
strcat(pch,derived2:
:
fun());
returnpch;
}
};
voidmain(void){
base*pb;
pb=newderived1;
cout<fun()<pb=newderived2;
cout<fun()<pb=newsubderived;
cout<fun()<}
2.阅读程序,给出正确的输出结果。
#include
classbase{
public:
virtualintfun(void)const{
cout<<"base:
:
fun"<return10;
}
};
classdivide:
publicbase{
public:
intfun(void)const{
cout<<"divide:
:
fun"<return20;
}
};
voidmain(void){
divided;
base*b1=&d;
base&b2=d;
baseb3;
b1->fun();
b2.fun();
b3.fun();
}
五、完成程序(每题10分)
1.1.根据已有程序和输出结果完成下面的程序。
#include
#include
classPoint
{
private:
_______
protected:
_______
public:
Point(floata,floatb,floatc){__________}
floatGetx(){returnX;}
floatGety(){returnY;}
floatGetz(){returnZ;}
};
classLine:
_______Point
{
private:
floatm;
public:
Line(floata,floatb,floatc,floatd)_______
{_________}
voidshow()
{
cout< cout< cout< cout< cout< cout< }
};
voidmain()
{
LineA(4.5,6.5,8.5,9.5);
A.show();
}
程序输出结果为:
4.5
6.5
6.5
8.5
8.5
9.5
4.5
2.仔细阅读下面的程序,在下划线处填上正确的内容,然后给出正确的输出结果。
#include
classbase{
inti;
intj;
public:
base(void):
i(0),j(0){}
base(intI,intJ):
{}
intgetI(void)const{
returni;
}
intgetJ(void)const{
returnj;
}
virtualvoiddisplay(void)const{
cout<<"i="<
}
virtual~base(void){
display();
}
};
classderived:
publicbase{
intk;
public:
derived(void):
{}
derived(intI,intJ,intK):
base(I,J),k(K){}
voiddisplay(void)const{
cout<<"i+k="<:
getI()+k<<"\t"<<"j+k="<:
getJ()+k<}
~derived(void){
display();
}
};
voidmain(void){
derivedd1;
d1.display();
derivedd2(10,20,5);
d2.display();
} 返回
计算机与信息工程学院2004-2005第二学期
《C++试卷》(B)04软件
一、单选题(每小题1分,共15分)
1、C++源程序文件的扩展名为( )
A、.CPP B、.C C、.DLL D、.EXE
2、编译程序的功能是( )
A、将汇编语言程序转换为目标程序
B、将汇编语言程序转换为高级语言程序
C、将高级语言程序转换为目标程序
D、将高级语言程序转换为汇编语言程序
3、下面的函数声明中,哪一个是”voidBC(inta,intb);”的重载函数?
( )
A、int BC(inta,intb) B、voidBC(inta,charb)
C、floatBC(inta,intb,intc=0)
D、voidBC(inta,intb=0)
4.如果a=1,b=2,c=3,d=4,则条件表达式“a>b?
a:
cc:
d”的值为( )
A.3 B.2 C.1 D.4
5.在inta[][3]={{1},{3,2},{4,5,6},{0}}中,a[2][2]的值是( )
A.3 B。
2 C。
6 D。
4
6. 已知charc;char*constpc="asdf",( )是正确的。
A.pc="dfgh"
B.*pc=‘b’
C.*pc++=‘y’
D.pc=&c
7.对于int*pa[5]的描述,()是正确的。
A.pa是一个指向数组的指针,所指向的数组是5个int型元素
B.pa是一个指向某数组中的第5个元素的指针,该元素是int型变量
C.pa[5]表示某个数组的第5个元素的值
D.pa是一个具有5个元素的指针数组,每个元素是一个int型指针
8.执行下列语句后的输出结果是( )。
inthot=100;
int&rad=hot;
hot+=100;
cout< A.0; B。
100;
C.200; D。
300;
9.下列对结构及其变量定义错误的是:
( )
A.structMyStruct{ B。
structMyStruct{
intnum; intnum;
charch; charch;
}; }my;
MyStruct my;
C. struct{ D。
struct{
intnum; intnum;
charch; charch;
} };
my; struct my;
10.下列关于指针运算的描述错误的是:
()
A.在一定条件下,两个指针可以相加
B.在一定条件下,两个指针可以进行关系运算
C.在一定条件下,指针可以为空
D.在一定条件下,两个指针可以相互赋值
11.在C++语言中,对函数参数默认值描述正确的是:
( )
A.函数参数的默认值只能设定一个
B.一个函数的参数若有多个,则参数默认值的设定可以不连续
C.函数参数必须设定默认值
D.在设定了参数的默认值后,该参数后面定义的所有参数都必须设定默认值
12.不能作为函数重载判断依据的是:
( )
A.参数个数 B。
参数类型 C。
函数名字 D。
返回类型
13.以下程序的输出结果是:
( )
#include
voidprt(int*x,int*y,int*z){
cout<<++*x<<","<<++*y<<","<<*z++< }
inta=10,c=20,b=40;
voidmain(){
prt(&a,&b,&c); prt(&a,&b,&c);
}
A.11,42,31 B。
11,41,20 C。
11,21,40 D。
11,41,21
12,21,41 12,42,20 11,21,41 12,42,22
14.以下程序的输出结果是:
( )
#include
voidfunc(char**m){
++m;
cout<<*m< }
voidmain(){
staticchar*a[]={"morning","afternoon","evening"};
char**p;
p=a;
func(p);
}
A.字符o的起始地址 B。
字符a的起始地址
C.字符o D。
afernoon
15.以下程序的输出结果是:
( )
#include
int fun(char*s){
char*p=s;
while(*p!
='\0') p++;
return(p-s);
}
voidmain(){
cout< }
A.0 B。
1 C。
2 D。
3
二、填空题(每小题2分,共20分)
1.设
structstudent
{intno;charname[12];
charsex;floatscore[4];
}stu1;
在程序执行时,系统为stu1分配 个字节的内存空间。
2.设有一函数,其代码如下:
intpower(x,n)
{
inti,p;
for(p=1,i=1;i<=n;++i)
p=p*x;
return(p);
}
现要求取消变量i,重写该函数如下,请在空白上填上适当内容。
int power(intx,intn)
{
intp;
for(_________;n>0;__________)
p=p*x;
return(p);
}3.函数voidrevstr(char*s)将字符串s逆置。
例如字符串“abcde”,经过逆置后变为“edcba”。
voidrevstr(char*s)
{char*p,c;
if(s==NULL)return;
p= ;/*p指向字符串s的最后一个有效字符*/
while(s
/*交换并移动指针*/
C=*S;
=*p;
=c;
}
}
4.本程序用古典的Eratosthenes的筛法求从2起到指定范围内的素数。
如果要找出2至10中的素数,开始时筛中有2到10的数,然后取走筛中的最小的数2,宣布它是素数,并把该素数的倍数都取走。
这