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

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

2017-8-25编辑:daibenhua

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

  1.设计程序时,应采纳的原则之一是(  )。

  A.程序的结构应有助于读者的理解

  B.限制goto语句的使用

  C.减少或取消注释行

  D.程序越短越好

  2.需求分析阶段的任务是确定(  )。

  A.软件开发方法

  B.软件开发工具

  C.软件开发费用

  D.软件系统功能

  3.结构化分析方法是面向(  )的自顶向下、逐步求精进行需求分析的方法。

  A.对象

  B.数据结构

  C.数据流

  D.目标

  4.下列叙述中,不属于软件需求规格说明书的作用的是(  )。

  A.便于用户、开发人员进行理解和交流

  B.反映出用户问题的结构,可以作为软件开发工作的基础和依据

  C.作为确认测试和验收的依据

  D.便于开发人员进行需求分析

  5.对下列二叉树

  

  进行中序遍历的结果是(  )。

  A.ACBDFEG

  B.ACBDFGE

  C.ABDCGEF

  D.FCADBEG

  6.SQL语言又称为(  )。

  A.结构化定义语言

  B.结构化控制语言

  C.结构化查询语苦

  D.结构化操纵语言

  7.下列叙述中正确的是(  )。

  A.线性链表的各元素在存储空间中的位置必须是连续的

  B.线性链表的头元素一定存储在其他元素的前面

  C.线性链表中的各元素在存储空间中的位置不一定是连续的,但表头元素一定存储在其他元素的前面

  D.线性链表中的各元素在存储空间中的位置不一定是连续的,且各元素的存储顺序也是任意的

  8.有下列二叉树,对此二叉树中序遍历的结果县(  )。

  

  A.BDYEACFXZ

  B.DYBEAFCZX

  C.ABCDEFXYZ

  D.ABDYECFXZ

  9.最简单的交换排序方法是(  )。

  A.快速排序

  B.选择排序

  C.堆排序

  D.冒泡排序

  10.数据库设计包括两个疗面的设计内容,他们是(  )。

  A.概念设计和逻辑设计

  B.模式设计和内模式设计

  C.内模式设计和物理设计

  D.结构特性设计和行为特性设计

  11.下列关于类和对象的叙述中,错误的是(  )。

  A.一个类只能有一个对象

  B.对象是类的具体实例

  C.类是对某一类对象的抽象

  D.类和对象的关系是一种数据类型与变量的关系

  12.在函数中,可以用aut0、extern、register和static这四个关键字中的一个来说明变量的存储类型,如果不说明存储类型,则默认的存储类型是(  )。

  A.auto

  B.extern

  C.register

  D.static

  13.若变量已正确定义并赋值,以下符合C++语言语法的表达式是(  )。

  A.a:=b+1

  B.a=b=c+2

  C.intl8.5%3

  D.a=a+7=c+b

  14.以下叙述中正确的是(  )。

  A.构成C++语言程序的基本单位是类

  B.可以在一个函数中定义另一个函数

  C.main()函数必须放在其他函数之前

  D.所有被调用的函数一定要在调用之前进行定义

  15.定义如下枚举类型enum{Monday,Tuesday,Wednesday,Thrusday,Friday=2};则下列选项正确的是(  )。

  A.表达式Wednesday==Friday的值是true

  B.Dayday;day=3;

  C.Dayday;day=Monday+3;

  D.Daydayday=Tuesday+10;

  16.下列有关模板的叙述中,正确的是(  )。

  A.函数模板不能含有常规形参

  B.函数模板的一个实例就是一个函数定义

  C.类模板的成员函数不能是模板函数

  D.用类模板定义对象时,绝对不能省略模板实参

  17.下列运算符函数中肯定不属于类FunNumber的成员函数的是(  )。

  A.intoperator-(FunNumber);

  B.FunNumberoperator-();

  C.FunNumberoperator-(int);

  D.intoperator-(FunNumber,FunNumber);

  18.下列各组类型声明符中,含义相同的一组是(  )。

  A.unsignedlongint和long

  B.signedshort和short

  C.unsignedshort和short

  D.shortint和int

  19.关于纯虚函数,下列表述中正确的是(  )。

  A.纯虚函数是没有给出实现版本(即无函数体定义)的虚函数

  B.纯虚函数的声明总是以“=0”结束

  C.派生类必须实现基类的纯虚函数

  D.含有纯虚函数的类不可能是派生类

  20.若已定义:

  inta[]={0,1,2,3,4,5,6,7,8,9},*p=a,i;其中0≤i≤9,则对a数组元素不正确的引用是(  )。

  A.a[p-a]

  B.*(&a[i])

  C.p[i]

  D.a[10]

  21.派生类的成员函数不能访问基类的(  )。

  A.公有成员和保护成员

  B.公有成员

  C.私有成员

  D.保护成员

  22.函数定义为Fun(int&i),变量定义n=100,则下面调用正确的是(  )。

  A.Fun(20);

  B.Fun(20+n);

  C.Fun(n);

  D.Fun(&n);

  23.有如下四个语句:

  ①cout<<’A’<  ②cout<  ③cout<<’A’<  ④cout<  其中能显示A******B的是(  )。

  A.①和③

  B.①和④

  C.②和③

  D.②和④

  24.下列关于运算符重载的描述中,正确的是(  )。

  A.运算符重载为成员函数时,若参数表中无参数,重载的是一元运算符

  B.一元运算符只能作为成员函数重载

  C.二元运算符重载为非成员函数时,参数表中有一个参数

  D.C++中可以重载所有的运算符

  25.有如下的程序:

  #include

  #include

  usingnamespacestd;

  classMyString

  {public:

  MyString(constchar*s);

  MyString(){delete[]data;}

  protected:

  unsignedlem

  char*data;};

  MyStrin9::MyString(constchar*s)

  {len=strlen(s);

  data=newchar[len+1];

  strcpy(data,s);}

  intmain()

  {MyStringa("C++Programing");

  MyStringb(a);

  return0;}

  在运行上面的程序时出错,出错的原因是(  )。

  A.构造函数的实参不允许是本类的对象

  B.没有定义实现深层复制的复制构造函数

  C.构造对象a时实参与形参类型不符

  D.系统不能生成默认的复制构造函数

  26.有如下程序:

  #include

  usingnamespacestd;

  classMyClass{

  public:

  MyClass(){++count;)

  ~MyClass(){--count;)

  staticintgetCount(){returncount;}

  private:

  staticintcount;

  };

  intMyClass::count=0;

  intmain(){

  MyClassobj;

  cout<  MyClass*ptr=newMyClass;

  cout<  deleteptr;

  cout<  return0;

  }

  程序的输出结果是(  )。

  A.121

  B.232

  C.221

  D.122

  27.有如下程序:

  #include

  usingnamespacestd;

  classVAC{

  public;

  intf()const(return3;}

  intf(){return5;}

  };

  Intmain(){

  VACv1:

  constVACv2;

  cout<  return0;

  }

  运行时的输出结果是()。

  A.53

  B.35

  C.55

  D.33

  28.下列程序中横线处应填入的语句是()。

  classBase

  {

  public:

  voidfun(){cout<<"Baseoffun"<  classDerived:publicBase

  {

  voidfun()

  {

  //显示基类的成员函数fun

  cout<<"Derivedoffun"<  }

  };

  A.fun();

  B.Base.fun();

  C.Base::fun();

  D.Base->fun();

  29.有以下程序:

  #include

  usingnamespacestd;

  classsample

  {

  private:

  intn;

  public:

  sample(){}

  sample(intm)

  {

  n=m:

  }

  sampleadd(samplesl,samples2)

  {

  this->n=s1.n+s2.n;

  return(*this);

  }

  voiddisp()

  {

  cout<<"n="<  }

  };

  intmain()

  {

  samples1(10),s2(5),s3;

  s3.add(s1,s2);

  s3.disp();

  return0:

  }

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

  A.n=10

  B.n=5

  C.n=20

  D.n=15

  30.有如下函数模板定义:

  templateT2plus(T1t1,T3t3){returnt1+t3;}

  则以下调用正确的是(  )。

  A.plus(3,5L);

  B.plus<>(3,5L);

  C.plus(3,5L);

  D.plus(3,5L);

  31.有以下程序;

  #include

  usingnamespacestd;

  classComplex

  {

  public:

  Complex(doubler=0,doublei=O):re(r),im(i){}

  doublereal()const{returnre;}

  doubleimag()const{returnim;}

  Complexoperator+(Complexc)const

  {returnComplex(re+C.re,im+C.im);}

  private:

  doublere,im;

  };

  intmain()

  {

  Complexa=Complex(1,1)+Complex(5);

  cout<  return0;

  }

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

  A.6+6i

  B.6+1i

  C.1+6i

  D.1+1i

  32.有如下程序:

  #include

  usingnamespacestd;

  classBase{

  public:

  Base(intx=O){cout<  };

  classDerived:publicBase{

  public:

  Derived(intx=O){cout<

  private:

  Baseval;

  };

  intmain(){

  Derivedd(1);

  return0;

  }

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

  A.100

  B.000

  C.010

  D.001

  33.有如下程序:

  #include

  usingnamespacestd;

  classB{

  public:

  virtualvoidshow(){cout<<"B";}};

  classD:publicB{

  public:

  voidshow(){cout<<"D";}

  };

  voidfun1(B*ptr){ptr->show();

  }voidfun2(B&ref){ref.show();

  }voidfun3(BB){b.show();

  }

  intmain(){

  Bb,*p=newD;

  Dd;

  funl(p);

  fun2(b);

  fun3(d);

  return0;

  }

  程序的输出结果是(  )。

  A.BBB

  B.BBD

  C.DBB

  D.DBD

  34.下面程序的输出结果是(  )。#include

  #include

  voidmain()

  {

  charp1[10],p2[10];

  strcpy(p1,"abc");

  strcpy(p2,"ABC");

  charstr[50]="xyz":

  strcpy(str+2,strcat(p1,p2));

  cout<  }

  A.xyzabcABC

  B.zabcABC

  C.xyabcABC

  D.yzabcABC

  35.有以下结构体说明和变量的定义,且指针P指向变

  量a,指针q指向变量b。则不能把结点b连接到结点a之后的语句是(  )。

  structnode

  {chardata;

  structnode*next;

  }a,b,*p=&a,*q=&b;

  A.a.next=q;

  B.P.next=&b;

  C.p->next=&b;

  D.(*p).next=q;

  36.设有程序段:

  intk=10。

  while(k=O)k=k-1;

  则下面描述中正确的是(  )。

  A.循环执行10次

  B.无限循环

  C.循环体语句一次也不执行

  D.循环体语句执行一次

  37.有如下程序:

  #include

  usingnamespacestd;

  classA

  {

  public:

  A(){cout<<"A";}

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

  };

  classB

  {

  A*P:

  public:

  B(){cout<<"B";p=newA;}

  ~B(){cout<<"~B";deleteP;}

  };

  intmain()

  {

  Bobi;

  return0;

  }

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

  A.BAA~A~B~A

  B.ABA~B~A~A

  C.BAA~B~A~A

  D.ABA~A~B~A

  38.C++语言类体系中,不能被派生类继承的有(  )。

  A.转换函数

  B.构造函数

  C.虚函数

  D.静态成员函数

  39.下面程序的运行结果是(  )。

  #include

  classbase{

  protected:

  inta;

  public:

  base(){cout<<"0";}

  };

  classbasel:virtualbase{

  public:

  basel(){cout<<"1";}

  };

  classbase2:virtualbase{

  public:

  base2(){cout<<"2";}

  };

  classderived:publicbasel,publicbase2{

  public:

  derived(){cout<<"3";}

  };

  voidmain()

  {

  derivedobj;

  eout<  }

  A.0123B.3120

  C.O312D.3012

  40.有如下程序:

  #include

  voidmain()

  {charch[2][5]={"6937","8254"),*p[2];

  inti,j,s=0;

  for(i=0;i(2;i++)p[i]=ch[i];

  for(i=0;i<2;i++)

  for(j=0;p[i][j]>’\0’;j+=2)

  s=10*s+p[i][j]-’0’;

  cout<  该程序的输出结果是(  )。

  A.69825

  B.63825

  C.6385

  D.693825

  二、程序改错题(18分)

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

  member:1

  member:10

  member:100

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

  试题程序:

  #include

  inti=100;

  classTC

  {

  public:

  TC(inti)

  {

  cout<<"member:"<  /********error********/

  i=i+9:

  }

  voidPrint()const

  {

  cout<<"member:"<  }

  private:

  inti;

  };

  voidmain()

  {

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

  TCobj;

  inti(0);

  obj.Print();

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

  cout<<"member:"<  return;

  }

  三、简单应用题(24分)

  使用VC++6.0打开考生文件夹下的源程序文件2.cpp。请完成函数fun(char*data),此函数的功能是找出字符串数组中最大的ASCIl值,如果有相同变量,则输出最后一个所在的位置;如果字符串为空,则返回-1;或者不存在时也返回-1。

  注意:不能修改函数的其他部分。计算数字如果第一个字母最大,则返回0。依次增加。

  试题程序:

  #include

  intfun(char*data)

  {

  }

  voidmain()

  {

  charsource[1024];

  cout<<"请输入一行英文字符串:\n";

  cin.getline(source,1024);

  cout<<"最大的字母出现在距离头部"<  <<"个字母处"<  }

  四、综合应用题(18分)

  用VC++6.0打开考生文件夹下的源程序文件3.cpp,这个工程完成输出到屏幕一些特定的信息,但工程有错误或者不完整,请完成以下功能:

  (1)初始化Num2的值为j,请在注释1后添加适当的语句。

  (2)补充全局函数fun使之能够调用类TC的成员变量,请在注释2后添加适当的语句。

  (3)初始化静态变量,请在注释3后添加适当的语句。

  (4)修改注释4后的语句。使得程序输出以下内容:

  Num1=7

  Num2=12

  Num3=-7

  Num1=6

  Num2=9

  Num3=-17

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

  试题程序:

  #include

  classTC

  {

  public:

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

  TC(inti,intj)

  {

  Num1=i:

  Num3-=i:

  }

  voidPrint()

  {

  cout<<"Numl="<  cout<<"Num2="<  cout<<"Num3="<  }

  voidAdd(inti)

  {

  Num3-=i:

  }

  private:

  intNuml;

  constintNum2;

  staticintNum3;

  //********2********};

  //********3********voidfun(  )

  {

  TCobj(5,9);

  obj.Numl=6;

  //********4********obj.Add(  );

  obj.Print(  );

  }

  voidmain(  )

  {

  TCobj(7,12);

  obj.Print(  );

  fun(  );

  return;

  }

  一、选择题

  1.A。【解析】程序设计的风格主要强调程序的简单、清晰和可理解性,以便读者理解。程序滥用goto语句将使程序流程无规律,可读性差;添加注释行有利于对程序的理解.不应减少或取消,程序的长短要依据实际的需要而定,并不是越短越好。

  2.D。【解析】需求分析是软件定义时期的最后一个阶段,它的基本任务就是详细调查现实世界要处理的对象,充分了解原系统的工作概况,明确用户的各种需求,然后在这些基础上确定新系统的功能。

  3.C。【解析】结构化分析方法是面向数据流进行需求分析的方法,采用自顶向下、逐层分解,建立系统的处理流程,以数据流图和数据字典为主要工具,建立系统的逻辑模型。

  4.D。【解析】使用软件需求规格说明书的目的是便于用户、开发人员进行理解和交流,它能够反映出用户问题的结构,可以作为软件开发工作的基础和依据,而且可以作为确认测试和验收的依据。它是需求分析的结果,而不是为了便于开发人员进行需求分析。因此答案是选项D。

  5.A。【解析】二叉树的遍历有三种:前序、中序和后序。中序遍历首先遍历左子树或左子结点,然后访问根结点,最后遍历右子树或右子结点。分析本题二叉树,对其进行中序遍历,结果为ACBDFEG。

  6.C。【解析】SQL语言的全称为StructuredQueryLanguage,它是一种介于关系代数与关系演算之间的结构化查询语言,是一种面向数据库的通用数据处理语言规范。它包含数据查询语言、数据操纵语言、数据定义语言和数据控制语言四个部分。

  7.D。【解析】在线性链表中,各元素在存储空间中的位置是任意的,各元素的顺序也是任意的,依靠指针来实现数据元素的前后关系。

  8.B。【解析】对二叉树的中序遍历是指:首先遍历左子树.然后访问根结点,最后遍历右子树。在遍历左、右子树时,注意依旧按照“左子树一根结点一右子树”的顺序。本题的遍历顺序是这样的:①首先访问左子树BDEY;②在左子树BDEY中,也按中序遍历,先访问左子树DY;在左子树DY中,也按中序遍历,先访问左子树,左子树没有,则访问根结点D,然后访问右子树Y;③接着访问根B,再访问右子树E;④访问左子树BDEY后,接着访问根结点A,然后访问右子树CFXZ;⑤同理可得右子树CFXZ的访问顺序为FC-ZX。

  9.D。【解析】交换排序方法是指借助数据元素之间的互相交换进行排序的一种方法,包括冒泡排序和快速排序。冒泡排序是一种最简单的交换排序方法,它通过相邻元素的交换,逐步将线性表变得有序。

  10.A。【解析】数据库设计包括数据库概念设计和数据库逻辑设计两个方面的内容。

  11.A。【解析】本题考查类和对象的概念。类是用户定义的一种类型,程序员可以使用这个类型来说明多个变量,即对象。

  12.A。【解析】变量在使用之前其数据类型必须加以说明,而存储类型则可默认说明或显式说明。显式说明指直接在变量说明前加上存储类型标志,如auto,register,static,extern等。关键字auto通常省略。

  13.B。【解析】本题考查C++语言的正确赋值方法。a=b=c+2实际上相当于a=(b=c+2),进而可分解为两个表达式b=c+2和a=b。选项A中包含一个不合法的运算符":=";选项C应改为(int)18.5%3;选项D可理解为两个表达式a+7=c+b和a=a+7,其中第一个是错的,因为C++语言规定赋值号的左边只能是单个变量,不能是表达式或常量。

  14.A。【解析】关于C++语言,应该了解以下必须要掌握的基础知识:①C++程序是由类构成的;②一个函数由两部分组成,即函数的首部和函数体;③一个类由两部分组成,即类成员变量和类成员函数;④一个C++程序总是从main函数开始执行的,而不论main函数在整个程序中的位置如何(main函数可以放在程序最前头,也可以放在程序最后,或写在一些函数之前,在另一些函数之后);⑤C++程序在书写上,表现形式比较自由,一行内可以写几个语句,一个语句可以分写在几行上,每个语句和数据定义的最后必须有一个分号;⑥可以用/*……*/和//对C++语言的程序的任何部分进行注释。

  15.A。【解析】枚举类型定义了一些整型符号常量的集合,使用枚举类型时应该注意以下几点:枚举类型的第一个常量默认值是0;枚举类型常量的值允许彼此相同;虽然枚举类型常量是整数类型,但是不允许使用整数直接赋值给枚举类型变量,也不允许与整数进行运算,只可以与整数进行比较。

  16.B。【解析】本题考查的是模极的概念。函数模板可以含有常规形参;函数模板的一个实例就是一个函数定义;类模板中的成员函数都是模板函数;在用类模板定义对象时,由于没有像函数实参表这样的额外信患渠道,因此无法按函数模板的方式省略模板形参,但是可以为类模板的参数设置默认值。

  17.D。【解析】本题考查的知识点是运算符一的重载。一运算符有一元(取负)和二元(减法)两种形式,且均可重载为成员函数和非成员函数。运算符重载为成员函数时,形参个数一般为运算符元数减1,因为此成员函数所属的对象可成为运算符的一个运算分量。重载为非成员函数时,形参个数一般和运算符元数相等。所以一运算符重载为成员函数时,参数个数可以是0个和1个,而重载为非成员函数时,参数个数可以是1个或2个。

  18.B。【解析】本题考查的知识点是基本类型的派生类型的定义。派生类型声明符是由基本类型关键字char、int、float、double前面加上类型修饰符组成的。类型修饰符包括short短类型,缩短字长;long长类型,加长字长;signed有符号类型,取值范围包括正负值;unsigned无符号类型,取值范围只包括正值。其中signed和unsigned只能同时出现一个,如果省略则默认为signed。short和long也只能同时出现一个,如果修饰的类型是int.则可以省略int。unsignedlongint的省略形式为unsignedlong;选项B中,signedshortint的省略形式就是short,正确;unsignedshortint的省略形式是unsignedshort;shortint的省略形式是short。故本题选B。

  19.B。【解析】纯虚函数是在声明虚函数时被“初始化”为0的虚函数。纯虚函数没有函数体,纯虚函数的作用是在基类中为其派生类保留一个函数名称。

  20.D。【解析】通常,引用一个数组元素可以用下标法,如a[p-a]形式,或指针法,如*(&a[i])的形式。本题中a[9]=9,a[10]显然超出了数组范围,数组的下标是从0开始的。

  21.C。【解析】基类的私有成员在派生类中都是不可见的,如果一个派生类要访问基类中声明的私有成员,可以将这个派生类声明为友元。

  22.C。【解析】本题考查函数的调用。当函数的参数是引用类型时,参数不能是常量、表达式和变量地址,只能是变量本身。

  23.C。【解析】本题考查C++流的使用。setfill()的作用是设置填充字符;left的作用是使输出数据在指定宽度内左对齐;right的作用是使输出数据在指定宽度内右对齐。

  24.A。【解析】本题考查的知识点是运算符的重载。运算符重载为成员函数时,形参个数一般为运算符的元数减1,因为此成员函数所属的对象可成为运算符的一个运算分量。重载为非成员函数时,形参个数一般和运算符元数相等。所以,二元运算符重载为非成员函数时,参数表中应有两个参数,运算符重载为成员函数时,若参数表中无参数,重载的是一元运算符。一元运算符中,一取负运算符、++增1运算符、--减1等运算符均可重载为成员函数,C++中,有…*、->*、::、?:五个运算符不能重载。

  25.B。【解析】C++语言中当一个新对象被另一个已存在的同类型对象初始化时要调用复制构造函数,语句"MyStringb(a);"符合此条件,将调用类MyString的复制构造函数,但是类MyString没有定义此复

  制构造函数,所以会出错。

  26.A。【解析】本题考查的知识点是静态成员。类中的静态成员是解决同一个类的不同对象之间的数据和函数共享问题的。静态成员被所有属于这个类的对象共享。这种共享与全局变量或全局函数相比,既没有破坏数据隐藏的原则,又保证了安全性。题目中,首先定义了一个obj对象,其构造函数使MyClass的静态数据成员count增1,所以第一条输出语句输出的结果是1。然后通过指针动态创建了一个MyClass类的对象,构造函数再次被调用,count变为2,所以第二次输出结果是2。接下来是用dilete删除了刚才动态创建的MyClass对象。析构函数被调用,count减1变为1,第三次输出1。故本题的输出为121。

  27.A。【解析】本题考查常成员函数的应用。VAC类中说明了两个函数,一个是常成员函数,一个是普通函数;在主函数中说明了两个对象,通过普通对象v1调用的是普通函数,输出5;通过常对象v2调用的是常成员函数,输出3。

  28.C。【解析】如果在子类中要访问父类的函数应用::运算符。

  29.D。【解析】本题考查this指针的随用类成员函数add中通过this指针实现私有数据成员n的赋值。

  30.D。【解析】C++中对函数模板的调用有时候只使用了函数实参,而没有使用模板实参,模板实参都被省略了,但模板实参的省略并不是必然的,而是有条件的:从模板函数实参表获得的信息有矛盾;需要莸得特定类型的返回值,而不管参数的类型如何;虚拟类型参数不出现在模板函数的形参中;函数模板含有常规形参。题中定义的函数模板中虚拟类型参数T2没有出现在模板数的形参列表中,所以在调用时不能省略,D选项的调用省略了T3,这是允许的。

  31.B。【解析】运算符+在类Complex中作为成员函数重载,实现两个对象的数据成员的相加。所以main函数中语句Complexa=Complex(1,1)+Complex(5);的作用相当于Complexa(1+5,1);,即对象a的数据成员re的值为6,imag的值为1,所以输出为6+1i。

  32.D。【解析】本题考查的知识点是豢的构造。建立一个类的对象时,构造函数的执行顺序如下:①执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序(自左向右);②执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序(自上而下);③执行自身的构造函数。本题Derived类继承于Base类,所以首先会构造基类Base,但Derived类的构造函数没有初始化列表,所以将调用Base类的默认构造函数,输出一个0。接下来由于它的成员中还定义了一个Base类的对象,两构造函数也没有显示初始化这个对象,所以再次调用Base类的默认构造函数输出一个0。最后构造自身,因为主函数中传入了构造参数1,所以构造自身时输出了一个1。故最终输出结果为001。

  33.C。【解析】本题考查的知识点是虚函数与多态性。在成员函数声明的前面加上virtual修饰,即把该函数声明为虚函数。在C++中,一个基类指针(或引用)可以用于指向它的派生类对象,而且通过这样的指针(或引用)调用虚函数时,被调用的是该指针(或引用)实际所指向的对象类的那个重定义版本。故本题最终输出结果为DBB。

  34.C。【解析】该函数的调用方式是strcpy(字符数组,字符串),其中字符串可以是串常量,也可以是字符数组。函数的功能是将字符串完整地复制到字符数组中,字符数组中原有内容被覆盖。使用该函数时注意:④字符数组必须定义得足够大,以便容纳复制过来的字符串,复制时,连同结束标志\0一起复制;②连接前两个字符串都有结束标志‘\0’,连接后"字符数组"中存储的字符串的结束标志’\0’被舍弃,只在目标串的最后保留一个’\0’;③不能用赋值运算符=将一个字符串直接赋值给一个字符数组,只能用strcpy()函数来处理,strcat(字符数组,字符串)的功能是把字符串连接到字符数组中的字符串尾端,并存储于字符数组中,字符数组中原来的结束标志,被字符串的第一个字符覆盖,而字符串在操作中未被修改。

  35.D。【解析】要把结点b连接到结点a之后,必须把b的地址给a的next指针,选项A中,指针变量q保存的就是变量b的地址,选项B中的P是指针变量,应该是P->next=&b;在选项D中,用*运算符取出结构体变量,并且保存的就是b的地址,所以正确。

  36.C。【解析】while中表达式值一直为0,故循环一次也不执行。

  37.B。【解析】本题考查的是类的构造函数和析构函数。派生类构造函数的执行顺序:首先调用基类的构造函数,调用顺序按它们被继承时说明的顺序;然后调用子对象的构造函数,调用顺序按它们在类中说明的顺序;最后是派生类构造函数中的内容。因此本题中,首先调用基类构造函数输出A,然后调用子对象的构造函数输出B,P=newA再调用类A的构造函数输出A。析构函数的调用顺序和构造函数的调用顺序相反。

  38.B。【解析】派生类对象的数据结构是由基类中说明的数据成员和派生类中说明的数据成员共同构成,所以不能继承基类的构造函数,必须重新定义。

  39.A。【解析】本题考查的是含有虚基类的继承中构造函数的调用顺序,应该先调用基类的构造函数,接着是按照派生类继承列表的顺序依次调用虚基类的构造函数,最后调用派生类自己的构造函数。

  40.C。【解析】该题需要搞清楚以下几点:④定义了一个指针数组char*p[2]后,程序中第一个循环“for(i=0;i(2;i++)p[i]=ch[i]”的作用是使指针数组的p[0]元素(它本身是一个指针)指向了二维数组ch的第一行字符串,并使指针数组的p[1]元素指向了二维数组ch的第二行字符串,这样,就使指针数组P和二维数组ch建立起了一种对应关系,以后对二维数组ch的某个元素的引用就有两种等价的形式:ch[i][j]或p[i][j]。②对二维数组ch的初始化,使其第一行ch[0]中存入了字符串“6937”,第二行ch[1]中的内容为字符串“8254”。③程序中第二个循环中的循环体“s=s*10+p[i][j]-’0’”的功能是这样的,每执行一次,将s中的值乘以10(即将s中的数值整体向左移动一位,并在空出来的个位上添一个0),再将当前p[i][i]中的字符量转换为相应的数字,然后把这个数字加到s的个位上。④注意到内层循环的循环条件p[i][j]>’\0’是指p[i][j]中的字符只要不是字符串结束标志’\0’就继续循环,语句j+=2;是使下标j每次增加2,即一个隔一个地从p[i]所指向的字符串中取出字符。经过上述解析后,不难看出,该程序首先从p[0]所指向的字符串“6937”中一个隔一个地取出字符,分别是“6”和“3”,然后从p[1]所指向的字符串“8254”中一个隔一个地取出字符,分别是“8”和“5”,同时经过转换和相加运算后,结果s中的值应该是6385。

  二、程序改错题

  (1)“i=i+9;”应改为“this->i=i+9;(*this).i=i+_9;或TC::i=i+9;”。

  (2)“TCobj;”应改为“TCobj(1);”。

  (3)“cout<<"member:"<  【解析】本题考查了考生对变量作用域的了解情况。i=i+9;语句使形参的值自增9,这样做是毫无意义的,因为形参变量值在函数结束后不会被保存。所以等号左边的变量i应引用为TC的私有成员变量,将私有成员初始化为形参i+9的值,可以通过this指针来引用,也可以通过域作用符“::”。“TCobj;”语句会产生一条编译错误,因为TC类已经定义了一条TC(inti)构造函数,C++就不会为其自动生成默认构造函数了。这就意味着,要创建TC类的对象必须带有一个int型构造函数参数。该构造函数中的第1条就是输出语句。从输出了形参i的内容来看,这个构造参数应该为1。“cout<<"member:"<  三、简单应用题

  imfun(char*data)

  {

  intMaxPos=0:

  if(data==NULL

  return-l:

  charMaxData=data[0];

  if(MaxData==0)

  return-1;

  for(inti=1;data[i]!=0;i++)

  if(data[i]>=MaxData)

  {

  MaxData=data[i];

  MaxPos=i:

  }

  returnMaxPos;

  }

  【解析】本题考查的是查找最大值算法。根据题意,首先检查传入参数的合法性,如不合法或为空串,则返回-1,然后通过for循环遍历整个字符串,将最大值字符保存到MaxData内,并将最大位置保存给MaxPos,最后返回Max-Pos。

  四、综合应用题

  (1)“TC(inti,intj)”应改为“TC(inti,intj):Num2(j)”。

  (2)应添加“friendvoidfun();”。

  (3)应添加“intTC::Num3=0;”。

  (4)“obj.Add();”应改为“0bj.Add(5);”。

  【解析】本题考查了构造函数初始化列表、声明友元函数、初始化静态成员变量。第1处应该添加初始化Num2成员的语句,由于该成员为常成员,所以只能通过初始化列表初始化。第2处应添加将fun函数声明为TC类友元的语句。静态成员变量需要在类外初始化,就像定义类的成员函数一样。可以将静态成员变量看成全局变量。Add函数需要一个int型参数,从Add函数的定义来看,它将增加形参i的值。由于main函数中先调用了一次Print成员函数,已经输出了3行数据,然后再调用fun函数的,所以fun函数中调用Print是输出后3行数据。Num3在第1次输出时值为10,fun函数中创建obj对象时,又让其增加1,而希望它最终的值是16,所以不难得知,Add()中应传入5才能达到目的。

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

热点推荐

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