计算机等级考试题库,二级C++试题【汇总】

发布于 2019-03-25 10:09  编辑:simi
0
计算机等级考试题库 扫码微信刷题


没有播种,何来收获;没有辛苦,何来成功;没有磨难,何来荣耀;没有挫折,何来辉煌;没有做二级C++试题,何来过关。


二级C++试题.jpg


2019年3月二级C++试题

【1】

1.派生类对象对其基类中的什么成员是可访问的?(  )

A.公有继承的私有成员

B.私有继承的公有成员

C.私有继承的保护成员

D.保护继承的保护成员

 

2.有如下程序:

#included

usingnamespacestd

classA{

public

virtualvoidfuncl(){cout<<"A1";)

voidrune2(){cout<<"A2";}};

classB:publicA{

public

voidfuncl(){cout<<:"B1";}

voidfunc2(){eout<<"B2";}};

intmain(){

A*p=newB

p->func1()

P->func2()

return0;}

执行该程序,屏幕上将显示输出(  )。

A.B1B2

B.A1A2

C.B1A2

D.A1B2

 

3.重载输人流运算符>>必须使用的原型为(  )。

A.istream&operator>>(istream&,<类名>&);

B.istream&operator>>(istream,<类名>);

C.istreamoperator>>(istream,<类名>&);

D.<类名>operator>>(istream&,<类名>&);

 

4.有如下语句序列:

intk=0

do{k+=5;cout<<’$’;}whilc(k<19);

while(k->O)cout<<’*’

执行上面的语句序列输出字符“$”和“*”的个数分别是(  )。

A.4和20

B.5和20

C.4和21

D.5和21

 

5.下列关于模板的说法正确的是(  )。

A.模板的实参在任何时候都可以省略

B.类模板与模板类所指的是同一概念

C.类模板的参数必须是虚拟类型的

D.类模板中的成员函数全部都是模板函数

 

6.有以下程序:

#include

usingnamespacestd

classA

{private

inta

public

A(inti)

{a=i;}

voiddisp()

{cout<  classB

(private

intb

public

B(intj)

{b=j;}

voiddisp()

{cout<  classC:publicB,publicA

{private

intC

public

c(intk):A(k-2),B(k+2)

{c=k

}

voiddisp()

{

a::disp();

B::disp();

COUt<  }

}

intmain()

{

Cobj(10)

obj.disp()

return0

}

程序执行后的输出结果是(  )。

A.10,10,10

B.10,12,14

C.8,10,12

D.8,12,10

 

7.下列程序的输出结果是(  )。#include

voidmain()

(char*str="12123434"

intx1=0,x2=0,x3=0,x4=0,i;

for(i=0;str[i]!=’\0’;i++)

switch(str[i])

{case’1’:x4++;

case’2’:x3++;

case’3’:x2++;

case’4’:x1++;

}

cout<  <","<  }

A.8,6,4,1

B.8,6,3,2

C.8,8,4,1

D.8,6.4,2

 

8.以下不能正确创建输出文件对黎并使其与磁盘文件相关联的语句是(  )。

A.ofstreammyfile;myfile.open("d:ofile.txt");

B.ofstream*myfile=newofstream;myfile->open("d:ofile.txt”);

C.ofstreammyfile("d:ofile.txt");

D.ofstream*myfile=new("d:ofile.txt");

 

9.以下类定义中可能会引起错误的语句是(  )。

classA

{

public

~A(  ){}//1

inti;//2

private

intj;//3

A(inti){i++;}//4

}

A.1

B.2

C.3

D.4

 

10.有如下程序:

#include

usingnamespacestd

classTestClass

{public

virtualvoidfunl()

{cout<<"funlTestClass";}

virtualvoidfun2()

{cout<<“fun2TestClass”;}};

classTestClassl:publicTestClass

{voidfun()

{cout<<“funlTestClassl”;}};

intmain()

{TestClassobj1,*P;

TestClasslobj2

p=&obj2

p->fun1()

p->fun2()

return0;}

该程序执行后的输出结果是(  )。

A.funlTestClasslfun2TestClass

B.funlTestClass1fun2TestC1ass1

C.funlTestClassfun2TestClass

D.funlTestClassfun2TestClassl

 

1.B。【解析】本题考查关于C++语言继承问题中派生类对基类的访问。C++语言中通常有三种继承修饰符,即public、protected、private,限制依次严格,另外对类中的数据和函数也由这三种修饰符进行限制,有三种成员是不能继承的:公有继承基类的私有成员,私有继承基类的私有成员,保护继承基类的私有成员。

 

2.C。【解析】程序中B为A的派生类,由主函数入手,主函数中定义了类A的指针P指向类B。根据基类中的“virtualvoidfuncl()”知道A中的funcl为虚函数,执行“P->fund();”语句,通过指针变量调用此虚函数,此时调用的就是指针变量指向的同名函数,即派生类的fund函数,输出B1。而fun2不是虚函数,所以执行“p->func2();”输出为A2。

 

3.A。【解析】C++流的输入运算符“>>”和输出运算符“<<”只能作为非成员函数重载。重载输入流运算符“>>”须使用的原型是istream&operator>>(istream&,<类名>&);。

 

4.A。【解析】本题首先执行语句do{k+=5;cout<<’$’;}while(k<19);,循环执行4次;全了4个“$”,k的值变为20;然后执行语句while(k-->0)cout<<’*’;,所以会输出20个“*”。

 

5.D。【解析】在C++中规定如果一个类被声明为类模板,那么其中的所有成员函数就都成为了模板函数。

 

6.D。【解析】本题中,派生类C具有多重继承关系,所以在派生类C的构造函数中应该包含基类A和类B的成员初始化列表。

 

7.D。【解析】本题考查循环的嵌套、for和switch语句的应用、C++中各种条件判断,循环语句的用法。只要注意在C++语言中,系统在字符指针的最后位置会增加一个字符串结束符’\0’,执行8次for循环,再根据switch语句中的条件易知答案。

 

8.D。【解析】本题考查文件对象的创建方法。可以直接定义文件对象,也可以用new来动态生成。很明显,选项D中使用new的方式是错误的。

 

9.D。【解析】本题考查关于C++语言类的定义方法。在C++语言中类定义中的构造函数是私有的,但是却调用了其中的公有变量,在实例化时会斟现错误。

 

10.A。【解析】TestClass为基类,TestClass1是TestClass的派生类。基类中的funl和fun2被定义为虚函数,C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数,所以派生类中的funl和fun2也是虚函数。本题从main主函数入手,首先定义了TestClass类型的

对象obil和指针P,然后又定义了TestClassl的对象obj2。指针指向对象obj2,然后调用其成员函数fun1(),即输出“funlTestClassl”。

 

 

【2】

1.有如下程序:

#included

usingnamespqcestd

classTestClass

{

private

charC

public

TestClass(charn):c(n){}

~TestClass()

{

cout<  }

}

classTestClassl:publicTestClass

{

private

charC

public

TestClassl(charn):TestClass(n+1),c(n){}~TestClassl()

{

cout<  }

}

intmain()

{

TestClasslobj(’X’)

return0

}

执行上面的程序将输出(  )。

A.xy

B.yx

C.X

D.y

 

2.有如下程序:

#include

usingnamespacestd

classBase

{

public

Base(){cout<<"BB";f();}

voidf(){cout<<"BF";}

}

classDerived:publicBase

{

public

Derived(){cout<<"DD";}

voidf(){eout<<"Df";}

}

intmain(){Derivedd;return0;}

执行上面的程序将输出(  )。

A.BBBfDD

B.BBDfDDDf

C.DD

D.DDBBBf

 

3.已知枚举类型定义语句为

enHmToken{NAME,NUMBER,PLUS=5,MINUS,PRINT=10};

则下列叙述中错误的是(  )。

A.枚举常量NAME的值为1

B.枚举常量NUMBER的值为1

C.枚举常量MINUS的值为6

D.枚举常量PRINT的值为10

 

4.有如下程序:

#include

usingnamespacestd

classBASE{

public

~BASE(){cout<<"BASE";}

}

classDERIVED:publicBASE{

public

~DERIVED(){cout<<"DERIVED";}

}

intmain(){DERIVEDx;return0;)

执行后的输出结果是(  )。

A.BASE

B.DERlVED

C.BASEDERIVED

D.DERlVEDBASE

 

5.有如下程序:

#include

usingnamespacestd

classTest

{

public

Test(){n+=2;}

~Test(){n-=3;}

staticintgetNum(){returnn;}

private

staticintn

}

intTest::n=1;

intmain()

{

Test*p=neWTest

deletep

cout<<"n="<  return0;

}

执行该程序的输出结果是(  )。

A.n=0

B.n=1

C.n=2

D.n=3

 

6.下列关于纯虚函数与抽象类的描述中,错误的是(  )。

A.纯虚函数是一种特殊的虚函数,它没有具体的实现

B.抽象类是指具有纯虚函数的类

C.一个基类声明了纯虚函数,该基类的派生类一定不是抽象类

D.抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出

 

7.以下程序的输出结果是(  )。

#include

longfun(intn)

{longS

if(n==1‖n==2)s=2;

elses=n-fun(n-1)

returnS

}

voidmain(){cout<  A.1

B.2

C.3

D.4

 

8.对于模板定义关键字class和typename说法不正确的是(  )。

A.程序中的class并不能都替换为typename

B.class和typename都可互相替换

C.程序中的typename都能替换为class

D.程序中的部分class可以替换为typename

 

9.有如下程序:

#include

usingnamespacestd

classCon

charID

public

Con():ID(’A){cout<<1;}

Con(charID):ID(ID){eout<<2;}

Con(Con&c):ID(c.getID()){cout<<3;}

chargetID()corlst{returnID;}

}

voidshow(Conc)(cout<  intmain()

{

Conc1

show(c1)

Conc2(’B’)

show(c2)

return0

}

执行上面程序的输出是(  )。

A.13A23A

B.23A13B

C.13A23B

D.13823A

 

10.对于类定义:

classA{

public

virtualvoidfuncl(){}

voidfunc2(){}

}

classB:publicA{

public

voidfuncl(){cout<<"classBfunc1"<  virtualvoidfunc2(){cout<<"classBfunc2"

<  };

下面正确的叙述是(  )。

A.A::func2(  )和B::func1(  )都赵虚函数

B.A::rune2(  )和B::func1(  )都不是虚函数

C.B::func1(  )是虚函数,而A::fune2(  )不是虚函数

D.B::func1(  )不是虚函数,而A::func2(  )是虚函数

 

 

1.A。【解析】本题中FestClass为基类,TestClass1为派生类。在主函数中定义TestClassl对象obj(’x’),“TestClassl(charn):TestClass(n+1),c(n){}”,所以输出x,然后调用基类构造函数,’x’+1=’y’,所以输出y,即答案为xy。

 

2.A。【解析】本题考查类的继承和派生。派生类执行构造函数的一般次序为:首先调用基类构造函数;然后调用成员对象的构造函数;最后是派生类构造函数中的内容。题目中定义派生类对象d时,先调用基类Base的构造函数,输出BBBf,然后调用派生类Derived的构造函数,输出DD。

 

3.A。【解析】本题考查C++语言的数据类型。第一个枚举常量的值为0;允许程序显示的定义中指定部分或全部枚举常量的值,枚举常量默认时。在前一枚举常量值的基础上以此增1。

 

4.D。【解析】本题考查派生类的定义和使用。当对象被删除时,派生类的析构函数就被执行。由于析构函数不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用。执行顺序是先执行派生类的析构函数,再执行基类的析构函数,其顺序与执行构造函数的顺序正好相反。所以当main函数结束时,派生类DERIVED的对象X将被删除,那么派生类DERIVED的析构函数先被调用,输出DERIVED,然后调用基类的析构函数输出BASE。

 

5.A。【解析】本题考查静态数据成员和静态成员函数。静态数据成员是类中所有对象共事的成员,而不是某个对象的成员。题目中的静态数据成员n的运算具有叠加性,执行“n+=2”和“n-=3”后n的值为0。

 

6.C。【解析】纯虚函数是在声明虚函数时被“初始化”为0的虚函数。不定义对象而只作为一种基本类型作为继承的类,称为抽象类。凡是包含纯虚函数的类都是抽象类。抽象类的作用是作为一个类族的共同基类。

 

7.A。【解析】题中fun函数进行了递归调用,第1次调用对:fun(3)n=3,S=3-fun(2),第二次调用时:fun(2)n=2,s=2,返回第一次调用后,s=3-2=1。

 

8.B。【解析】在C++程序中,typename是可以替换为class的,但class不能都替换为typename。

 

9.C。【解析】Eonc1定义c1对象,调用Con的无参数构造函数,输出1,ID值变为A,执行show(c1)时会调用复制构造函数,将c1对象的值复制给show函数的形参,此时输出3,然后在show()中输出c1的ID值A,Conc2(’B’)定义c2对象,调用Con(charID)构造函数,输出2,c2的ID值为B,show(c2)执行时先调用复制构造函数输出3,然后输出B。因此程序输出结果为“13A238”。

 

10.C。【解析】基类中说明的虚函数,在派生类中自然就是虚函数,所以类B中funcl()是虚函数;而类A中的func2()没有被关键字virtual修饰;所以不是虚函数。

 

 

 

【3】

程序改错题(18分)

使用VC++6.0打开考生文件夹下的源程序文件1.cpp,该程序运行时有错,请改正程序中的错误,使程序输出的结果为

m=-10

n=-1O

p一0

q=-10

z=A

注意:错误的语句在//******error******的下面,修改该语句即可。

试题程序:

#include

voidmain()

{

doublem=10

floatn=10

boolp=1

intq=10

charz=’a’:

m=-m

//******error******

n=~n;

//******error******

P=-P

//******error******

q=~q:

z=z-32

cout<<"m="<  cout<<"n="<  cout<<"p="

 

程序改错题答案解析:

(1)“n=-n;”。

(2)“p=!p;”。

(3)“q=-q;”。

【解析】由题目要求的运行结果可知,第1个标识和第3处的语句是对变量n和q取反,求一个正数的相反数可以通过算数运算符“-”得到,第1处和第3处的语句应分别改为“n=-n;”和“q=-q;”,即只需要通过负号运算就可以实现。从题目要求输出的结果来分析,第2处的语句是对逻辑变量P取反,对一个逻辑变量求反,应该用取反运算符“!”,第2处的语句应改为“p=!P;”。

 

 

【4】

简单应用题(24分)

使用VC6打开考生文件夹下的源程序文件2.cpp。阅读下列函数说明和代码,补充空出的代码。函数sum(intn)返回1,2,3,…,n的和。其中n大于0。

程序要求使用递归实现上述功能。

注意:不能修改程序的其他部分,只能补充sum函数。

试题程序:

#include

#include

intsum(intn)

{

}

voidmain()

{

cout<<"1+2+3+…+100="<  endl;

return

}

三、简单应用题(24分)

使用VC6打开考生文件夹下的源程序文件2.cpp。阅读下列函数说明和代码,补充空出的代码。函数sum(intn)返回1,2,3,…,n的和。其中n大于0。

程序要求使用递归实现上述功能。

注意:不能修改程序的其他部分,只能补充sum函数。

试题程序:

#include

#include

intsum(intn)

{

}

voidmain()

{

cout<<"1+2+3+…+100="<  endl;

return

}

简单应用题答案解析:

return(n==1)?1:n+sum(n-1);

【解析】本题主要考查三目运算符?:的使用和递归函数的编制。程序功能是计算前n个自然数的和,n为参数。程序的运算过程如下,不是一般性,假设n为3,首先执行sum(3),因为3不等于1,所以return语句返回的值为3+sum(3-1),然后执行sum(3-1)即sum(2),2不等于1,所以return语句返回的值为2+sum(2-1),然后执行sum(2-1)即sum(1),因为1等于1,所以return语句返回的值为1,即问号后的值,所以最终结果为3+2+1=6,而题中n为100,所以结果为5050。

 

 

【5】

综合应用题(18分)

使用VC++6.0打开考生文件夹下的源程序文件3.cpp,其中定义了用于表示矩形的CRect类,但类CRect的定义并不完整。请按要求完成下列操作,将类CRect的定义补充完整。

(1)定义私有数据成员leftPoint、topPoint、rightPoint、bottomPoint,分别用于表示矩形左上角及右下角的点的坐标,它们都是double型的数据。请在注释1之后添加适当的语句。

(2)完成默认构造函数CRect的定义,指定默认实参为0,它们都是double型的数据。请在注释2之后添加适当的语句。

(3)定义函数体为空的析构函数。请在注释3之后添加适当的语句。

(4)在main函数中定义GReet类的实例rect2,并把re-

ct1的值赋给rect2。请在注释4之后添加适当的语句。

注意:除在指定位置添加语句之外,不要改动程序中的其他内容。

试题程序:

#include

classCRect

{

private

//********1********

public

//********2********

//********3********

voidSetPoints(double,double,double,double);

voidSetLeftPoint(doublem){leftPoint=m;}

voidSetRightPoint(doublem){rightPoint=m;}

voidSetTopPoint(doublem){topPoint=m;}

voidSetBottomPoint(doublem){bottomPoint=m;}

voidDisplay()

}

CReet::CRect(double1,doublet,doubler,doubleb)

{

leftPoint=1;topPoint=t;

rightPoint=r;bottomPoint=b;

}

voidCRect::Setpoints(double1,doublet,doubler,doubleb)

{

leftPoint=1;topPoint=t;

rightPoint=n;bottomPoint=b;

}

voidCRect::Display()

{

cout<<"left-toppointis("<  Point<<")"<<’\n’;

cout<<"right-bottompointis("<  <  }

voidmain()

{

CRectrect0

rect0.Display()

rect0.SetPoints(20,20.6,30,40);

rect0.Display()

CRectrectl(0,0,150,150);

rect1.SetTopPoint(10.5)

rect1.SetLeftPoint(10.5)

//********4********

rect2.Display(  );}

 

综合应用题答案解析:

(1)应添加“doubleleftPoint,topPoint,rightPoint,hot-tomPoint;”。

(2)应添加“CReet(doubleleftPoint=0,doubletopPoint=0,doublerightPoint=0,doublebottomPoint=O);”。

(3)应添加“~CReet(){}”。

(4)应添加“CReetrect2(rect1);”。

【解析】本题在第1处完成私有数据成员leftPoint、top-Point、rightPoint、bottomPoint的定义,均为double型的变量,故第1处应添加“doubleleftPoint,topPoint,rightPoint,bottomPoint;”。构造函数完成成员变量的初始化,类CRect的默认构造函数初始化double型私有数据成员leftPoint、topPoint、rightPoint、bottomPoint为0。故第2处应添加“CRect(doubleleftPoint=0,doubletopPoint=0,doublerightPoint=0,doublebottomPoint=0);”。析构函数名和类名一致,并在前面加“~”以和构造函数区别,该析构幽数体为空,故第3处应添加“~CRect(){}”,虽然该函数体为空,但“{}”必须保留。主函数中类CRect的对象rect2是通过复制构造函数将rect1的值赋值给它实现初始化的.而reet1的初始化直接调用自定义构造函数,第4处应添加“CReetrect2(rect1);”。



考无忧小编提醒您:

现在距离计算机等级考试只剩下5天了,再不努力刷计算机等级考试题库

3月份的考试,你一定会仓促应对,而考试结果也将不尽人意!赶紧把以上的二级C++试题刷起来吧!



文章推荐:

全国计算机等级考试可以不考一级直接考二级吗?

2019年全国计算机等级考试题库“二级MS Office 高级应用考试大纲”

全国计算机等级考试报考成功后可以退费吗?(内附计算机等级考试题库)


温馨提示:

考试想拿高分吗?更多计算机等级考试题库二级ms office试题请点击查看>>>二级ms office

想要了解更多的计算机等级考试题库请点击下载>>>计算机等级考试题库

想知道更多关于计算机等级考试题库的最新资讯吗?点击进入>>>计算机等级考试题库资讯


本文网址:http://www.k51.com.cn/info/jsjdjks/1903/2550657.html
选择分享到: