1、二级 C+笔试-289 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:35,分数:70.00)1.有如下程序:#includeiostreamusing namespace std;class XXprotected:int k;public:XX(int n=5):k(n);XX()cout“XX“:virtual void f()const=0;inline void XX:f()constcoutk+3;class YY:public XXpublic:YY()cout”YY”;void f()constcoutk-3; XX:f();int main()XX
2、 P.f();delete return 0:执行上面的程序将输出( )。(分数:2.00)A.28XXB.28YYXXC.33XXD.33XXYY2.在 E-R 图中,用来表示属性的图形是( )。(分数:2.00)A.矩形B.椭圆形C.菱形D.平行四边形3.有 3 个结点的二叉树有( )。(分数:2.00)A.2 种形态B.4 种形态C.7 种形态D.5 种形态4.函数 swap(a, n)可完成对 a 数组从第 1 个元素到第 n 个元素两两交换。其中 b0=1;b1=2; swap(b, 2)。在运行调用函数中的语句后,b0和 b1的值分别为( )。(分数:2.00)A.1,1B.1,2
3、C.2,2D.2,15.有如下函数模板:templateT cast(Uu)return u;其功能是将 U 类型数据转换为 T 类型数据。已知 i 为 int 型变量,下列对模板函数 cast 的调用中正确的是( )。(分数:2.00)A.cast(i);B.cast(i);C.cast(i);D.cast(i);6.如果表达式 y*x+中,“*”是作为成员函数重载的运算符,“+”是作为友元函数重载的运算符,采用运算符函数调用格式,该表达式还可表示为( )。(分数:2.00)A.operator+(0).operator*(y)B.operator*(x.operator+(0), y)C.
4、operator*(operator+(x, 0)D.operator*(operator+(x, 0), y)7.下列关于虚函数的描述中,正确的是( )。(分数:2.00)A.虚函数是一个 static 类型的成员函数B.虚函数是一个非成员函数C.基类中采用 virtual 说明一个虚函数后,派生类中定义相同原型的函数时可不必加 virtual 说明D.派生类中的虚函数与基类中相同原型的虚函数具有不同的参数个数或类型。8.以下程序的执行结果是( )。#includeiostream.h#includeiomanip.hvoid fun(int n)if(n!=0)fun(n-1);for(i
5、nt i=1; i(i);C.cast(i);D.cast(i); 解析:解析 选项 D)是将 double 类型的数据转化成 int 类型的数据,正确。6.如果表达式 y*x+中,“*”是作为成员函数重载的运算符,“+”是作为友元函数重载的运算符,采用运算符函数调用格式,该表达式还可表示为( )。(分数:2.00)A.operator+(0).operator*(y)B.operator*(x.operator+(0), y)C.operator*(operator+(x, 0) D.operator*(operator+(x, 0), y)解析:解析 运算符函数有两种调用形式,第一种是像一
6、般函数那样用函数名调用,即 y.operator*(z)或者 operator*(y,z);另一种是通过运算符构成表达式,即 y*z。因为“+”运算符既可以作为前缀运算符,又可以作为后缀运算符,所以重载这个运算符时,重载后缀“+”时必须多一个虚拟参数:int。7.下列关于虚函数的描述中,正确的是( )。(分数:2.00)A.虚函数是一个 static 类型的成员函数B.虚函数是一个非成员函数C.基类中采用 virtual 说明一个虚函数后,派生类中定义相同原型的函数时可不必加 virtual 说明 D.派生类中的虚函数与基类中相同原型的虚函数具有不同的参数个数或类型。解析:解析 此题考查虚函数
7、的概念。在成员函数声明的前面加上 virtual 修饰,即把该函数声明为虚函数。虚函数只能是类中的一个成员函数,但不能是静态成员函数,所以选项 A)和 B)错误;在派生类中重新定义虚函数时必须有相同的函数类型,包括函数的返回类型、函数名、参数个数、参数类犁的顺序必须相同。故选项 D)错误。8.以下程序的执行结果是( )。#includeiostream.h#includeiomanip.hvoid fun(int n)if(n!=0)fun(n-1);for(int i=1; i=n; i+)coutsetw(3)i;coutend1;void main()fun(3);(分数:2.00)A.
8、00 10 1 2B.11 21 2 3 C.12 23 3 3D.123解析:解析 首先由程序中的主函数 main 入手,调用 fun 函数,参数为 3。fun(n)函数在其内部,当 n不等于 0 时,递归调用 fun(n-1)。当参数为 3 时,fun(3)调用 fun(2),然后利用 for 循环输出 i 值,当 n=1 时,只输出 1,输出回车后,就跳入 fun(2),输出 1,2,最后输出是 1,2,3。9.已知枚举类型定义语句为:enum TokenNUMBER, PLUS=5, MINUS, PRINT=10;则下列叙述中错误的是( )。(分数:2.00)A.枚举常量 NAME
9、的值为 1 B.枚举常量 NUMBER 的值为 1C.枚举常量 MINUS 的值为 6D.枚举常量 PRINT 的值为 10解析:解析 此题考查的是枚举类型的声明。声明枚举类型的语法形式为:enum 类型名枚举值表。需注意的是:当 n 个枚举值全部未赋常量值时,它们自左至右分别与整数 0、1、2、3n-1 对应;若第 i 个枚举值赋常量值为 m,则其未赋常量值的后续枚举值分别与整数 m+1、m+2对应,直到下一个赋了值的枚举值或结束。枚举常量 NAME 的值为 0。10.阅读下面的程序:#includeiostream.hvoid main()int x;cinx;if(x+5)coutxen
10、d1;elsecoutx-end1;如果两次执行上述程序,且键盘输入分别为 4 和 6,则输出结果分别是( )。(分数:2.00)A.4,6B.3,6C.4,7D.5,7 解析:解析 此题首先读入数值 4 赋给变量 x,因为 x+5 不成立,因为“+”后缀,之后 x 的值变为5,执行语句 coutx-end1;输出:5,之后 x 的值变为 4。当读入的数值是 6 时,因为 x+5 成立,所以执行语句 coutxend1;输出 7。11.将以下程序写成三目运算表达式是( )。if(xy)min=x;else min=y;(分数:2.00)A.min=(xy)?x:yB.min=(xy)?x:y
11、C.min=(xy)x:yD.min=(xy)?x,y解析:解析 题日中给出的程序是求 x,y 中的小值。即如果 x 小于 y,那么 min=x,否则 min=y。条件运算符为“?:”,(xy)?x:y 是当 x 小于 y 时取 x,否则取 y。12.在 C+程序中,如果要求通过函数来实现一种简单的功能,并且要求尽可能加快程序执行速度,则应该选用( )。(分数:2.00)A.内联函数 B.重载函数C.递归调用D.嵌套调用解析:解析 此题考查的是内联函数的相关知识点。C+引入内联函数是用它来代替 C 语苦中的预处理宏函数,内联函数在调用时,是将表达式用内联函数体来替换,这样会加快程序的执行速度。
12、13.定义如下枚举类型:enumMonday, Tuesday, Wednesday, Thrusday, Friday=2;,则下列 x 语句正确的是( )(分数:2.00)A.表达式 Wednesday=Friday 的值是 true B.Day day;day=3C.Day day;day=Monday+3D.Day day;day=Tuesday+10解析:解析 enum枚举类型名枚举元素表;其中:关键词 enum 表示定义的是枚举类型,枚举类型名由标识符组成,而枚举元素表由枚举元素或枚举常量组成。其中 enumMonday, Tuesday, Wednesday, Thrusday,
13、 Friday=2的值由 0 开始,即 0,1,2,3。D 中的本题中的枚举类型中的数据值Wednesday 为 2,而 Friday 的值赋值为 2,所以判断 Wednesday 等于 Friday 的表达式值为真,即 true。即选择 A)。14.用白盒法设计测试用例的方法包括( )。(分数:2.00)A.错误推测B.因果图C.基本路径测试 D.边界值分析解析:解析 白盒测试方法也称为结构测试或逻辑测试,主要方法有逻辑覆盖测试、基本路径测试等。15.有如下程序:#includeiostreamusing namespace std;class Apublic:static int a;vo
14、id init()a=1;A(int a=2)init(); a+;int A:a=0;A obj;int main()coutobj.a;return 0;运行时输出的结果是( )。(分数:2.00)A.0B.1 C.2D.3解析:解析 此题实际考查的是变量作用域的屏蔽效应。在 C+中,当标识符的作用域发生重叠时,在一个函数中声明的标识符可以屏蔽函数外声明的标识符或全局标识符。声明类 A 的全局对象时,构造函数首先调用 int 函数,但由于静态成员变量 a 被构造函数内部的形参 a 所屏蔽所以 a+改变的是形参 a 的值,对静态成员变量 a 没有影响。16.软件结构设计的图形工具是( )。(
15、分数:2.00)A.DFD 图B.结构图 C.PAD 图D.N-S 图解析:解析 常用的软件结构设计工具是结构图,也称程序结构图。DFD 图(数据流图)是以图形的方式描述数据在系统中流动和处理的过程,只反映系统必须完成的逻辑功能,它是需求分析阶段的图形工具。盒式图(N-S 图)和问题分析图(PAD)是详细设计的常用工具。17.下列关于继承的描述中,错误的是( )。(分数:2.00)A.析构函数不能被继承B.派生类是基类的组合C.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类保持不变 解析:解析 派生类中继承的基类成员的访问权限到派生类会发生变
16、化,例如:私有继承时,派生类不能访问基类的成员,所以选项 D)错误,其他选项均止确。18.有如下程序:#includeiostreamvoid fun(int x=y; y=t;int main()int a2=23,42;fun(a1,a0);std:couta0“,“a1std:end1;return 0;执行后的输出结果是( )。(分数:2.00)A.42,42B.23,23 C.23,42D.42,23解析:解析 此题考查的是函数的调用以及参数值的传递。函数。fun 中的第一个参数是引用传值方式,是双向的;第二个参数是按值传递,是单向的。19.下列数据结构中,能用二分法进行查找的是(
17、)。(分数:2.00)A.顺序存储的有序线性表 B.线性链表C.二叉链表D.有序线性表解析:解析 要对线性表进行二分法查找,对线性表有两个要求:第一,要求线性表是按顺序方式存储的;第二,要求线性表中的元素是按照从小到大的顺序排好序。20.执行完下列代码段之后:bool x=true, y=false, z=false;x=xy=xyz=!(x!=y)(y-z);则 x=false, y=false, Z=( )。(分数:2.00)A.true B.falseC.不确定D.异常解析:解析 其中“x=x void set(int n)k=n;int get() constreturn k;clas
18、s MyDERIVED: protected MyBASEprotected:int j;public:void set(int m, int n)MyBASE:set(m);j=n;int get() constreturn MyBASE:get()+j;则类 MyDERIVED 中保护的数据成员和成员函数的个数是( )。(分数:2.00)A.4B.3 C.2D.1解析:解析 因为在保护继承的情况下,基类中的公有成员 void set(int n)和 int get() const 在派生类中是保护成员,再加上派生类自身的保护成员 j,一共是三个保护成员。27.如果表达式-x/y 中的“-”
19、和“/”是作为友元函数重载的运算符,采用运算符函薮调用格式,该表达式还可表示为( )。(分数:2.00)A.operator/(x.operato-(), y);B.operator/(operator-(x), y); C.operator-().operator/(y);D.operator/(operator-(x);解析:解析 运算符重载实际上时函数的重载。重载运算符的一般格式:函数类型 operator 运算符名称(参数表)。重载运算符之后:函数 operator+重载运算符“+”。“-”重载为“operator-;”,“/”重载为“operator/”。另外重载不能改变运算的优先级
20、,-x/y 计算-x 后,除以 y,所以表达式改写为:operator/(operator-(x),y);。28.关于虚函数,以下说法正确的是( )。(分数:2.00)A.若在重定义虚函数时使用了 virtual,则该重定义函数还是虚函数B.虚函数不能声明为友元C.子类必须重定义父类的虚函数D.虚函数不能是 static 的 解析:解析 在 C+中,虚函数可以是友元函数,但不能是静态成员。虚函数的重定义函数,无论是否使用 virtual 关键字,仍然是虚函数。所以答案选择 D)。29.下列关于纯虚函数与抽象类的描述中,错误的是( )。(分数:2.00)A.纯虚函数是一种特殊的虚函数,它没有具体
21、的实现B.抽象类是指具有纯虚函数的类C.一个基类中说明具有纯虚函数,该基类的派生类一定不再是抽象类 D.抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出解析:解析 纯虚函数是在声明虚函数时被“初始化”为 0 的虚函数。不定义对象而只作为一种基本类型用作继承的类,称为抽象类。凡是包含纯虚函数的类都是抽象类。抽象类的作用是作为一个类族的共同基类。30.有以下程序,在横线应添加( )。#includeiostreamusing namespace std;class TestClasspublic:TestClass(int n)number=n;_拷贝构造函数TestClass()priva
22、te:int number;:TestClass fun(TestClass P)TestClass temp(p);return temp;int main()TestClass obj1(10), obj2(0);TestClass obj3(obj1);obj2=fun(obj3);return 0;(分数:2.00)A.TestClass(TestClass B.TestClass(TestClass other)number=other.number;C.TestClass(TestClass )D.TestClass(解析:解析 拷贝构造函数也是构造函数,但它只有一个参数,这个参数
23、是本类的对象,即 other,所以赋值操作将本类的参数 other.number 赋值给 number;而且采用对象的引用的形式,也就是SetVariable(int i)value=i;private:int value;则对下列语句序列正确的描述是( )。MyClass*P,my;p=(分数:2.00)A.语句 p=k=j;for(i=j;in;i+)ifaiak)_;return(k);(分数:2.00)A.k=i B.k=jC.i=jD.i=n解析:解析 函数 fun 中首先定义整型变量 k 用来存放返回最大值的下标,并将其首先指向第一个元素,即 k=j。然后在 for 循环中依次将当
24、前元素 ai与标识为最大值的元素进行比较,如果当前元素大于这个标识元素,那么将最大值标识为当前元素,即 k=i。二、填空题(总题数:15,分数:30.00)36.数据结构分为逻辑结构和存储结构,循环队列属于 1 结构。(分数:2.00)填空项 1:_ (正确答案:逻辑)解析:解析 数据的逻辑结构主要是反映数据之间的逻辑关系,而存储结构是用来反映数据的逻辑结构在计算机存储空间中的存放形式。循环队列主要是强调数据之间的关系,因此属于逻辑结构。37.数据库系统其内部分为三级模式,即概念模式、内模式和外模式。其中, 1 是用户的数据视图,也就是用户所见到的数据模式。(分数:2.00)填空项 1:_ (
25、正确答案:外模式)解析:解析 数据库系统的三级模式分别是内模式、概念模式和外模式。其中,物理模式给出了数据库的物理存储结构和存取方法;概念模式是数据库系统中全局数据逻辑结构的描述;外模式是用户的数据视图,也就是用户所见到的数据模式。38.软件开发环境是全面支持软件开发全过程的 1 集合。(分数:2.00)填空项 1:_ (正确答案:软件工具)解析:解析 软件开发环境或称软件工程环境是全而支持软件开发全过程的软件工具集合。这些软件工具按照一定的方法或模式组合起来,支持软件生命周期内的各个阶段和各项任务的完成。39.一棵二叉树中序遍历结果是 ABCDEFG,前序遍历结果是 DBACFEG,则后序遍
26、历结果为_。(分数:2.00)填空项 1:_ (正确答案:ACBEGFD)解析:解析 我们分 4 大步骤来推理:找到根结点:由于前序遍历首先访问根结点,那么前序遍历结果的第一个结点肯定就是整个二叉树的根结点。前序遍历结果是 DBACFEG,可知 D 为二叉树的根结点。分出左、右子树:中序遍历中,访问根结点的次序为居中,先访问左子树,再访问右子树。因此,在中序遍历的结果 ABCDEFG 中,以根结点 D 为中间界线,前面的 ABC 在左子树,后面的 EFG 在右子树。分析左子树:首先确定左子树 ABC 的根点。在前序遍历中,B 最靠前,应该是 ABC 三个结点的根结点;在中序遍历中,A 靠前,应
27、该是 ABC 三个结点的左子树,C 为右子树。分析右子树:同理分析 EFG 三个结点,就可以完整地画出整个二义树的原貌了。*知识拓展 本题看似较难,其实比较简单。考生最关键的是把握中序、前序和厉序遍历的定义,通过_二者不同的遍历顺序,互相对照、步步推理,就能很快得到答案。40.某二叉树中度为 2 的结点有 12 个,则该二叉树中有 1 个叶子结点。(分数:2.00)填空项 1:_ (正确答案:13)解析:解析 度为 0 的结点(即叶子结点)总比度为 2 的结点多一个。41.若有以下程序:#includeiostreamusing namespace std;class TestClass 1p
28、ublic:TestClass1()X=0;int x;class TestClass2:virtual public TestClass1public:TestClass2()x=10;class TestClass3:virtual public TestClass 1public:TestClass3()x=20;class TestClass4:public TestClass2, protected TestClass3;int main()TestClass4 obj;coutobj.xend1;return 0:该程序运行后的输出结果是_。(分数:2.00)填空项 1:_ (正确
29、答案:20)解析:解析 主函数中定义 TestClass4 的对象 obj。TestClass4 虽然公有继承于 TestClass2,但是 x在其中为私有,所以无法访问。TestClass4 保护继承于 TestClass3,TestClass3 中的 x=20 为公有成员数据,对象 obj 可以访问这个数据,即输出为 20。42.指针变量所保存的不是一般的数据值,而是程序中另一个对象的 1。(分数:2.00)填空项 1:_ (正确答案:内存地址)解析:解析 指针变量指向的不是变量保存的数据值,而是变量的地址,所以指针变量保存的是对象的内存地址。43.以下程序的输出结果是_。#include
30、iostream.hint add(int x, int y)return x+y;double add(double x, double y)return x+y;void main()int a=3, b=3;double c=6.5, d=1.5;coutadd(a, b)“,“add(c, d)end1;(分数:2.00)填空项 1:_ (正确答案:6,8)解析:解析 C+中允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同,这就是函数的重载,调用函数时,系统会根据调用函数时给出的信息,即参数的个数、类型查找与之匹配的函数,然后调用该函数。主函数中的输出语句第一个 add
31、根据 a,b 参数类型为整型,调用第一个参数为 int 类型的 add。即输出 6。同理第二个 add(c, d)调用参数为 double 型的 add 函数,输出为 8。44.下面程序运行时输出结果为_。#includeiostream.h#includeclass Rectpublic:Rect(int l, int w)length=l; width=w;)void Print()cout“Area:“length*widthend1;void operator delete(void*p)free(p);private:int length, width;void main()Rect
32、 *p;p=new Rect(5, 4);p-Print();delete p;(分数:2.00)填空项 1:_ (正确答案:Area:20)解析:解析 此题考查的是内存空间的分配和释放,即 free 和 delete 函数的应用。使用 new 对某种类型的变量进行动态分配的语法格式为:指针=new 类型;使用 delete 对动态分配的变量进行释放是:delete 指针。此题中,首先为变量分配内存单元,然后执行语句 p-Print();输出 Area:20,然后利用 delete 释放内存单元。45.类中数据成员和成员函数的默认访问级别为 1。(分数:2.00)填空项 1:_ (正确答案:私
33、有 或 private)解析:解析 此题考查的是类的成员的默认访问权限。在未声明,即默认情况下,类中数据成员和成员函数的默认访问级别为私有。46.有如下程序:#includeiostreamusing namespace std;class PARENTpublic:PARENT()cout“PARENT“;);class SON:public PARENTpublic:SON()cout“SON“;int main()SON son;PARENT *p;p=return 0;执行上面程序的输出是_。(分数:2.00)填空项 1:_ (正确答案:PARENTSON)解析:解析 此题考查的是派生
34、类和基类的构造函数。派生类构造函数的执行顺序为:首先调用基类的构造函数,调用顺序按它们被继承时说明的顺序;然后调用子对象的构造函数,调用顺序按它们在类中说明的顺序;最后是派生类构造函数中的内容。SON son;执行时首先调用基类的构造函数,输出“PARENT”,然后调用派生类的构造函数输出“SON”。需要注意的是,语句 PARENT *p;只是定义一个PARENT 类的指针,并不调用构造函数。47.以下程序的执行结果是_。#includeiostream.h#includestdliB.hclass Samplepublic:int x, y;Sample()x=y=0;Sample(int
35、a, int b)x=a;y=b;void disp()cout“x=“x“, y=“yend1;void main()Sample s1(2,3);s1.disp();(分数:2.00)填空项 1:_ (正确答案:x=2,y=3)解析:解析 此题考查的是构造函数重载。语句 Sample s1(2,3)调用的类的构造函数应该是含有两个参数的 Sample(int a, int b)x=a; y=b;函数,所以输出的结果是 x=2,y=3。48.下列函数的功能是判断字符串 str 是否对称,对称则返回 true,否则返回 false。请在横线处填上适当内容,实现该函数。bool fun(char
36、 *str)int i=0,j=0;while(strj) j+;for(j-;ij i+,j-);return i_j;(分数:2.00)填空项 1:_ (正确答案:=)解析:解析 此题考查的是 while 循环语句和 for 循环语句。题中函数的功能是判断字符串是否对称。从字符串两端依次比较各个字符是否相同,for 循环结束后,当 i=j 表明字符串对称,否则说明不对称。49.若下面程序运行时输出结果为:1,A,10.12,B,3.5请将程序补充完整。#includeiostreamusing namespace std;int main()void test(int, char,doub
37、le_);test(1, A, 10.1);test(2, B);return 0;void test(int a, char b, double c)couta,b,cend1;(分数:2.00)填空项 1:_ (正确答案:=3.5)解析:解析 本题考查了函数默认参数的应用。本题中第一次调用 test()函数数值 1,A,10.1;第二次调用少了一个实参,却要求输出 2,B,3.5,南此分析,应将 test()函数的第三个参数声明为默认参数。且默认为 3.5,才能达到要求的输出结果。故应填入=3.5 或者 c=3.5。50.有如下类声明:class MyClassint i;private: int j;protected: int k;public: int m, n;其中,私有成员的数量为_。(分数:2.00)填空项 1:_ (正确答案:2)解析:解析 此题考查的是类的成员的默认访问权限。在默认情况下,类中数据成员和成员函数的默认访问级别为私有,所以类中的私有成员有 2 个,i 和 j。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1