当前位置:首页 > 全部子站 > IT > 等级考试

2018年12月计算机二级C++提分练习题及答案(3)

来源:长理培训发布时间:2018-11-28 14:37:51

   选择题

 
  1.可以用P.a的形式访问派生类对象P的基类成员a,其中a是(  )。
 
  A.私有继承的公有成员
 
  B.公有继承的私有成员
 
  C.公有继承的保护成员
 
  D.公有继承的公有成员
 
  2.下面程序的运行结果为(  )。
 
  #include
 
  classA
 
  {
 
  intnum;
 
  public:
 
  A(inti){num=i;)
 
  A(A&a){num=a.num++;}
 
  voidprint(){cout<  };
 
  voidmain()
 
  {
 
  Aa(1),b(a);
 
  a.print();
 
  b.print();
 
  }
 
  A.11B.12
 
  C.21D.22
 
  3.设有定义charstr[80];以下不能将输入数据firstnsecondn读取到数组str中的语句是(  )。
 
  A.cin.get(str,strlen(str));
 
  B.cin.getline(str,strlen(str));
 
  C.cin>>str;
 
  D.cin.read(str,strlen(str));
 
  4.下列程序的输出结果为(  )。
 
  #include
 
  classTestClass
 
  {
 
  public:
 
  TestClass(){val++;}
 
  static,intval;
 
  };
 
  intTestClass::val=0;
 
  voidmain()
 
  {
 
  TestClasscsl;
 
  cout<  TestClasscs2;
 
  TestClasscs3,cs4;
 
  cout<  }
 
  A.O3
 
  B.13
 
  C.14
 
  D.24
 
  5.有以下类定义:
 
  classMyClass
 
  {
 
  private:
 
  intid;
 
  chargender;
 
  char*phone;
 
  public:
 
  MyClass():id(0),gender(’#’),phone(NULl){}
 
  MyClass(intn0,charge=’#’,char*ph=NULL)
 
  {id=no;gender=ge;phone=ph;}
 
  };
 
  下列类对象定义语句中错误的是(  )。
 
  A.MyClassmyObj;
 
  B.MyClassmyObj(11,"13301111155");
 
  C.MyClassmyObj(12,’m’);
 
  D.MyClassmyObj(12);
 
  6.下列是关于派生类声明的开始部分,其中正确的是(  )。
 
  A.classvirtualB:publicA
 
  B.virtualclassB:publicA
 
  C.classB:publicAvirtual
 
  D.classB:virtualpublicA
 
  7.如果类A被说明成类B的友元,则(  )。
 
  A.类A的成员即类B的成员
 
  B.类B的成员即类A的成员
 
  C.类A的成员函数不得访问类B的成员
 
  D.类B不一定是类A的友元
 
  8.下列关于虚基类的描述,错误的是(  )。
 
  A.设置虚基类的目的是为了消除二义性
 
  B.虚基类的构造函数在非虚基类之后调用
 
  C.若同一层中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用
 
  D.若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数
 
  9.下列关于多态性的描述,错误的是(  )。
 
  A.C++语言中的多态性分为编译时的多态性和运行时的多态性
 
  B.编译时的多态性可通过函数重载实现
 
  C.运行时的多态性可通过模板和虚函数实现
 
  D.实现运行时多态性的机制称为动态绑定
 
  10.若有如下程序:
 
  #include
 
  usingnamespacestd;
 
  classTestClassl
 
  {
 
  private:
 
  inta;
 
  public:
 
  TestClassl(inti)
 
  {
 
  a=i:
 
  }
 
  voiddisp(  )
 
  {
 
  cout<  }
 
  };
 
  classTestClass2
 
  {
 
  private:
 
  intb:
 
  public:
 
  TestClass2(intj)
 
  {
 
  b=j;
 
  }
 
  voiddisp()
 
  {
 
  cout<  }
 
  };
 
  classTestClass3:publicTestClass2,publicTestClassl
 
  {
 
  private:
 
  intc;
 
  public:
 
  TestClass3(intk):TestClass1(k-2),TestClass2(k+2)
 
  {
 
  c=k:
 
  }
 
  voiddisp()
 
  {
 
  TestClasssl::disp();
 
  TestClasss2::disp();
 
  cout<  }
 
  };
 
  intmain()
 
  {
 
  TestClass30bj(10);
 
  obj.disp();
 
  return0;
 
  }
 
  程序执行后的输出结果是(  )。
 
  A.10,10,10
 
  B.10,12,14
 
  C.8,10,12
 
  D.8,12,10
 
  11.在下列程序的横线处填上适当的内容,使程序执行后的输出结果为ABCD(  )。
 
  #include
 
  usingnamespacestd;
 
  classA
 
  {
 
  public:A(){cout<<’A’;}
 
  };
 
  classB:
 
  {
 
  public:B(){cout<<’B’;}
 
  };
 
  classC:virtualpublicA
 
  {
 
  public:C(){cout<<’C’;}
 
  };
 
  classD:publicB,publicD
 
  {
 
  public:D(){cout<<’D’;}
 
  };
 
  voidmain(){D04;}
 
  A.publicA
 
  B.privateA
 
  C.protectedA
 
  D.virtualpublicA
 
  12.有如下程序:
 
  #include
 
  usingnamespacestd;
 
  classAA{
 
  intn;
 
  public:
 
  AA(intk):n(k){}
 
  intget(){returnn;}
 
  intget()const{returnn+1;}
 
  };
 
  intmain()
 
  {
 
  AAa(5);
 
  constAAb(6);
 
  cout<  return0;
 
  }
 
  执行后的输出结果是()。
 
  A.55
 
  B.57
 
  C.75
 
  D.77
 
  13.有如下程序:
 
  #include
 
  usingnamespacestd;
 
  classDemo
 
  {
 
  public:
 
  Demo(){cout<<"defaultconstructorn";}
 
  Demo(constDemo&x){cont<<"copyconstruc-
 
  torn";}
 
  };
 
  DemouserCode(Demob){Democ(b);returnC;}
 
  intmain()
 
  {
 
  Demoa;d;
 
  cout<<"callinguserCode()n";
 
  d=userCode(a):
 
  return0;
 
  }
 
  执行上面程序的过程中,构造函数Demo(  )和Demo(constDem0&x)被调用的次数分别是(  )。
 
  A.1和1
 
  B.1和2
 
  C.2和3
 
  D.2和4
 
  14.有如下程序:
 
  #include
 
  usingnamespacestd;
 
  classDA{
 
  intk;
 
  public:
 
  DA(intx=1):k(x){}
 
  ~DA(){cout<  };
 
  intmain(){
 
  DAd[]={DA(3),DA(3),DA(3));
 
  DA+p=newDA[2];
 
  delete[]p;
 
  return();
 
  }
 
  这个程序的输出结果是(  )。
 
  A.111
 
  B.333
 
  C.11333
 
  D.11133
 
  15.有如下程序:
 
  #include
 
  usingnamespacestd;
 
  classMyClass{
 
  public:
 
  MyClass(intx):val(x){}
 
  voidPrint()const{cout<<"const:val="<<  voidPrint(){cout<<"val="<  private:
 
  intval;
 
  };
 
  intmain(){
 
  constMyClassobj1(10);
 
  MyClassobj2(20);
 
  obj1.Print();
 
  obj2.Print();
 
  return0;
 
  }
 
  程序的输出结果是(  )。
 
  A.va1=10const:va1=20
 
  B.const:va1=10const:va1=20
 
  C.const:va1=10val=20
 
  D.val=10va1=20
 
  16.关于函数中的<返回类型>。下列表述中错误的是(  )。
 
  A.<返回类型>中有可能包含关键字int
 
  B.<返回类型>中有可能包含自定义标识符
 
  C.<返回类型>中衣可能包含字符*
 
  D.<返回类型>中可能包含[]
 
  17.Sample是一个类,执行下面语句后,调用Sample类的构造函数的次数是(  )。
 
  Samplea[2],*p=newSample;
 
  A.0
 
  B.1
 
  C.2
 
  D.3
 
  18.有如下两个类定义:
 
  classXX{
 
  private:
 
  doublex1;
 
  protected:
 
  doublex2;
 
  public:
 
  doublex3;
 
  };
 
  claseYY:protectedXX{
 
  private:
 
  doubley1;
 
  protected;
 
  doubley2;
 
  public:
 
  doubley3;
 
  };
 
  在类YY中保护成员变量的个数是(  )。
 
  A.1
 
  B.2
 
  C.3
 
  D.4
 
  19.下列关于运算符重载的描述中,错误的是(  )。
 
  A.可以通过运算符重载在C++中创建新的运算符
 
  B.赋值运算符只能重载为成员函数
 
  C.运算符函数重载为类的成员函数时,第一操作参数就是该类对象
 
  D.重载类型转换运算符时不需要声明返回类型
 
  20.下列关于类模板的描述中,错误的是(  )。
 
  A.类模板的成员函数都是模板函数
 
  B.可以为类模板参数设置默认值
 
  C.类模板描述了一组类
 
  D.类模板中只允许有一个类型参数
 
  1.D。【解析】只有公有继承的公有成员才能被派生类的对象直接访问,其他的情况都会因为访问权限问题产生错误。
 
  2.C。【解析】本题考查考生对拷贝构造函数的掌握。因为++运算是右结合的,所以在使用a对b赋值时,b的hum变为1,而a的num变为2(先赋值再自加)。
 
  3.D。【解析】本题考查cin流对象的几种成员函数get,getline,read及流提取符>>的使用规则。
 
  4.C。【解析】由主函数main入手,定义TestClass类的对象cs1,执行cs1.va1,其中va1为静态变量,根据intTestClass::val=0;初始化,TestClass中的TestClass(){val++;}构造函数执行后,val值为1。主函数中接着定义对象cs2,cs3,cs4。执行cout<
 
  5.B。【解析】本题考查构造函数的应用。对象建立用初始化列表对数据成员进行时。列表中的参数类型要与构造函数中形参类型一致。B选项中第二个参数为13301111155,是字符串,而构造函数中第二个形参为char型,两者不一致造成错误。
 
  6.D。【解析】声明派生类的一般形成为class派生类名:[继承方式]基类名。其中继承方式包括public、private和protected。而virtual为C++中的关键字,所以选项C错。虚函数的使用方法是在基类用virtual声明成员函数为虚函数。
 
  7.D。【解析】本题考查的是友元类的定义:类A为类B的友元类,则类A的所有成员函数都是类B的友元函数,但反之则不一定成立。
 
  8.B。【解析】虚基类的引入就是为了消除二义性,其构造函数的调用仍然是按照继承的顺序进行的,对于多个虚基类则按它们说明的次序调用,虚基类的构造函数先于非虚基类的构造函数执行。
 
  9.C。【解析】编译时的多态性是通过函数重载和模板体现的,运行时的多态性是通过虚函数体现的。
 
  10.D。【解析】首先定义TestClass3的对象obj,参数为10。其中TestClass3为TestClass1和TestClass2的派生类。然后调用disp成员函数。disp中首先执行TestClassl::disp();,然后执行TestClass2::disp();,最后执行输出语句cout<
 
  11.D。【解析】由主函数main入手,定义了类D对象obi。其中D为类B和C的公有继承,A是C的虚基类。题目中要求的输出结果为ABCD,依次为类A、类B、类C、类D中构造函数的输出语句。为了保证基类通过多条路径被派生类继承,即保证A只被继承一次,输出一个A,所以不但需要声明A为C的虚基类,同样也要声明A为B的虚基类。
 
  12.B。【解析】所谓函数重载,是指同一个函数名可以对应着多个函数的实现,类AA中定义了两个9et()函数,一个为普通成员函数,另一个为常成员函数。一般对象a既可以调用普通成员函数get,也可以调用常成员函数get,但是由于常成员函数不能更新对象的数据成员,所以题中通过对象a调用的函数为普通成员函数get(),返回值为5。常对象b只能调用常成员函数,所以题中通过对象b调用的函数为常成员函数get(),返回值为7。
 
  13.C。【解析】函数Demo()为构造函数,而Demo(constDemo&x)为复制构造函数。C++在创建一个对象时,会自动调用类的构造函数,所以语句"Demoa,d;"将调用函数Demo()2次。当一个对象作为实参传递给函数时为初始化形参,要调用拷贝构造函数;在函数返回一个对象时调用拷贝构造函数。由此可知语句d=userCode(a);调用拷贝构造函数3次。
 
  14.C。【解析】本题考查的是析构函数和对象的生存期。在主函数中,首先定义了一个DA类对象数组d,从初始化列表中可以看出,它包含三个对象;然后通过new运算符动态创建了一个DA类的对象数组,并将首地址赋给DA类指针P;接着通过delete[]运算符销毁指针P所指向的数组,故此时会输出11。最后函数结束,销毁前面定义的对象数组d,会输出333。故最后的输出结果是11333。
 
  15.D。【解析】在建立类对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承的声明顺序;执行成员对象的构造函数,调用顺序按照各个成员在类中的声明顺序;执行自身的构造函数。根据以上总结以及题意可知答案选择D选项。
 
  16.B。【解析】<返回类型>又称函数类型,表示一个
 
  函数所计算(或运行)的结果值类型,这里的类型可以是预定义类型(如int)、复合类型(如double*)、用户定义类型(如枚举类),若返回值只做更新(或设置)等操作,则该函数返回类型为void类型,函数类型和内置数组不能作为返回类型,但类类型和容器类型可以被直接返回。
 
  17.D。【解析】构造函数在对象被创建时由系统自动调用,本题共创建3个对象。
 
  18.C。【解析】派生类从基类保护继承classYY:pro-tectedXX时,基类的公有成员在派生类中变为保护成员,基类的保护成员在派生类中仍然是保护成员;本题中YY本身有一个保护成员y2,再加上基类XX的x2和x3,故选C。
 
  19.A。【解析】运算符的重载是针对C++中原有运算符进行的,不能通过重载创造新的运算符。
 
  20.D。【解析】类模板是一系列相关类的模板,类成员组成相同,成员函数的源代码形式相同,所不同的是所针对的类型。类模板的成员函数都是模板函数,在用类模板定义对象时,由于没有像函数实参表这样的额外信息渠道,因此无法按函数模板的方式省略模板实参。但可以为类模板的参数设置默认值。由此可知应选D。

责编:曾珂

发表评论(共0条评论)
请自觉遵守互联网相关政策法规,评论内容只代表网友观点,发表审核后显示!

国家电网校园招聘考试直播课程通关班

  • 讲师:刘萍萍 / 谢楠
  • 课时:160h
  • 价格 4580

特色双名师解密新课程高频考点,送国家电网教材讲义,助力一次通关

配套通关班送国网在线题库一套

课程专业名称
讲师
课时
查看课程

国家电网招聘考试录播视频课程

  • 讲师:崔莹莹 / 刘萍萍
  • 课时:180h
  • 价格 3580

特色解密新课程高频考点,免费学习,助力一次通关

配套全套国网视频课程免费学习

课程专业名称
讲师
课时
查看课程
在线题库
面授课程更多>>
图书商城更多>>
在线报名
  • 报考专业:
    *(必填)
  • 姓名:
    *(必填)
  • 手机号码:
    *(必填)
返回顶部