计算机等级 > 二级考试 > C++语言程序设计 > C++模拟试题 > 文章内容

全国计算机二级考试C++考前押密试卷(7)

2017-9-5编辑:daibenhua

  一、选择题(每小题1分,共40小题,共40分)

  1.在计算机中,算法是指(  )。

  A.查询方法

  B.加工方法

  C.解题方案的准确而完整的描述

  D.排序方法

  2.下列叙述中,不属于测试的特征的是(  )。

  A.测试的挑剔性

  B.完全测试的不可能性

  C.测试的可靠性

  D.测试的经济性

  3.数据处理的最小单位是(  )。

  A.数据

  B.数据元素

  C.数据项

  D.数据结构

  4.已知一个有序线性表为(13,18,24,35,47,50,62,83,90,115,134),当用二分法查找值为90的元素时,查找成功的比较次数为(  )。

  A.1

  B.2

  C.3

  D.9

  5.下列对于软件测试的描述正确的是(  )。

  A.软件测试的目的是证明程序是否正确

  B.软件测试的目的是使程序运行结果正确

  C.软件测试的目的是尽可能地多发现程序中的错误

  D.软件测试的目的是使程序符合结构化原则

  6.下列选项中,不是一个算法的基本特征的是(  )。

  A.完整性

  B.可行性

  C.有穷性

  D.拥有有足够的情报

  7.下列选项中不属于结构化程序设计方法的是(  )。

  A.自顶向下

  B.逐步求精

  C.模块化

  D.司复用

  8.下列不是软件工程基本目标的照(  )。

  A.付出较低的维护费用

  B.达到要求的功能

  C.不管时间限制,只要最终把用户要求的产品交出来

  D.产品的性能比较好

  9.以三级模式为框架形成的三种数据库中,真实存在于计算机外存的数据库是(  )。

  A.概念数据库

  B.用户数据库

  C.物理数据库

  D.逻辑数据库

  10.数据库DB、数据库系统DBS、数据库管理系统DBMS之间的关系是(  )。

  A.DB包括DBS和DBMS

  B.DBMS包括DB和DBS

  C.DBS包括DB和DBMS

  D.没有任务关系

  11.下列符号中可以用做C++标识符的是(  )。

  A._radius

  B.foo~bar

  C.else

  D.3room

  12.类模板的使用实际上是将类模板实例化成一个具体的(  )。

  A.类

  B.对象

  C.函数

  D.模扳类

  13.下列有关类继承的叙述中,错误的是(  )。

  A.继承可以实现软件复用

  B.虚基类可以解决由多继承产生的二义性问题

  C.派生类构造函数要负责调用基类的构造函数

  D.派生类没有继承基类的私有成员

  14.若有以下定义:

  inta[]={1,2,3,4,5,6,7};

  charc1=’b’,c2=’2’;

  则数值不为2的表达式是(  )。

  A.a[1]

  B.’d’c1

  C.a[’3’-c2]

  D.c2-0

  15.已知intm=10;在下列定义引用的语句中,正确的是(  )。

  A.int&x=m;

  B.inty=&m;

  C.int&z;

  D.int&t=&m;

  16.针对数组定义intdata[10];,下列表述中错误的是(  )。

  A.用*data可访问到数组的首元素

  B.用data[9]可访问到数组的末元素

  C.用data[10]访问数组元素会超出数组边界

  D.data共有10个元素,其首元素是data[1]

  17.设有定义:

  classperson

  {inthum;

  charname[10];

  public:

  voidinit(intn,char*m);

  };

  personstd[30]

  则以下叙述不正确的是(  )。

  A.std是一个含有30个元素的对象数组

  B.std数组中的每个元素都是person类的对象

  C.std数组中的每个元素都有自己的私有变量num和name

  D.std数组中的每个元素都有各自的成员函数init

  18.若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是(  )。

  A.函数调用可以作为独立的语句存在

  B.函数调用可以无返回值

  C.函数调用可以出现在表达式中

  D.函数调用可以作为一个函数的形参

  19.已知Value是一个类,Value是Value的一个对象。

  下列以非成员函数形式重载的运算符函数原形中,正确的是(  )。

  A.Valueoperator+(Valuev,inti);

  B.Valueoperator+(Valuev=value,inti);

  C.Valueoperator+(Valuevinti=O);

  D.Valueoperator+(Valuev=value,inti=O);

  20.下列关于运算符重载不正确的是(  )。

  A.运算符重载不能改变运算符的操作数个数

  B.运算符重载不能改变运算符的优先级

  C.运算符重载不能改变运算符的结合性

  D.运算符重载能改变对预定义类型数据的操作方式

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

  A.公有继承的私有成员

  B.私有继承的公有成员

  C.私有继承的保护成员

  D.保护继承的保护成员

  22.有如下程序:

  #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

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

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

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

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

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

  24.有如下语句序列:

  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

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

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

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

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

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

  26.有以下程序:

  #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

  27.下列程序的输出结果是(  )。#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

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

  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");

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

  classA

  {

  public:

  ~A(  ){}//1

  inti;//2

  private:

  intj;//3

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

  };

  A.1

  B.2

  C.3

  D.4

  30.有如下程序:

  #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

  31.有如下程序:

  #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

  32.有如下程序:

  #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

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

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

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

  A.枚举常量NAME的值为1

  B.枚举常量NUMBER的值为1

  C.枚举常量MINUS的值为6

  D.枚举常量PRINT的值为10

  34.有如下程序:

  #include

  usingnamespacestd;

  classBASE{

  public:

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

  };

  classDERIVED:publicBASE{

  public:

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

  };

  intmain(){DERIVEDx;return0;)

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

  A.BASE

  B.DERlVED

  C.BASEDERIVED

  D.DERlVEDBASE

  35.有如下程序:

  #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

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

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

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

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

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

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

  #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

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

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

  B.class和typename都可互相替换

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

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

  39.有如下程序:

  #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

  40.对于类定义:

  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(  )是虚函数

  二、程序改错题(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="

  三、简单应用题(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;

  }

  四、综合应用题(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.C。【解析】计算机算法是指解题方案的准确而完整的描述,它的基本特征分别是:可行性、确定性、有穷性和拥有足够的情报。

  2.C。【解析】软件测试的目标是在精心控制的环境下执行程序,以发现程序中的错误,给出程序可靠性的鉴定。软件测试有三个重要特征:测试的挑剔性、完全测试的不可能性及测试的经济性。没有测试的可靠性这一说法。

  3.C。【解析】数据处理的最小单位是数据项。

  4.B。【解析】根据二分法查找法需要两次:(1)首先将90与表中间的元素50进行比较,由于90大于50,所以在线性表的后半部分查找。(2)第二次比较的元素是后半部分的中间元素,即90,这时两者相等,即查找成功。

  5.C。【解析】软件测试是为了尽可能多地发现程序中的错误,尤其是发现至今尚未发现的错误。

  6.A。【解析】作为一个算法,一般应该具有下列四个特征:①可行性,即考虑到实际的条件能够达到一个满意的结果;②确定性,算法中的每一个步骤都必须是有明确定义的;③有穷性,一个算法必须在有限的时间内完成;④拥有足够的情报。

  7.D。【解析】可复用属于面向对象程序设计方法,其他选项属于结构化程序设计方法。

  8.C。【解析】软件工程的基本目标是:付出较低的开发成本;达到要求的软件功能;取得较好的软件性能;开发的软件易于移值;需要较低的维护费用;能按时完成开发,及时交付使用。

  9.C。【解析】以概念模式为框深所组成的数据称为概念数据库;以外模式为框架所组成的数据库称为用户数据库;以内模式为框架所组成的数据库称为物理数据库。这三种数据库只有物理数据库是真实存在于计算机外存中。

  10.C。【解析】数据库系统(DBS)由数据库(DBS)、数据库管理系统(DBMS)、数据库管理员、硬件平台和软件平台五个部分组成,可见DB和DBMS都是DBS的组成部分。

  11.A。【解析】本题考查的是标识符。标识符由数字、字母以及下画线构成。其第一个字符必须是字母或下画线,中间不能有空格;标识符的长度是任意的,但由于编译系统的限制一般不超过31个字符;标识符中的大小写字母是不同的;定义标识符时不能采用系统的保留字。

  12.A。【解析】类模板就是把畿中的数据分离出来,作为一个类的描述。C++编译器根据类模板和特定的数据类型来产生一个类,类模板就是一个抽象的类。

  13.D。【解析】本题考查类继承。派生类继承了基类的全部数据成员和私有成员,只是基类的私有成员在派生类中是隐藏的,只能在基类内部访问。

  14.D。【解析】字符在进行数学运算时取其ASCⅡ码值,其中’b’的ASCⅡ码值为98,‘d’的ASCⅡ码值为100,字符’2’的ASCⅡ码值为50。可知D选项中表达式c2-0的值为50。

  15.A。【解析】C++的引用是一种赋值、发送和返回复杂数据结构的方法,建立引用的格式为:类型-引用名=已定义的变量名。所以只有A选项是符合要求的。

  16.D。【解析】数组元素的下标是从0到<数组长度>-1,所以数组data的首元素是data[0],尾元素是data[9]。其他选项的描述都是正确的。

  17.D。【解析】std是对象数组。里面有30个对象,每个对象都有自己的私有数据成员,由于成员函数是公有的,在内存中存在一份即可,各个对象都可以使用。

  18.D。【解析】本题考查函数的调用方式。函数的形参和实参具有以下特点:①形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放分配的内存单元,因此,形参只有在函数内部有效,函数调用结束返回主调函数后则不能再使用该形参变量;②实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参,因此应通过预先用赋值、输入等办法使实参获得确定值;③实参和形参在数量上、类型上、顺序上应严格一致,否则会发生“类型不匹配”的错误;④函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

  19.B。【解析】非成员函数的重载运算符函数的格式为operator+(),是运算符+重载函数。

  20.D。【解析】本题考查C++语言中操作符重载的概念。运算符重载的关键字是operator。运算符重载的规则是重载时不能改变运算符的操作数个数,不能改变运算符的优先级,不能改变运算符的结合性,不能改变对预定义类型数据的操作方式。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  39.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”。

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

  二、程序改错题

  (1)“n=-n;”。

  (2)“p=!p;”。

  (3)“q=-q;”。

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

  三、简单应用题

  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。

  四、综合应用题

  (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);”。

全国计算机二级考试C++考前押密试卷(6)

热点推荐

登录注册
触屏版电脑版网站地图