二级C++笔试377.docx
《二级C++笔试377.docx》由会员分享,可在线阅读,更多相关《二级C++笔试377.docx(22页珍藏版)》请在冰豆网上搜索。
![二级C++笔试377.docx](https://file1.bdocx.com/fileroot1/2023-1/3/53149d41-4c3e-4c30-a822-8309400596ee/53149d41-4c3e-4c30-a822-8309400596ee1.gif)
二级C++笔试377
二级C++笔试-377
(总分:
100.00,做题时间:
90分钟)
一、选择题(总题数:
35,分数:
70.00)
1.下面是关于派生类声明的开始部分,其中正确的是()。
(分数:
2.00)
A.classvirtualB:
publicA
B.virtualclassB:
publicA
C.classB:
publicAvirtual
D.classB:
virtualpublicA √
解析:
[解析]声明派生类的一般形式为:
class派生类名:
[继承方式]基类名。
其中继承方式包括:
public,private,protected,而virtual为C++中的关键字。
虚函数的使用方法是在基类用virtual声明成员函数为虚函数。
2.下列叙述中正确的是()。
(分数:
2.00)
A.一个逻辑数据结构只能有一种存储结构
B.逻辑结构属于线性结构,存储结构属于非线性结构
C.一个逻辑数据结构可以有多种存储结构,且各种存储结构不影响数据处理的效率
D.一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率 √
解析:
[解析]数据的存储结构是指数据的逻辑结构在计算机存储空间中的存放形式,一种数据结构可以根据需要采用不同的存储结构,常用的存储结构有顺序和链式结构。
采用不同的存储结构,其处理的效率是不同的。
3.在软件开发中,需求分析阶段产生的主要文档是()。
(分数:
2.00)
A.可行性分析报告
B.集成测试计划
C.概要设计说明书
D.软件需求规格说明书 √
解析:
[解析]软件的生命周期分为计划、开发和运行3个时期。
其中计划期包括问题定义和可行性研究。
运行的任务是软件维护。
开发期包括分析、设计和实施:
分析即为需求分析。
需求分析的最终结果是生成软件需要规格说明书,可以为用户、分析人员和设计人员之间的交流提供方便。
4.有如下程序:
#include<iostream>
usingnamespacestd;
classA
public:
A()cout<<"A";
~A()cout<<"~A";
;
classB:
publicA
A*p;
public:
B()cout<<"B";p=newA;
~B()cout<<"~B";deletep;
;
intmain()
Bobj;
return0;
执行这个程序的输出结果是()。
(分数:
2.00)
A.BAA~A~B~A
B.ABA~B~A~A √
C.BAA~B~A~A
D.ABA~A~B~A
解析:
[解析]此题考查的是类的构造函数和析构函数。
派生类构造函数的执行顺序为:
首先调用基类的构造函数,调用顺序按它们被继承时说明的顺序;然后调用子对象的构造函数,调用顺序按它们在类中说明的顺序;最后是派生类构造函数中的内容。
因此本题中,首先调用基类构造函数输出A,然后调用子对象的构造函数输出B,p=newA再调用类A的构造函数输出A;析构函数的调用顺序和构造函数的调用顺序相反。
5.若要把函数voidfun()定义为TestClass的友元函数,则应该在类TestClass的定义中加入的语句是()。
(分数:
2.00)
A.voidfriendfun()
B.friendfun()
C.friendvoidfun() √
D.TestClassvoidfun()
解析:
[解析]如果在类以外的其他地方定义了一个函数,在类体中用friend对该函数进行声明,此函数就称为本类的友元函数。
因为函数为voidfun(),根据友元定义补全语句为“friendvoidfun();”。
6.如果一个关系中,存在多个属性(或属性组)都能用来唯一标识该关系的元组,且其任何一个子集都不具有这一特性。
这些属性(或属性组)都被称为关系的()。
(分数:
2.00)
A.连接码
B.主码
C.外码
D.候选码 √
解析:
[解析]在关系中凡能惟一标识元组的最小属性集称为该表的键或码。
二维表中可能有若干个键,它们称为该表的候选码或候选键。
从二维表的所有候选键中选取一个作为用户使用的键称为主键或主码。
7.已知一个有序线性表为(13,18,24,35,47,50,62,83,90,115,134),当用二分法查找值为90的元素时,查找成功的比较次数为()。
(分数:
2.00)
A.1
B.2 √
C.3
D.9
解析:
[解析]根据二分法查找法需要两次:
①首先将90与表中间的元素50进行比较,由于90大于50,所以在线性表的后半部分查找。
②第二次比较的元素是后半部分的中间元素,即90,这时两者相等,即查找成功。
8.在函数中,可以用auto、extern、register和static这四个关键字中的一个来说明变量的存储类型,如果不说明存储类型,则默认的存储类型是()。
(分数:
2.00)
A.auto √
B.extern
C.register
D.static
解析:
[解析]此题考查的是存储类型。
C++语言变量的存储类型分为如下几种类型:
auto——函数内部的局部变量;static——静态存储分配;extern——全局变量;register——变量存储在硬件寄存器中。
9.类MyClass的定义如下,若要对value赋值,则下面语句正确的是()。
classMyClass
public:
MyClass()
MyClass(inti)value=newint(i);
int*value;
;
(分数:
2.00)
A.MyClassmy;my.value=10;
B.MyClassmy;*my.value=10;
C.MyClassmy;my.*value=10;
D.MyClassmy(10); √
解析:
[解析]因题目中定义的指针value是指向变量i的,所以直接利用语句MyClass(inti){value=newint(i);}对value进行赋值即可。
10.字面常量42、4.2、42L的数据类型分别是()。
(分数:
2.00)
A.long,double,int
B.long,float,int
C.int,double,long √
D.int,float,long
解析:
[解析]此题考查的知识点是字面常量。
对于整型字面常量,只要没有超过C++中整数所能表示的范围,C++将自动按整数来存储此数,也可以通过在整型字面常量后添加u或1来指定无符号整数或长整数来存储;对于实型字面常量,C++将自动按照双精度数来存储,也可以通过在实型字面常量后添加f来指定按单精度数存储。
11.已知递归函数fun的定义如下:
intfun(intn)
if(n<=1)return1;//递归结束情况
elsereturnn*fun(n-2);//递归
则函数调用语句fun(5)的返回值是()。
(分数:
2.00)
A.5
B.12
C.15 √
D.30
解析:
[解析]递归函数fun被定义为含有参数intn,返同整型。
其中fun函数递归调用本身,当n=1时,fun返回1,如果大于1那么执行n*fun(n-2)。
所以,当n等于5时,执行5*fun(3);当3时继续调用fun,3*fun
(1),即fun(5)=5*(3*fun
(1)),答案为15。
12.有下列二叉树,对此二叉树中序遍历的结果为()。
(分数:
2.00)
A.BDYEACFXZ
B.DYBEAFCZX √
C.ABCDEFXYZ
D.ABDYECFXZ
解析:
[解析]对二叉树的中序遍历是指:
首先遍历左子树,然后访问根结点,最后遍历右子树。
在遍历左、右予树时,注意依旧按照“左子树→根结点→右子树”的顺序。
本题的遍历顺序是这样的:
①首先访问左子树:
BDEY;②在左子树BDEY中,也按中序遍历,先访问左子树DY;在左子树DY中,也按中序遍历,先访问左子树,左子树没有,则访问根结点D,然后访问右子树Y;③接着访问根B,再访问右子树E;④访问左子树BDEY后,接着访问根结点A,接着访问右子树CFXZ;⑤右子树CFXZ的访问顺序同理可得:
FCZX。
13.关于结构化程序设计原则和方法的描述错误的是()。
(分数:
2.00)
A.选用的结构只准许有一个入口和一个出口
B.复杂结构应该用嵌套的基本控制结构进行组合嵌套来实现
C.不允许使用GOTO语句 √
D.语言中所没有的控制结构,应该采用前后一致的方法来模拟
解析:
[解析]限制使用GOTO语句是结构化程序设计的原则和方法之一,但不是绝对不允许使用GOTO语句。
其他三项为结构化程序设计的原则。
14.在数据库设计中,将E-R图转换为关系模式的过程属于()。
(分数:
2.00)
A.需求分析阶段
B.逻辑设计阶段 √
C.概念设计阶段
D.物理设计阶段
解析:
[解析]数据库设计阶段主要包括需求分析、概念设计、逻辑设计和物理设计。
其中逻辑设计的主要工作是将E-R图转换为关系模式。
15.有如下程序:
#include<iostream>
usingnamespacestd;
classsample
private:
intx,y;
public:
sample(inti,intj)
x=i;
y=j;
voiddisp()
cout<<"disp1"<<endl;
voiddisp()const
cout<<"disp2"<<endl;
;
intmain()
constsamplea(1,2);
a.disp();
return0;
该程序运行后的输出结果是()。
(分数:
2.00)
A.disp1
B.disp2 √
C.disp1disp2
D.程序编译时出错
解析:
[解析]因为对象a被定义为常对象,所以a.disp()语句调用的是类的常成员函数voiddisp()const,输出的结果是disp2。
16.设R是一个2元关系,有3个元组,S是一个3元关系,有4个元组。
如T=R×S,则T的元组为()个。
(分数:
2.00)
A.6
B.8
C.12 √
D.16
解析:
[解析]R为n元关系,S为m元关系,分别有p、q两个元组。
两个关系笛卡儿积后,新关系是一个n+m元的关系,元组个数是q×p。
[知识拓展]通俗而言,所谓“元”就好像表格中有多少列,“元组”就好像表格中有多少行。
17.有如下程序:
#include<iostearn>
usingnamespacestd;
classTestClass
protected:
TestClass()cout<<'x';
TestClass(charC)cout<<c;
;
classTestClass1:
publicTestClass
public:
TestClass1(charC)Cout<<c;)
;
intmain()
TestClass1d1('y');
return0;
执行这个程序,屏幕上将显示输出()。
(分数:
2.00)
A.y
B.yx
C.xy √
D.yy
解析:
[解析]程序中的类TestClass为基类,TestClass1为TestClass的派生类。
由main主函数入手,定义TestClass1类型的对象d1,参数值为'y'。
TestClass1类继承TestClass,所以主函数中“TestClass1d1('y');”语句首先调用调用基类中的“TestClass(){cout<<'x';)”输出x,然后调用“TestClass1(charC){cout<<c;}”输出y,即答案为“xy”。
18.若有以下程序:
#include<iostream>
usingnamespacestd;
classTestClass
public:
voidwho()cout<<"TestClass"<<endl;
;
classTestClass1:
publicTestClass
public:
voidwho()cout<<"TestClass1"<<endl;
;
intmain()
TestClass*p;
TestClass1obj1;
P=&obj1;
P->who();
return0;
则该程序运行后的输出结果是()。
(分数:
2.00)
A.TestClass1
B.TestClass √
C.0
D.无输出
解析:
[解析]程序中的TestClas1为TestClass的派生类,主函数main中定义TestClass对象*p,TestClass1对象obj1,然后p引用obj1,执行p->who()则是调用基类中的who函数,输出TestClass。
19.有如下程序:
#include<iostream>
usingnamespacestd;
classTest
public:
Test()n+=2;
~Test()n-=3;
staticintgetNum()returnn;
private:
staticintn;
;
intTest:
:
n=1;
intmain()
Test*p=newTest;
deletep;
cout<<"n="<<Test:
:
getNum()<<endl;
return0;
执行后的输出结果是()。
(分数:
2.00)
A.n=0 √
B.n=1
C.n=2
D.n=3
解析:
[解析]语句Test*p=newTest;会调用类的构造函数Test(){n+=2;},使n的值由原来的1变为3,然后deletep调用类的析构函数~Test(){n-=3;},因为n是static型变量,所以会在3的基础上减3使得输出结果为0。
20.若有以下程序:
#include<iostream>
usingnamespacestd;
classA
public:
A(inti,intj)
a=i;
b=j;
voidmove(intx,inty)
a+=x;
b+=y;
voidshow()
cout<<a<<","<<b<<endl;
private:
inta,b;
;
classB:
privateA
public:
B(inti,intj):
A(i,j)
voidfun()
move(3,5);
voidfl()
A:
:
show();
;
intmain()
Bd(3,4);
d.fun();
d.fl();
return0;
程序执行后的输出结果是()。
(分数:
2.00)
A.3,4
B.6,8
C.6,9 √
D.4,3
解析:
[解析]此题的执行过程如下:
首先Bd(3,4);语句调用B类的构造函数:
B(inti,intj),B的构造函数中调用基类A的构造函数,使得a=3,b=4;d.fun()会调用函数move(3,5),使得(3,4)和(3,5)的对应部分分别相加,最后输出6,9。
21.下列有关拷贝构造函数的描述中错误的是()。
(分数:
2.00)
A.拷贝构造函数是一种构造函数
B.拷贝构造函数与一般的构造函数一样,可以设置多个形参 √
C.每一个类中都必须有一个拷贝构造函数
D.拷贝构造函数的功能是用一个已知对象去初始化一个正在创建的对象
解析:
[解析]拷贝构造函数是一个特殊的构造函数,它用一个己知的对象初始化一个正在创建的同类对象,它不能指定函数返回类型;只有一个参数,是同类的某个对象名的引用。
每一个类中都必须有一个拷贝构造函数,如果类中未声明,编译器会目动生成一个公有的拷贝构造函数。
22.有如下类的定义,横线处的语句是()。
classTestClass
______intx,y;
public:
TestClass(inta=0,intb=0)
X=a:
y=b;
staticvoidchange()
y-=10;
y-=10;
;
(分数:
2.00)
A.public
B.private
C.static √
D.protected
解析:
[解析]因为staticvoidchange()为静态函数,静态函数主要访问静态数据,不访问非静态数据。
所以函数中访问了数据y,所以下划线的数据类型应对应为static。
23.下面叙述错误的是()。
(分数:
2.00)
A.派生类可以使用private派生
B.对基类成员的访问必须是无二义性的
C.基类成员的访问能力在派生类中维持不变 √
D.赋值兼容规则也适用于多继承的组合
解析:
[解析]在建立派生类的时候,并不是简单地把基类的私有成员直接作为派生类的私有成员,把基类的公用成员直接作为派生类的公用成员。
涉及如何确定基类的成员在派生类中的访问属性问题,不仅要考虑对基类成员所声明的访问属性,还要考虑派生类所声明的对基类的继承方式,根据这两个因素共同决定基类成员在派生类中的访问属性。
所以本题选择C)。
24.下面的描述中,正确的是()。
(分数:
2.00)
A.virtual可以用来声明虚函数 √
B.含有纯虚函数的类是不可以用来创建对象的,因为它是虚基类
C.即使基类的构造函数没有参数,派生类也必须建立构造函数
D.静态数据成员可以通过成员初始化列表来初始化
解析:
[解析]在基类中用virtual声明成员函数为虚函数,所以A是正确的。
纯虚函数是在声明虚函数时被“初始化”为0的虚函数。
纯虚函数是一种特殊的虚函数,它没有具体的实现。
静态数据成员函数只能在类外进行初始化。
25.假定MyClass为一个类,那么下列的函数说明中,()为该类的析构函数。
(分数:
2.00)
A.void~MyClass();
B.~MyClass(intn);
C.MyClass();
D.~MyClass(); √
解析:
[解析]C++语言中析构函数为符号“~”加类名,且析构函数没有返回值和参数,故前不加void关键字。
所以正确的形式应该是~MyClass()。
26.若有如下程序:
#include<iostream>
usingnamespacestd;
ints=0;
classsample
staticintn;
public:
sample(inti)
n=i;
staticvoidadd()
S+=n;
;
intsample:
:
n=0;
intmain()
samplea
(2),b(5);
sample:
:
add();
cout<<s<<endl;
return0;
程序运行后的输出结果是()。
(分数:
2.00)
A.2
B.5 √
C.7
D.3
解析:
[解析]执行语句“samplea
(2),b(5)”;的结果是使n的值最终变为5,sample:
:
add()语句调用函数staticvoidadd(),使得s=s+n=5。
27.下列重载函数中,正确的是()。
(分数:
2.00)
A.voidfun(inta,floatb);voidfun(intC,floatd)
B.voidfun(inta,floatb);voidfun(floata,intb) √
C.floatfun(inta,floatb);intfun(intb,floata)
D.intfun(inta,intb);floatfun(inta,int
解析:
[解析]所谓函数重载是指同一函数名可以对应多个函数实现。
进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。
28.要使程序执行后的输出结果为ABCD,应在横线处添加语句()。
#include<iostream>
usingnamespacestd;
public:
A()cout<<'A';
;
classB=______
public:
B()cout<<'B';
;
classC:
virtualpublicA
public:
C()cout<<'C';
;
classD:
publicB,publicC
public:
D()cout<<'D';
;
voidmain()Dobj;
(分数:
2.00)
A.publicA
B.privateA
C.protectedA
D.virtualpublicA √
解析:
[解析]由主函数main入手,定义了类D对象obj。
其中D为类B和C的公有继承,A是C的虚基类。
题目中要求的输出结果为“ABCD”,依次为类A,类B,类C,类D中构造函数的输出语句。
为了保证基类通过多条路径被派生类继承时,即保证A只被继承一次,输出一个A,所以不但需要声明A为C的虚基类,同样也要声明A为B的虚基类。
29.下列有关继承和派生的叙述中,正确的是()。
(分数:
2.00)
A.如果一个派生类私有继承其基类,则该派生类对象不能访问基类的保护成员
B.派生类的成员函数可以访问基类的所有成员
C.基类对象可以赋值给派生类对象
D.如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类 √
解析:
[解析]如果派生类私有继承基类,不能访问基类中的私有成员,所以A)、B)是错误的。
派生类是对基类的具体化,所以C)错误的。
如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类,即选择D)。
30.下列程序的输出结果为2,横线处应添加语句()。
#include<iostream>
usingnamespacestd;
public:
______voidfun()cout<<1;
;
classTestClass2:
publicTestClass1
public:
voidfun()cout<<2;)
;
intmain()
TestClass1*p=newTestClass2;
p->fun();
deletep;
Teturn0;
(分数:
2.00)
A.public
B.private
C.virtual √
D.protected
解析:
[解析]由主函数main入手,定义TestClass1类的指针对象p指向派生类Testclass2。
因为基类和派生类中都有fun函数,题目要求输出为2,就是基类对象访问派生类