1、国家二级 C+机试(选择题)模拟试卷 40及答案与解析 一、选择题 1 下列关于算法复杂度叙述正确的是 ( A)最坏情况下的时间复杂度一定高于平均情况的时间复杂度 ( B)时间复杂度与所用的计算工具无关 ( C)对同一个问题,采用不同的算法,则它们的时间复杂度是相同的 ( D)时间复杂度与采用的算法描述语言有关 2 设有栈 S和队列 Q,初始状态均为空。首先依次将 A,B,C,D,E,F入栈,然后从栈中退出三个元素依次入队,再将 X,Y,Z入栈后,将栈中所有元素退出并依次入队,最后将队列中所有元素退出,则退 队元素的顺序为 ( A) DEFXYZABC ( B) DEFXYZABC ( C)
2、FEDXYZCBA ( D) DEFZYXABC 3 下列叙述中正确的是 ( A)有两个指针域的链表称为二叉链表 ( B)循环链表是循环队列的链式存储结构 ( C)带链的栈有栈顶指针和栈底指针,因此又称为双重链表 ( D)结点中具有多个指针域的链表称为多重链表 4 某二叉树共有 845个结点,其中叶子结点有 45个,则度为 1的结点数为 ( A) 400 ( B) 754 ( C) 756 ( D)不确定 5 软件需求分析阶段的主 要任务是 ( A)确定软件开发方法 ( B)确定软件开发工具 ( C)确定软件开发计划 ( D)确定软件系统的功能 6 下面对软件测试描述错误的是 ( A)严格执行
3、测试计划,排除测试的随意性 ( B)随机地选取测试数据 ( C)随机地选取测试数据 ( D)软件测试是保证软件质量的重要手段 7 结构化程序的三种基本控制结构是 ( A)顺序、选择和重复(循环) ( B)过程、子程序和分程序 ( C)顺序、选择和调用 ( D)调用、返回和转移 8 数据库中对概念模式内容进行说明的语言是 ( A)数据定 义语言 ( B)数据操纵语言 ( C)数据控制语言 ( D)数据宿主型语言 9 某个工厂有若干个仓库,每个仓库存放有不同的零件,相同零件可能放在不同的仓库中。则实体仓库和零件间的联系是 ( A)多对多 ( B)一对多 ( C)多对一 ( D)一对一 10 有三个
4、关系 R、 S和 T如下:则由关系 R和 S得到关系T的操作是 ( A)交 ( B)差 ( C)并 ( D)选择 11 下列选项中,正确的 C+标识符是 ( A) a3 ( B) a-3 ( C) a3 ( D) a_3 12 下列选项中,正确的 C+表达式是 ( A) a1+ ( B) b+2 ( C) 3=c ( D) -d4 13 要定义整型数组 x,使之包括初值为 1的三个元素,下列语句正确的是 ( A) static int x3=1; ( B) int x3;x1=x2=x3=1; ( C) int x3=1,1,1; ( D) int x=1,1,1; 14 常量 4.2,4.2
5、f,4L的数据类型分别是 ( A) float、 float、 double ( B) double、 float、 long ( C) double、 double、 float ( D) float、 float、 long 15 设变量 x和 y为整型变量,若有函数调用为 “fun( ( B) void fun(int ( C) void fun(int *a,int ( D) void fun(int *a,int *b) 16 下列关于函数参数的叙述中,错误的是 ( A)函数的实参与形参应该一一匹配 ( B) 定义函数时必须给出函数的实参 ( C)函数形参可以看做函数的局部变量 (
6、D) C+中可以为形参指定默认值 17 下列选项中,不是重载函数调用时选择依据的是 ( A)参数个数 ( B)参数类型 ( C)参数名称 ( D)函数名称 18 若为类 MyClass重载运算符 “+“,下列声明中,错误的是 ( A) friend MyClass operator + (double, double); ( B) friend MyClass operator + (double, MyClass); ( C) friend MyClass operator + (MyClass, double); ( D) friend MyClass operator + (MyClas
7、s, MyClass); 19 有如下程序: #include using namespace std; void fun(int x=y/4; x+; int main() int x=4,y=5; fun(x,y); cout using namespace std; void fun(int x=y/4; x+; int main() int x=4,y=5; fun(x,y); coutfun(); ( C) Base:fun(); ( D) fun(); 24 如果派生类以 protected方式继承基类,则基类中的保护成员在派生类中的访问属性是 ( A) public ( B) p
8、rotected ( C) private ( D) protected 或 public 25 有如下两个类定义: class XX private: double x1; protected: double x2; public: double x3; ; class YY: protected XX private: double y1; protected: double y2; public: double y3; ; 在派生类 YY中的保护成员的个数是 ( A) 1 ( B) 2 ( C) 3 ( D) 4 26 有如下类声明: class What int n; public:
9、double d; private: char c; ; 类 What的公有数据成员和私有数据成员的数量分别是 ( A) 1 和 1 ( B) 1 和 2 ( C) 2 和 1 ( D) 2 和 2 27 除了显式定义的构造函数外,类中还有可能包含编译器自动生成的构造函数,因此一个类所拥有的构造函数的至少有 ( A) 1 个 ( B) 2 个 ( C) 3个 ( D) 4个 28 有如下类声明: class How int k; public: How():k(99) ; 则类 How 所拥有的构造函数的数量是 ( A) 1 ( B) 2 ( C) 3 ( D) 4 29 在下面的类声明中,错
10、误的是 ( A) class AA BB b; ; class BB AA a; ; ( B) class AA AA *a; ; class BB BB ; ( C) class BB; class AA BB *b; ; class BB AA a; ; ( D) class AA; class BB AA ; class AA BB b; ; 30 有如下类声明和函数声明: class Base int m; public: int n; protected: int p; ; class Derived: public Base int k; ; void f(Derived d);
11、则允许函数 f 访问的参数 d 的数据成员的个数是 ( A) 1 ( B) 2 ( C) 3 ( D) 4 31 有如下类声明: class How int k; public: How() cout using namespace std; class Base1 public: Base1() Base1() coutbark() ( D) ( class AA char c; public: AA():c(X) AA(char ch):c(ch) AA(AA MyTemp p2; MyTemp p34; 编译系统在处理上面的语句序列时,所生成的模板 MyTemp 的实例的个数是 ( A)
12、 1 ( B) 2 ( C) 3 ( D) 6 39 下列关于模板的表述中,正确的是 ( A)如果一个类中存在纯虚函数,这个类就是类模板 ( B)函数模板不能带有形式参数表 ( C)类模板带有模板形参表 ( D)类模板中不能包含构造函数 40 下列关于基类和派生类关系的叙述中,正确的是 ( A)派生类中的成员可以访问基类中的任何成员 ( B)每个类最多只能有一个直接基类 ( C)对基类构造函数的调用不能出现 在派生类构造函数的初始化列表中 ( D)派生类除了继承基类的成员,还可以定义新的成员 国家二级 C+机试(选择题)模拟试卷 40答案与解析 一、选择题 1 【正确答案】 C 【试题解析】
13、算法的时间复杂度是指执行算法所需要的计算工作量,它与使用的计算机、程序设计语言以及算法实现过程中的许多细节无关, B选项正确, D选项错误。最坏情况下的时间复杂度可以与平均情况的时间复杂度相同, A选项错误。不同的算法时间复杂度一般不相同, C选项错误。 2 【正确答案】 B 【试题解析】 栈是一种特殊的线性 表,它所有的插入与删除都限定在表的同一端进行。队列是指允许在一端进行插入,而在另一端进行删除的线性表。将A,B,C,D,E,F入栈后,栈中元素为 ABCDEF,退出三个元素入队,队列元素为FED,将 X,Y,Z入栈后栈中元素为 ABCXYZ,全部入队后,队列元素为FEDZYXCBA,故
14、B选项正确。 3 【正确答案】 D 【试题解析】 双向链表与二叉链表均是有两个指针域的链表, A选项错误。在单链表的第一个结点前增加一个表头结点,队头指针指向表头结点,最后一个结点的指针域的值由 NULL改为指向表头结点,这样 的链表称为循环链表。循环队列是队列的一种顺序存储结构。循环链表与循环队列是两种存储结构, B选项错误。双向链表结点有两个指针域,指向前一个结点的指针和指向后一个结点的指针,而带链的栈是单链表形式, C选项错误。故正确答案为 D选项。 4 【正确答案】 C 【试题解析】 在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。对任何一棵二叉树,度
15、为 0的结点(即叶子结点)总是比度为 2的结点多一个。二叉树共有 845个结点,度为 0的结点有 45个,度为1的结点数为 n1, 度为 2的结点数为 n2,则 845=45+n1+n2,且 45= n2+1,则n1=756, C选项正确。 5 【正确答案】 D 【试题解析】 需求分析阶段的工作可以分为个方面:需求获取、需求分析、编写需求规格说明书和需求评审,包括确定软件系统的功能, D选项正确。 A、 B、C选项均为开发阶段工作。 6 【正确答案】 B 【试题解析】 在测试之前制定测试计划,并严格执行,测试用例的选择不可随意,应选择有代表性的,尽可能发现迄今为止尚未发现的错误, A选项叙述正
16、确, B选项叙述错误。测试根本目的是尽可能多地发现并排除软件中 隐藏的错误, C选项叙述正确。软件测试是保证软件质量、可靠性的关键步骤, D选项叙述正确。故正确答案为 B选项。 7 【正确答案】 A 【试题解析】 结构化程序的三种基本控制结构:顺序、选择和重复,故 A选项正确。 8 【正确答案】 A 【试题解析】 数据库管理系统为完成主要功能提供了相应的数据语言,它们是:数据定义语言,该语言负责数据的模式定义与数据的物理存取构建;数据操纵语言,该语言负责数据的操纵,包括查询与增、删、改等操作;数据控制语言,该语言负责数据完整性、安全性的定义与检查以及并发控制 、故障恢复等功能。故A选项正确。
17、9 【正确答案】 A 【试题解析】 一般来说,实体集之间必须通过联系来建立联接关系,分为三类:一对一联系( 1:1)、一对多联系( 1:m)、多对多联系( m:n)。每个仓库存放有不同的零件,相同零件可能放在不同的仓库中,故实体仓库和零件间的联系是多对多, A选项正确。 10 【正确答案】 A 【试题解析】 用于查询的 3个操作无法用传统的集合运算表示,引入的运算为投影运算、选择运算、笛卡尔积。常用的扩充运算有交、除、连接及自然连接等。选择,从关系中找出满足给定条 件的元组的操作称为选择,题目中无给定条件,故 D选项错误。差: R-S结果是属于 R但不属于 S的记录组成的集合, T中元组“c
18、3 2“同时属于 R和 S, B选项错误。并: R S是将 S中的记录追加到 R后面,T中元组少于 R,故 C选项错误。交: RS结果是既属于 R又属于 S的记录组成的集合,与题目中结果相符,故 A选项正确。 11 【正确答案】 D 【试题解析】 C+的标识符由字母、数字和下划线组成,其中必须以字母或下划线开头。 A、 B、 C错误,答案为 D。 12 【正确答案】 D 【试题解析】 选项 A中, “+“运算符作为一元运算符,应该放在操作数之前,返回操作数本身;作为二元运算符,必须作用于两个操作数;选项 B中, “+“运算符是一元运算符,只能作用于一个操作数;选项 C中, 3是常量,不能用作赋
19、值操作符的左值;选项 D正确, “-“操作符作为一元运算符,放在操作数之前,对其操作数取负;答案为 D。 13 【正确答案】 C 【试题解析】 选项 A中,数组 x的后两个元素初值默认为 0;选项 B中,数组下标从 0开始, x0未赋初值, x3访问越界;选项 D中, x是整型变量,不是整型数组,赋值语法错误;只有 C正确,定义 整型数组 x,并对三个元素赋初值为 1;答案为 C。 14 【正确答案】 B 【试题解析】 常量 4.2是浮点型常量,一般按双精度处理,是 double型; 4.2f按单精度处理,是 float型; 4L是 long型。答案为 B。 15 【正确答案】 D 【试题解析
20、】 fun(&x, &y),函数调用参数列表中传递的是变量 x, y的地址,所以函数原型声明的形参列表中参数应该是两个整型变量地址, A、 B、 C选项中都包含引用传递,不正确;答案为 D。 16 【正确答案】 B 【试题解析】 函数定义时,形参 列表若不为空,需要给出函数的形参;调用函数时,参数列表若不为空,必须给出函数的实参;选项 A、 C、 D正确,选项 B错误;答案为 B。 17 【正确答案】 C 【试题解析】 重载函数调用时首先要从函数名称相同的候选函数中选择可行函数,可行函数必须满足两个条件: 1、函数的形参个数与该调用的实参个数相同;2、每个实参的类型必须与对应形参的类型匹配,或
21、者可被隐式转换为对应的形参类型。参数名称可以不相同,答案选 C。 18 【正确答案】 A 【试题解析】 重载运算符必须具有一个类类型的操作数,这条规则强制 重载运算符不能重新定义用于内置类型对象的运算符。选项 B、 C、 D正确, A错误,答案为 A。 19 【正确答案】 B 【试题解析】 函数 fun的形参 x为引用类型,函数功能是将形参 x与 y之和除以4的结果赋给 x,再对 x自增 1,通过引用类型修改实参; main函数中定义 x=4,y=5,所以通过函数 fun的调用, x的值被修改为: (4+5)/4 + 1 = 3,而 y的值不变,所以程序输出 3,5;答案为 B。 20 【正确
22、答案】 C 【试题解析】 函数 fun两个形参 x, y都是引用类型,函数功能是通过形参的引用 类型修改实参值,首先修改 y值为 x、 y之和;然后将修改后的 y值除以 4,结果赋给 x,再将 x自增 1; main函数中定义 x=4, y=5,通过 fun函数的调用,修改 y的值为 4+5=9, x的值为 9/4+1=3,最终输出结果为 3,9,答案为 C。 21 【正确答案】 B 【试题解析】 由调用函数 6.7-y可知, double类型在运算符 “-“的左边,应该作为运算符函数 “-“的第一形参,选项 A、 C错误;由于运算符 “-“函数并不改变操作数的状态,所以形参应该声明为 con
23、st对象的引用,或者按值传递,参数按引用类型传递可 能会改变操作数的状态,选项 D错误;答案为 B。 22 【正确答案】 C 【试题解析】 只有类定义或者声明在当前定义类前面出现过,数据成员才能被指定为该类类型,类 AA已经完成定义, v1, v2正确;类不能具有自身类型的数据成员,只要类名出现就可以认为该类已经声明,类的数据成员就可以是指向自身类型的指针或引用,类 BB在声明之后,定义之前是一个不完全类型,其数据成员只能是指向 BB类型的指针或引用, v4正确, v3错误;答案为 C。 23 【正确答案】 C 【试题解析】 基类 Base和派生类 Derived中使用同一名字的成员函数 fu
24、n,所以在派生类 Derived的作用域中,派生类 Derived中的 fun函数会屏蔽基类 Base中的 fun函数,即 Base的 fun函数对 Derived不可见,这是因为编译器在查找名字fun时,首先在 Derived中找到,这样编译器就不再继续查找,所以若想在Derived中调用 Base的 fun函数,必须显式的说明 fun函数属于 Base,这里使用作用域运算符访问被屏蔽的 fun,调用语句为: Base:fun();答案为 C。 24 【正确答案】 B 【试题解析】 protected方式继承中,基类的 public和 protected成员在派生类中为 protected成
25、员,答案为 B。 25 【正确答案】 C 【试题解析】 类 YY以 protected方式继承类 XX,所以类 XX中的 public成员和protected成员在 YY中为 protected成员,所以 YY中的 protected成员有: x2,x3, y2,答案为 C。 26 【正确答案】 B 【试题解析】 class关键字定义的类,成员默认的访问级别是私有的,所以类What中公有成员有 d,私有成员有 n, c;答案为 B。 27 【正确答案】 A 【试题解析】 一个类,如果没有显示定义的构造函数,那么编译器自动生成一个构造函数;一个类,如果显示定义了构造函数,无论个数多少,编译器也不
26、会再生成任何构造函数,所以一个类所拥有的构造函数至少有 1个,答案为 A。 28 【正确答案】 B 【试题解析】 首先类 How定义了一个默认构造函数 How(),因而编译器不会自动生成默认构造函数;其次 How中需要一个复制构造函数,这由编译器自动生成,所以 How有两个构造函数,答案为 B。 29 【正确答案】 A 【试题解 析】 在创建类的对象之前,必须完整的定义该类,在一个类的声明之后,定义之前,这个类是一个不完全类型,对于不完全类型,只能用于定义指向该类型的指针及引用,或者用于声明(不是定义)使用该类型作为形参类型或返回类型的函数;选项 A中,类 A中的 BB还未定义(也未声明),无
27、法创建 BB类对象,错误;选项 B中,声明之后定义的是指针或引用,正确;选项 C中,声明 BB之后定义 BB类的指针,定义 AA之后创建 AA类的对象,正确;选项 D中,声明 AA之后定义 AA类的引用,定义 BB之后创建 BB类的对象,正确;答案为 A。 30 【正确答 案】 A 【试题解析】 C+中,以 class关键字定义的类默认的访问级别为 private,另外对于公有继承,基类成员保持自己的访问级别( private成员除外),即基类的public成员为派生类的 public成员,基类的 protected成员为派生类的 protected成员;本题中, Derived类以 publ
28、ic方式继承 Base,所以 Derived中 public成员有: n, protected成员有: p, private成员有: k,不可见的成员有: m;这些成员中,对 Derived类对象可见的只有 public成员 n,答案为 A。 31 【正确答案】 B 【试题解析】 在类 How定义中没有定义任何构造函数,所以编译器会自动生成一个默认构造函数,同时还生成复制构造函数,所以类 How拥有两个构造函数,答案为 B。 32 【正确答案】 C 【试题解析】 派生类构造函数都是先调用基类构造函数,再根据声明次序定义数据成员,另外对于多继承,派生类的构造函数初始化列表中,基类构造函数是按照基
29、类在派生类的派生列表中出现的次序调用的;由于 Derived类的派生列表中,Base2在前,所以应该先调用 Base2的构 造函数,再调用 Base1的构造函数;销毁派生类对象时,总是按照构造函数运行次序的相反顺序调用析构函数,首先运行派生类析构函数,然后按继承层次依次向上调用各基类函数;所以 Derived对象销毁时,首先调用 Derived的析构函数,接着调用 Base1的析构函数,最后调用Base2的析构函数;输出结果为: “db1b2“,答案为 C。 33 【正确答案】 C 【试题解析】 程序定义了 Pay对象 p1, Pay对象数组 p2和 Pay对象指针 p3,编译器自动生成默认构
30、造函数初始化 p1对象和 p2的两个对象元素; p3没有 初始化,没有调用构造函数,答案为 C。 34 【正确答案】 A 【试题解析】 保护继承中,基类的 public和 protected成员在派生类中都是protected成员,所以类 Derived中, public成员为: k, protected成员为: n、p,没有 private成员, m对 Derived不可见; Derived对象 d可访问的只有 public成员,即 k;答案为 A。 35 【正确答案】 C 【试题解析】 p为 Pet类的引用类型,引用的对象是 my_dog, p-bark()用法是错误的,至于 选项 D,
31、&p是 p的地址,通过地址使用箭头访问运算符访问bark(),正确;答案为 C。 36 【正确答案】 C 【试题解析】 main函数中,调用 f1函数,创建局部对象 AA(Y),此时形参 a就是 AA(Y)对象,输出 a.value(),即 “Y“, f1函数执行完之后,需要销毁 AA(Y)对象,调用 AA类的析构函数 AA(),输出 “3“;接着程序调用 f2函数, f2函数创建局部对象的引用 a并初始化指向 AA(),此时引用 a所指对象的成员 c值为“X“,输出为 “X“, f2函数执行完之后,需要销毁 a所指对 象 AA(),调用 AA类的析构函数 AA(),输出 “3“,程序结束;运
32、行结果为: “Y3X3“,答案为 C。 37 【正确答案】 B 【试题解析】 ios_base:cur是指文件的当前位置; ios_base:end指向文件尾部;ios_base:beg指向文件开始; ios_base:out文件操作的文件模式;答案为 B。 38 【正确答案】 C 【试题解析】 题目中使用 MyTemp类模板定义了三种类型的类对象,所以生成的模板 MyTemp实例有 3个,答案为 C。 39 【正确答案】 C 【试题解析】 存在纯虚函数的类是抽象基类,选项 A错误;函数模板的形参表不能为空,不然定义函数模板也没有意义,选项 B错误;类模板中是可以包含构造函数的,选项 D错误。答案为 C。 40 【正确答案】 D 【试题解析】 派生类对基类成员的访问权限由基类成员的访问标识和类派生列表中的访问标识共同决定的,选项 A错误;多重继承的派生类可以有多个直接基类,选项 B错误;派生类构造函数可以隐式调用基类的默认构造函数初始化对象的基类部分,也可以在派生类构造函数初始化列表中显示调用基类构造函数,选项 C错误;答案为 D。