二级C++笔试296.docx
- 文档编号:15015436
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:31
- 大小:28.64KB
二级C++笔试296.docx
《二级C++笔试296.docx》由会员分享,可在线阅读,更多相关《二级C++笔试296.docx(31页珍藏版)》请在冰点文库上搜索。
二级C++笔试296
二级C++笔试-296
(总分:
100.00,做题时间:
90分钟)
一、选择题(总题数:
35,分数:
70.00)
1.下列虚基类的声明中正确的是
(分数:
2.00)
A.classvirtualB:
publicA
B.virtualclassB:
publicA
C.classB:
publicAvirtual
D.classB:
virtualpublicA √
解析:
[解析]本题考核虚基类的声明方式。
虚基类说明格式如下:
Virtual<继承方式><基类名>
其中,virtual是虚基类的关键词。
虚基类的说明是用在定义派生类时,写在派生类名的后面。
即:
class<派生类名>:
Virtual<继承方式><基类名>。
2.面向对象程序设计将数据和什么放在一起,作为一个相互依存、不可分割的整体来处理?
(分数:
2.00)
A.对数据的操作 √
B.信息
C.数据隐藏
D.数据抽象
解析:
[解析]面向对象语言包含3个要素,即对象、类和继承。
这3个要素反映了面向对象的传统观念。
面向对象程序设计的本质是把数据和对数据的操作当成一个整体即对象。
3.通过公有派生类的对象,只能访问基类成员中的
(分数:
2.00)
A.公有成员 √
B.私有成员
C.保护成员
D.公有成员和保护成员
解析:
[解析]本题考核派生类的访问权限。
派生类的继承方式有三种:
公有继承public、私有继承private和保护继承protected。
当公有派生时,派生类成员函数只能访问基类的公有成员和保护成员,但是通过派生类的对象只能访问基类的公有成员。
4.设有a、b、c、d、m、n均为int型变量,且a=5、b=6、c=7、d=8、m=2、n=2,则逻辑表达式(m=a>b)&&(n=c>d)运算后,n的值为
(分数:
2.00)
A.0
B.1
C.2 √
D.3
解析:
[解析]在&&运算中,如果第1个表达式的值为假时,第2个表达式将不再计算。
在表达式中第1个表达式m=a>b的值为0,也就是假,所以第2个表达式的将不再计算。
所以n的值没有变。
5.下列关于new运算符的描述中错误的是
(分数:
2.00)
A.使用运算符new创建对象数组时必须定义初始值 √
B.使用运算符new创建对象时,会调用类的构造函数
C.运算符new可以用来动态创建对象和对象数组
D.使用new运算符创建的对象可以使用运算符delete删除
解析:
[解析]本题考核运算符new。
先来了解运算符new:
运算符new返回指定类型的一个指针,如果分配失败(如没有足够的内存空间),则返回0。
它与delete运算符一起使用,以达到直接进行动态内存分配和释放的目的。
对于A选项,使用运算符new创建对象数组时只能指定分配内存的大小,不能为该数组指定初始值,其初始值为缺省值,因此类中必须定义缺省构造函数。
所以A选项的描述是错误的。
B、C和D选项的描述都是正确的。
6.考虑函数原型voidtest(inta,intb=7,charz='*'),下面的函数调用中,属于不合法调用的是
(分数:
2.00)
A.test(5);
B.test(5,8);
C.test(6,'#'》; √
D.test(0,0,'*');
解析:
[解析]本题考核函数的调用。
题中函数声明带有默认参数,那么在C选项的调用中,将会把字符型实参#赋值给整型形参b,这不符合参数传递规则。
7.有以下程序
#include<iostream>
#include<string>
usingnamespacestd;
classbase
private:
charbaseName[10];
public:
base()
strcpy(baseName,"Base");
virtualchar*myName()
returnbaseName;
char*className()
ReturnbaseName;
;
classDerived:
publicbase
private:
charderivedName[10];
public:
Derived()
strcpy(derivedName,"Derived");
char*myName()
returnderivedName;
char*className()
returnderivedName;
;
voidshowPtr(base&p)
cout<<p.myName()<<""<<p.className();
intmain()
basebb;
Deriveddd;
showPtr(dd);
return0;
运行后的输出结果为
(分数:
2.00)
A.DerivedBase √
B.BaseBase
C.DerivedDerived
D.BaseDerived
解析:
[解析]本题考核虚函数的应用。
类Derived是从基类Base公有派生而来的。
因此,Derived是基类Base的子类型。
main()函数中定义了一个基类对象比和一个派生类对象dd。
从程序中可看出派生类Derived的对象dd交给了处理基类Base的对象的函数showPtr进行处理。
由于在基类中函数myName被定义成虚函数。
所以在函数showPtr中调用的myName函数为派生类的成员函数myName,从而输出Derived。
然后输出className,即基类名称Base。
8.一棵二叉树中共有70个叶子结点与80个度为1的结点,则该二叉树中的总结点数为
(分数:
2.00)
A.221
B.219 √
C.231
D.229
解析:
[解析]在任意一棵二叉树中,度为0的结点(也就是叶子结点)总比度为2的结点多一个。
由于本题中的二叉树有70个叶子结点,所以有69个度为2的结点。
该二叉树中总结点数为:
度为2的结点数+度为1的结点数+度为0的结点数=69+80+70=219。
9.若有一个MyClass类,则执行语句MyClassa,b
(2),*p;后,自动调用该类的构造函数()次。
(分数:
2.00)
A.2 √
B.3
C.4
D.5
解析:
[解析]本题考核构造函数的调用。
C++在创建一个对象时,会自动调用类的构造函数,在构造函数中可以执行初始化成员变量的操作。
语句MyClassa,b
(2),*p;创建了两个对象a、b和一个对象指针。
在创建a和b对象时系统会调用类的构造函数。
但在创建对象指针p时,不调用类的构造函数,因为指针p本身不定义类对象,而是定义了p可以指向一个MyClass的对象。
10.在进行任何C++流的操作后,都可以用C++流的有关成员函数检测流的状态;其中只能用于检测输入流状态的操作函数名称是
(分数:
2.00)
A.fail
B.eof √
C.bad
D.good
解析:
[解析]本题考核C++流的文件操作。
C++中可以用文件流对象的下列成员函数来判别文件流的当前状态。
函数is_open():
判定流对象是否与一个打开的文件相联系,若是,返回true,否则返回false:
函数good():
刚进行的操作成功时返回true,否则返回false。
函数fail():
与good()相反,刚进行的操作失败时返回true,否则返回false。
函数bad():
如果进行了非法操作返回true,否则返回false。
函数eof():
进行输入操作时,若到达文件尾返回true,否则返回false。
其中,eof函数只能用于输入流操作。
11.在关系模型中,
(分数:
2.00)
A.为了建立一个关系,首先要构造数据的逻辑关系
B.表示关系的二维表中各元组的每一个分量还可以分成若干数据项
C.一个关系的属性名表称为关系模式 √
D.一个关系可以包括多个二维表
解析:
[解析]在关系模型中,不需要事先构造数据的逻辑关系,只要将数据按照一定的关系存入计算机,也就是建立关系,选项A错误。
对于表示关系的二维表,其最基本的要求是,表中元组的每一个分量必须是不可分的数据项,即不允许表中再有表,选项B和D错误。
本题的正确答案是C。
12.下列叙述中错误的是
(分数:
2.00)
A.一种数据的逻辑结构可以有多种存储结构
B.数据的存储结构与数据处理的效率无关 √
C.数据的存储结构与数据处理的效率密切相关
D.数据的存储结构在计算机中所占的空间不一定是连续的
解析:
[解析]一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接、索引等,选项A和选项D正确。
采用不同的存储结构,其数据处理的效率不同,因此,在进行数据处理时,选择合适的存储结构是很重要的,选项C正确,选项B错误,应为所选。
13.下列关于栈的叙述正确的是
(分数:
2.00)
A.在栈中只能插入数据
B.在栈中只能删除数据
C.栈是先进先出的线性表
D.栈是先进后出的线性表 √
解析:
[解析]栈是一种特殊的线性表,其插入与删除运算都只在线性表的一端进行。
在这种线性表的结构中,一端封闭,不允许插入与删除元素;另一端开口,允许插入与删除元素。
在栈中不仅能插入数据,也能删除数据,选项A与B都错。
栈是后进先出的线性表,而不是先进先出的线性表,选项C的说法错误,选项D正确。
14.在下面的4个关键字中用来说明虚函数的是
(分数:
2.00)
A.virtual √
B.public
C.protected
D.private
解析:
[解析]C++中说明虚函数的方法为:
virtual<类型说明符><函数名>(<参数表>);。
其中,被关键词virtual说明的函数称为虚函数。
15.下列关系运算中,能使经运算后得到的新关系中属性个数多于原来关系中属性个数的是
(分数:
2.00)
A.选择
B.连接 √
C.投影
D.并
解析:
[解析]连接运算是对两个关系进行的运算,其意义是从两个关系的笛卡尔积中选出满足给定属性间一定条件的那些元组。
而两个关系的笛卡尔积中的属性个数是两个原关系中的属性个数之和。
即两个关系经连接运算后得到的新关系中属性个数多于原来关系中属性个数。
正确答案是B。
16.有以下程序
#include<iostream>
usingnamespacestd;
classsample
private:
intx;
public:
sample(int
(分数:
2.00)
A.
<
解析:
[解析]本题考核友元函数的应用。
程序中函数square是类sample的一个友元函数,它可以直接访问类sample的所有成员。
它的功能是返回类sample的私有数据成员x的平方。
所以程序的执行结果是:
900。
注意:
友元函数不是类的成员函数,在类外定义时不要加上类名及其作用域运算符(:
:
)。
友元函数的调用与一般函数的调用的方式和原理一致,可以在程序的任何地方调用它。
17.有以下程序:
#include<iostream>
usingnamespacestd;
intmain()
intx=15;
while(x>10&&x<50)
x++;
if(x/3)
x++;break;
cout<<x<<end1;
return0;
执行后的输出结果是
(分数:
2.00)
A.15
B.16
C.17 √
D.18
解析:
[解析]本题考核选择语句与循环语句的嵌套。
由程序可知,当x=16时,满足if条件表达式,进入if分支,执行“x++;break;”,所以最后程序输出x的值为17。
18.在结构化设计方法中生成的结构图(SC)中,带有箭头的连线表示
(分数:
2.00)
A.模块之间的调用关系 √
B.程序的组成成份
C.控制程序的执行顺序
D.数据的流向
解析:
[解析]在结构图中,用带有箭头的连线表示模块之间的调用关系。
箭头由前一个模块指向后一个模块,表示前一个模块调用后一个模块。
本题的正确答案为A。
19.下列叙述中正确的是
(分数:
2.00)
A.接口复杂的模块,其耦合程度一定低
B.耦合程度弱的模块,其内聚程度一定低
C.耦合程度弱的模块,其内聚程度一定高 √
D.上述三种说法都不对
解析:
[解析]影响模块之间耦合的主要因素有两个:
模块之间的连接形式,模块接口的复杂性。
一般来说,接口复杂的模块,其耦合程度要比接口简单的的模块强,所以
选项A的说法错误;
耦合程度弱的模块,其内聚程度一定高,选项B错误;选项C正确。
20.有以下程序:
classDate
public:
Date(inty,intm,intd);
year=y;
month=m;
day=d;
Date(inty=2000)
year=y;
month=10;
day=1;
Date(Date&d)
year=d.year;
month=d.month;
day=a.day;
voidprint()
cout<<year<<"."<<month<<"."<<day<<end1;
private:
intyear,month,day;
;
Datefun(Dated)
Datetemp;
temp=d;
returntemp;
intmain()
Datedate1(2000,1,1),date2(0,0,0);
Datedate3(date1);
date2=fun(date3);
return0;
程序执行时,Date类的拷贝构造函数被调用的次数是
(分数:
2.00)
A.2
B.3 √
C.4
D.5
解析:
[解析]本题考核拷贝构造函数。
上述程序中,拷贝构造函数一共被调用了3次:
第一次是在执行语句Datedate3(date1);时,用已经建立的对象date1对正在建立的对象date3进行初始化;第二次是在调用fun函数时,由于是传值调用,因此实参对象date3要对形参对象d进行初始化;第三次是在执行fun函数中的返回语句returntemp;时,系统用返回初始化一个匿名对象时使用了拷贝构造函数。
21.下列关于E-R图的描述中正确的是
(分数:
2.00)
A.E-R图只能表示实体之间的联系
B.E-R图只能表示实体和实体之间的联系
C.E-R图只能表示实体和属性
D.E-R图能表示实体、属性和实体之间的联系 √
解析:
[解析]E-R图中,用3种图框分别表示实体、属性和实体之间的联系:
矩形框表示实体,框内标明实体名;椭圆状框表示实体的属性,框内标明属性名;菱形框表示实体间的联系,框内标明联系名;实体与其属性之间以无向边连接,菱形框与相关实体之间也用无向边连接,并在无向边旁标明联系的类型。
综上所述,用E-R图不仅可以简单明了地描述实体及其相互之间的联系,还可以方便地描述多个实体集之间的联系和一个实体集内部实体之间的联系。
选项A、B、C的说法都错误,本题的正确答案是D。
22.考虑下面的函数原型:
voidf(inta,intb=7,charc='@');
下面的函数调用中,不合法的是
(分数:
2.00)
A.f(5)
B.f(5,8)
C.f(6,'&') √
D.f(0,0,'@')
解析:
[解析]当一个函数中有多个默认参数时,则形参分布中默认参数应从右到左逐渐定义。
在函数调用时,系统按从左到右的顺序将实参与形参结合,当实参的数目不足时,系统将按同样的顺序用说明或定义中的默认值来补齐所缺少的参数。
在C选项中,函数调用中只有两个实参,系统按从左到右的顺序将实参与形参结合时,实参,及,将赋值给血型形参b,显然则是非法的。
23.以下非法的赋值表达式是
(分数:
2.00)
A.n=(i=2,++i);
B.j++;
C.++(i+1); √
D.x=j>0;
解析:
[解析]对于任何一种赋值运算,其赋值号或复合赋值号左边必须是一个左值。
左值是指具有对应的可由用户访问的存储单元,并且能够由用户改变其值的量。
而在C选项中赋值号对应的是表达式“i+l”,不是一个左值,因此是非法的赋值表达式。
24.下面对对象概念描述错误的是
(分数:
2.00)
A.任何对象都必须有继承性 √
B.对象是属性和方法的封装体
C.对象间的通讯靠消息传递
D.操作是对象的动态属性
解析:
[解析]继承是面向对象的方法的一个主要特征。
继承是使用已有的类定义做为基础建立新类的定义技术。
已有的类可当做基类来引用,则新类相应地可当做派生类来引用。
但并不是所有的对象都必须有继承性。
因此,选项A中的说法是错误的,应为所选。
25.重载输入流运算符>>必须使用的原型为
(分数:
2.00)
A.istream&operator>>(istream&,<类名>&); √
B.istream&operator>>(istream,<类名>);
C.istreamoperator>>(istream,<类名>&);
D.<类名>operator>>(istream&,<类名>&);
解析:
[解析]本题考核运算符的重载。
C++中重载输入流运算符>>和输出流运算符<<只能作为非类成员函数重载,且必须使用如下原形:
istream&operator>>(istream&,<类名>&);
ostream&operator<<(ostream&,<类名>):
26.已知类Myst有一个只需要一个double型参数的构造函数,且将运算符“-”重载为友元函数。
要使语句序列
Mystx(3.2),y(5.5),z(0.0);
z=8.9-y;
y=x-6.3;
能够正常运行,运算符函数operator—应该在类中声明为
(分数:
2.00)
A.friendMystoperator-(Myst&,Myst&);
B.friendMystoperator-(Myst,Myst); √
C.friendMystoperator-(Myst,Myst&);
D.friendMystoperator-(Myst&,Myst);
解析:
[解析]本题考核运算符的重载。
题中将运算符“-”重载为友元函数,其声明格式如B选项所描述的。
27.下列叙述中正确的是
(分数:
2.00)
A.线性链表中的各元素在存储空间中的位置必须是连续的
B.线性链表中的表头元素一定存储在其他元素的前面
C.线性链表中的各元素在存储空间中的位置不一定是连续的,但表头元素一定存储在其他元素的前面
D.线性链表中的各元素在存储空间中的位置不一定是连续的,且各元素的存储顺序也是任意的 √
解析:
[解析]在线性表的链式存储结构中,各数据结点的存储序号不连续,且各结点在存储空间中的位置关系与逻辑关系也不一致。
在线性链表中,各数据元素之间的前后件关系是由各结点的指针域来指示的。
所以,选项D正确。
28.若有以下程序:
#include<iostream>
usingnamespacestd;
intf()
staticinti=0;
ints=1;
s+=i;
i++;
returns;
intmain()
inti,a=0;
for(i=0;i<5;i++)
a+=f();
cout<<a<<endl;
return0;
程序运行后,输出的结果是
(分数:
2.00)
A.20
B.24
C.25
D.15 √
解析:
[解析]本题考核静态局部变量在函数中的使用。
静态局部变量就是将局部变量说明为静态的。
静态局部变量既有在局部域作用的特性(即变量只能在变量的作用范围内被访问),又可以永久存在(变量的值得以保留,并可继续使用)。
静态局部变量只在第一次执行时初始化一次。
在函数f中定义了一个静态局部变量l它的初始值为0,还定义了一个局部变量s(它的初始值为1),用来返回计算所得值。
函数f中所进行的数据加工是s+=i和i++。
即每调用一次函数f,返回(i+1)的值后,i的值增1。
再看主函数,在主函数main中,通过一个for语句连续调用f函数5次,并把每次调用f函数的返回值相加并存入a。
最后输出a的值。
在了解各函数功能以及调用关系后就可计算出a的值为15。
29.下列模板的声明中,正确是
(分数:
2.00)
A.template<T>
B.template<classT1,T2>
C.template<classT1,classT2> √
D.template<classT1;classT2>
解析:
[解析]本题考核模板的定义。
模板定义的<类型参数表>中包含一个或多个由逗号分隔的类型参数项,每一项由关键字class后跟一个用户命名的标识符,此标识符为类型参数,它不是一种数据类型,但可以同一般数据类型一样使用。
在使用类模板时,必须将其实例化,即用实际的数据类型代替它。
30.若有以下程序:
#include<iostream>
usingnamespacestd;
classA
private:
inta;
public:
A(inti)
a=i;
voiddisp()
cout<<a<<",";
;
classB
private:
intb;
public:
B(intj)
b=j;
voiddisp()
cout<<b<<",";
;
classC:
publicB,publicA
private:
intc;
public:
C(intk):
A(k-2),B(k+2)
c=k;
voiddisp()
A:
:
disp();
B:
:
disp();
cout<<c<<end1;
;
intmain()
Cobj(10);
obj.disp();
return0;
程序执行后的输出结果是
(分数:
2.00)
A.10,10,10
B.10,12,14
C.8,10,12
D.8,12,10 √
解析:
[解析]本题考核派生类构造函数的使用。
本题中,派生类C具有多重继承关系,所以在派生类C的构造函数中应该包含基类A和B的成员初始化列表。
31.以下程序的输出结果是
#include<iostream.h>
voidmain()
inta=0,i;
for(i=1;i<5;i++)
switch(i)
case0:
case3:
a+=2;
case1:
case2:
a+=3;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二级 C+ 笔试 296