1、二级 C+笔试 12 及答案解析(总分:88.00,做题时间:90 分钟)一、B选择题/B(总题数:30,分数:60.00)1.下面是类 MyClass 的定义,对定义中各种语句描述正确的是( )。 class MyClass publiC: void MyClass(int a) / x=a; ) int func(int a,int b) / x=a; y=b; int func(int a,int b,int c=0) / x=a; y=b; z=c; static void resetValue() / x=0; private: int X,y,Z; ;(分数:2.00)A.语句是类
2、 MyClass 的构造函数定义B.语句和语句实现类成员函数的重载C.语句实现对类成员变量 x 的清零操作D.语句、和都不正确2.若有以下程序: #include iostream using namespace std; class Base public: Base() x=0; int x; ; class Derivedl : virtual public Base public: Derivedl() x=10; ; class Derived2 : virtual public Base public: Derived2() x=20; ; class Derived : publ
3、ic Derivedl,protected Derived2 ; int main () Derived obj; coutobj.xend1; return 0; 该程序运行后的输出结果是( )。(分数:2.00)A.10B.20C.30D.03.有以下程序: #include iostream using namespace std; int main() int num23,*p; int t,i,j,k=10; p=num0; for(i=0;i2;i+) for(j=0;j3;j+) k+; *p=k; for(t=2;t*p;t+) if(!(*pt) j-; *p-; break
4、; *p+; cout*(p-1)end1; return 0; 程序运行后的输出结果是( )。(分数:2.00)A.19B.11C.29D.234.有以下程序: #includeiostream using namespace std; class MyClass public: MyClass();MyClass(); void SetValue(int val); private: static int i; ; int MyClass:i=0; MyClass:MyClass() i+; couti; MyClass:MyClass() i-; couti; void MyClass:
5、SetValue(int val) i=val; int main() MyClass*my2; int k; for(k=0;k2;k+) myk=new MyClass; for(k=0;k2;k+) delete myk; return 0; 运行后的输出结果是( )。(分数:2.00)A.1210B.1100C.1234D.输出结果不确定5.为使该程序执行结果为 10,那么应该在程序划线处填入的语句是( )。 #includeiostream using namespace std; class MyClass public: MyClass (int a) x=a; _ /取 x 值
6、 private: int x; ; int main() MyClass my(10); coutmyGetNum()end1; return 0; (分数:2.00)A.return x;B.int GetNum() return x;C.intreturn x;D.void GetNum()return x;6.设有以下定义和程序: #include iostream.h class A1 public: void showl() cout“class A1“end1; ; Class A2 : public A1 public: void show2() cout“Class A2“e
7、nd1; ; Class A3 : protected A2 public: void show3() cout”Class A 土”end1; ; void main() A1 obj1; A2 obj2; A3 obj3; 则以下不合语法的调用语句是( )。(分数:2.00)A.obj1show1();B.obj2show1();C.obj3show1();D.obj2show2();7.如果对一个关系实施了一种关系运算后得到了一个新的关系,而且新的关系中属性个数少于原来关系中属性个数,这说明所实施的运算关系是( )。(分数:2.00)A.选择B.投影C.连接D.并8.若要求尽可能快地对实
8、数数组进行稳定的排序,则应选( )。(分数:2.00)A.快速排序B.堆排序C.归并排序D.基数排序9.有以下程序: #includeiostream using namespace std; int main() char a10 = 1,2,3,4,5,6,7,8,9,0),*p; int i=8; p=a+i; coutp-3end1; return 0; 执行程序后的输出结果是( )。(分数:2.00)A.6B.6789C.6D.78910.下列叙述不属于线性链表较之线性表顺序存储结构的优点的是( )。(分数:2.00)A.线性链表存储方式简单B.线性链表运算效率高C.线性链表的存储空
9、间易于扩展D.线性链表便于存储空间的动态分配11.下列关于虚基类的描述中,错误的是( )。(分数:2.00)A.虚基类子对象的初始化由派生类完成B.虚基类子对象的初始化次数与虚基类下面的派生类的个数有关C.设置虚基类的目的是消除二义性D.带有虚基类的多层派生类构造函数的成员初始化列表中都要列出对虚基类构造函数的调用12.关系数据库的概念模型是( )的集合。(分数:2.00)A.关系模型B.关系模式C.关系子模式D.存储模式13.有以下程序: #includeiostream #includestring using namespace std; int main() char arr24; s
10、trcpy(arr0,“you“); strcpy(arr1,“me“); arr03= class point int x, y; public: point( int vx, int vy ) x = vx; y = vy; point ( ) x = 0; y = 0; point operator+( point pl ) point p; int px = x + p1.x; int py = y + p1.y; return point( px, py ); point operator-( point p1 ) point p; int px = x - p1.x; int py
11、 = y - p1.y; return point( px, py ); void print() coutx“, “yend1; ; int main () point pl ( 10, 10 ), p2 ( 20, 20 ); p1 = p1 + p2; p1.print (); return 0; 执行后的输出结果是( )。(分数:2.00)A.10,10B.20,20C.10,20D.30,3017.若有数组名作为实参,则传递给形参的是( )。(分数:2.00)A.数组的首地址B.第一个元素的值C.数组中全部元素的值D.数组元素的个数18.按照标识符的要求,下列选项中,( )符号不能组
12、成标识符。(分数:2.00)A.连接符B.下划线C.大小写字母D.数字字符19.若有函数调用语句: fun(a+b,(x,y),fun(n+k,d,(a,b,); 那么在此函数调用语句中实参的个数是( )。(分数:2.00)A.3B.4C.5D.620.下列关于 break 语句的描述中,不正确的是( )。(分数:2.00)A.break 语句可用于循环体内,它将使执行流程跳出本层循环B.break 语句可用于 switch 语句中,它将使执行流程跳出当前 switch 语句C.break 语句可用于 if 体内,它将使执行流程跳出当前 if 语句D.break 语句在一层循环体中可以出现多次
13、21.有以下程序: #includeiostream using namespace std; int main( ) int a=5;b=4,c=3,d=2; if(abc) coutdend1; else if(c-1:d) =1) coutd+1end1; else coutd+2end1; return 0; 执行后的输出结果是( )。(分数:2.00)A.2B.3C.4D.编译时有错,无结果22.在关系代数中,对一个关系投影操作以后,新关系的元组个数跟原来关系的元组个数相比( )。(分数:2.00)A.小于B.小于或等于C.等于D.大于23.设有以下变量定义,并已赋确定的值: cha
14、r w; int x; float y; double z; 则表达式:w*x+z-y 所求得的数据类型为( )。(分数:2.00)A.charB.intC.floatD.double24.下列关于单目运算符+、-的叙述中,正确的是( )。(分数:2.00)A.它们的运算对象可以是任何变量和常量B.它们的运算对象可以是 char 型变量和血型变量,但不能是 float 型变量C.它们的运算对象可以是 int 型变量,但不能是 doule 型变量和 float 型变量D.它们的运算对象可以是 char 型变量、int 型变量和 float 型变量25.有以下程序: #include iostre
15、am #include cstdlib using namespace std; int main() int arraysize; int *array; cout“Please input the size of the array:“; cinarraySiZe; array=new intarraysize; if(array=NULL) cout“allocate Error/n“; exit(1); for(int i=0;iarraysize;i+) arrayi=i*i; int j; cout“which element you want to check:“; cinj;
16、coutarrayjend1; return 0; 执行程序输入:10空格5,则输出结果为( )。(分数:2.00)A.allocate ErrorB.1C.0D.2526.函数重载是指( )。(分数:2.00)A.两个或两个以上的函数取相同的函数名,但形参的个数或类型不同。B.两个以上的函数取相同的名字和具有相同的参数个数,但形参的类型可以不同。C.两个以上的函数名字不同,但形参的个数或类型相同。D.两个以上的函数取相同的函数名,并且函数的返回类型相同。27.下面关于对象的描述中正确的是( )。(分数:2.00)A.任何对象都必须具有继承性B.任何对象都必须具有多态性C.操作是对象的静态属性
17、D.对象间的通信靠消息传递28.以下叙述中不正确的是( )。(分数:2.00)A.C+语言中的文本文件以 ASCII 码形式存储数据B.C+语言中对二进制文件的访问速度比文本文件快C.使用函数 open()打开的文件使用完毕后,必须使用 close()函数将其关闭D.C+语言中,随机读写方式不适用于文本文件29.设有下列二叉树(如下图所示)对此二叉树中序遍历的结果是( )。 (分数:2.00)A.ABDGCEHIFB.DGBAHEICFC.GDBHIEFCAD.ABCDEFGHI30.在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是( )。(分数:2.00)A.希尔排序B.冒泡排
18、序C.插入排序D.选择排序二、B填空题/B(总题数:14,分数:28.00)31.在面向对象方法中,信息隐蔽是通过对象的U 【1】 /U来实现的。(分数:2.00)填空项 1:_32.任何非空树中有且仅有一个结点没有前驱结点,该结点就是树的U 【2】 /U。(分数:2.00)填空项 1:_33.常见的需求分析方法有U 【3】 /U和面向对象的分析方法。(分数:2.00)填空项 1:_34.在关系模型中,把数据看成一个二维表,每一个二维表称为一个U 【4】 /U。(分数:2.00)填空项 1:_35.在数据库应用系统设计的需求分析阶段,需经过收集资料、分析整理、U 【5】 /U、建立数据字典和用
19、户确认等阶段。(分数:2.00)填空项 1:_36.下列程序在输入 m 后,求满足条件“n!=m=(n+1)!”的值 n,请将程序补充完整。 #include iostream using namespace std; int main() int n,m, jc = 1; cinm; for(n=2;jc=m;n+) jc = jc*n; cout“n=“U 【6】 /Uend1; return 0; (分数:2.00)填空项 1:_37.以下函数的功能是删除字符串 s 中的所有数字字符。请填空。 void dele (char *s) int n=O; for(i=0;si;i+) if(
20、U 【7】 /U) sn+=si; sn= /0; (分数:2.00)填空项 1:_38.下面程序的运行结果是U 【8】 /U #include iostream using namespace std; int fun(int n) static int m = 2; m=m+n; return m; int main ( ) int a = 3, b = 4; int x; x = fun( a ); x = fun( b ); coutxend1; return O; (分数:2.00)填空项 1:_39.如果类 Alpha 继承了类 Beta,则类 Alpha 称为派生类,类 Beta
21、 称为U 【9】 /U类。(分数:2.00)填空项 1:_40.实现编译时的多态性的机制称为U 【10】 /U,实现运行时的多态性的机制称为U 【11】 /U。(分数:2.00)填空项 1:_41.下面程序是一个堆栈的类模板,在横线处填上适当语句,完成类模板的定义。 #define MAXSIZE 100 template class T class Stack T sMAXSIZE; int top; public: stack() top=1; void push(T newValue) if(topMAXSIZE) top=top+1; stop=newValue; else cout“
22、堆栈满,无法进栈“end1; void pop(); ; U 【12】 /U if(top1) coutstopend1; top=top-1; else cout“堆栈空! “end1; (分数:2.00)填空项 1:_42.下面程序的输出结果是U 【13】 /U。 #include iostream using namespace std; class A int a, b; public: A() a = b = 0; A(int aa, int bb ) : a(aA) , b(bB) cout “a=“a“,“b=“b“,“; A() cout“D“; ; int main ( )
23、A x, y(2, 3); return 0; (分数:2.00)填空项 1:_43.若有以下程序: #include iostream using namespace std; class Base public: void who() cout“class Base“end1; ; class Derivedl : public Base public: void who() cout“class Derivedl“end1; ; class Derived2 : public Base public: void who() cout“class Derived2“end1; ; int
24、main() Base *p; Derivedl obj1; Derived2 obi2; p= p= p-who ( ); return 0; 则该程序运行后的输出结果是U 【14】 /U。(分数:2.00)填空项 1:_44.有以下程序: #include fstream #include string using namespace std; int main () char ch = “The end“; ofstream outstr( “d:/put.txt“, ios_base: :app); for (int i = 0; i strlen( ch ); i+ ) outstr
25、.put(chi); outstr.close(); return 0; 程序实现的功能是U 【15】 /U。(分数:2.00)填空项 1:_二级 C+笔试 12 答案解析(总分:88.00,做题时间:90 分钟)一、B选择题/B(总题数:30,分数:60.00)1.下面是类 MyClass 的定义,对定义中各种语句描述正确的是( )。 class MyClass publiC: void MyClass(int a) / x=a; ) int func(int a,int b) / x=a; y=b; int func(int a,int b,int c=0) / x=a; y=b; z=c
26、; static void resetValue() / x=0; private: int X,y,Z; ;(分数:2.00)A.语句是类 MyClass 的构造函数定义B.语句和语句实现类成员函数的重载C.语句实现对类成员变量 x 的清零操作D.语句、和都不正确 解析:解析 类的构造函数没有返回类型,所以语句是错误的;语句和语句将会使函数 func()的调用产生歧义;成员函数 resetValue()是静态成员函数,那么它不能访问类 MyClass 中的非静态数据成员,所以语句也不正确。2.若有以下程序: #include iostream using namespace std; cla
27、ss Base public: Base() x=0; int x; ; class Derivedl : virtual public Base public: Derivedl() x=10; ; class Derived2 : virtual public Base public: Derived2() x=20; ; class Derived : public Derivedl,protected Derived2 ; int main () Derived obj; coutobj.xend1; return 0; 该程序运行后的输出结果是( )。(分数:2.00)A.10B.2
28、0 C.30D.0解析:解析 本题中,虽然 Derived1 和 Derived2 都是由共同的基类 x 派生而来的,但由于引入了虚基类,使得它们分别对应基类的不同副本。这时数据成员 x 只存在一份拷贝,不论在类 Derived1 修改,还是在类 Derived2 中修改,都是直接对这惟一拷贝进行操作。本题程序执行语句“Derived obj”时,就会先调用虚基类 Base 的构造函数,使得 x=O,然后执行类 Derived1 的构造函数使得 x=10,再执行类Derived2 的构造函数,使得 x=20。最后输出 x 的值为 20。3.有以下程序: #include iostream us
29、ing namespace std; int main() int num23,*p; int t,i,j,k=10; p=num0; for(i=0;i2;i+) for(j=0;j3;j+) k+; *p=k; for(t=2;t*p;t+) if(!(*pt) j-; *p-; break; *p+; cout*(p-1)end1; return 0; 程序运行后的输出结果是( )。(分数:2.00)A.19B.11C.29 D.23解析:解析 本题考核数组与指针的关系。程序首先初始化指针 p,让其指向二维数组 num 的首元素,即 num00。程序中,第 1 个 for 循环是为二维数
30、组的每行元素赋值而设置的循环,第 2 个 for 循环是为二维数组的每列元素赋值而设定的,第 3 个 for 循环是为判断数组元素是否是素数而设置的。在第 3个 for 循环中,如果*p 的值能被小于它的数整除(即不是素数),则执行“j-;*p-;”,然后跳出第 3个 for 循环。j-的含义是让其前面的赋值语句重新赋值,而*p-的含义是使指针指向前一个单元。语句“*p+;”将指针移到下一个单元,在下一次循环时,k 加 1,并 k 赋给*p,看*p 是否为素数,这样一直到满足条件为止,即数组 num23中的数都为素数。最后数组 num 中各元素的值分别为大于 10 的素数,即分别为:11,13
31、;17,19,23,29。 程序最后要求输出*p 的值,由于此时指针已指向数组 num 的最后一个元素,即 num12。所以输出的值是 29。4.有以下程序: #includeiostream using namespace std; class MyClass public: MyClass();MyClass(); void SetValue(int val); private: static int i; ; int MyClass:i=0; MyClass:MyClass() i+; couti; MyClass:MyClass() i-; couti; void MyClass:Se
32、tValue(int val) i=val; int main() MyClass*my2; int k; for(k=0;k2;k+) myk=new MyClass; for(k=0;k2;k+) delete myk; return 0; 运行后的输出结果是( )。(分数:2.00)A.1210 B.1100C.1234D.输出结果不确定解析:解析 类 MyClass 中变量 i 是静态数据成员,它被 MyClass 类的所有对象共享,但它不属于任何一个对象,它的作用域是类范围。程序 i 是用来统计类 MyClass 所创建对象的个数,每创建一个对象 i加 1,每删除 MyClass 类
33、对象 i 减 1。5.为使该程序执行结果为 10,那么应该在程序划线处填入的语句是( )。 #includeiostream using namespace std; class MyClass public: MyClass (int a) x=a; _ /取 x 值 private: int x; ; int main() MyClass my(10); coutmyGetNum()end1; return 0; (分数:2.00)A.return x;B.int GetNum() return x; C.intreturn x;D.void GetNum()return x;解析:解析
34、此题为完成类的定义。由题可知,横线处要填的语句为类中的成员函数,它实现的功能是取 x 的值(即返回 x 的值)。又由主函数中的语句“coutmyGetNum()end1;”可知,此成员函数的函数名为 GetNum()。其函数体为:return x;。6.设有以下定义和程序: #include iostream.h class A1 public: void showl() cout“class A1“end1; ; Class A2 : public A1 public: void show2() cout“Class A2“end1; ; Class A3 : protected A2 pu
35、blic: void show3() cout”Class A 土”end1; ; void main() A1 obj1; A2 obj2; A3 obj3; 则以下不合语法的调用语句是( )。(分数:2.00)A.obj1show1();B.obj2show1();C.obj3show1(); D.obj2show2();解析:解析 C+中,通过类的对象只能访问类的公有成员,不能访问类的保护成员和私有成员。A2 是A1 的公有派生类,A3 是 A2 的保护派生类,所以类 A1 的成员函数 showl()在类 A3 中呈现保护属性,不能通过 A3 类的对象访问。7.如果对一个关系实施了一种关
36、系运算后得到了一个新的关系,而且新的关系中属性个数少于原来关系中属性个数,这说明所实施的运算关系是( )。(分数:2.00)A.选择B.投影 C.连接D.并解析:解析 本题考核对几种关系代数运算的掌握。其中选择和投影的区别在于:如果将一个关系看作一张表,那么选择操作就是从这张表中选出一些行而丢弃另一些行。而投影操作则是从这张表中选出某些列而丢弃另一些列。如果只对一个关系中的某些属性感兴趣,那么就需要在这些属性上使用投影操作投影该关系。并操作的结果表示为 Rus,它是一个关系,包括或者在 R 中、或者在 S 中、或者同时在 R 和 S 中的所有元组,新的关系中属性个数多于原来关系中属性个数。连接
37、操作用于将两个关系中的相关元组组合成单个元组。8.若要求尽可能快地对实数数组进行稳定的排序,则应选( )。(分数:2.00)A.快速排序B.堆排序C.归并排序 D.基数排序解析:解析 这里要用到的知识几乎都是要记忆的。此类题目可以采用排除法,首先,稳定的排序这里有两个选项 C 和 D,其饮,选项 D 不适用于实数的排序,因此只可用 C。9.有以下程序: #includeiostream using namespace std; int main() char a10 = 1,2,3,4,5,6,7,8,9,0),*p; int i=8; p=a+i; coutp-3end1; return 0
38、; 执行程序后的输出结果是( )。(分数:2.00)A.6B.6789 C.6D.789解析:解析 本题考核如何引用数组。解此题需要注意的几点是:没有下标的数组名就是一个指向该数组第 1 个元素的指针;字符09与数字 09 是不相等:ai与*(a+i)所指的是同一个数组元素。根据以上几点可知,本程序实现的功能是把字符6以及其后面的字符按字符串形式输出。10.下列叙述不属于线性链表较之线性表顺序存储结构的优点的是( )。(分数:2.00)A.线性链表存储方式简单 B.线性链表运算效率高C.线性链表的存储空间易于扩展D.线性链表便于存储空间的动态分配解析:解析 线性链表存储方式要求每个数据节点由两
39、个部分组成,比线性表的顺序存储结构复杂,选项 A 是错误的。在平均情况下,线性表的顺序存储结构插入和删除元素需要移动线性表中约一半的元素,效率低下。而线性链表只需改变有关节点的指针,效率较高,选项 B 是正确的。线性表的顺序存储存储空间必须是连续的,不利于存储空间扩展;而线性链表不需要连续的存储空间,存储空间易于扩展,选项 C是正确的。为保证线性表的存储空间连续且顺序分配,会导致在对某个线性表进行动态分配存储空间时,必须要移动其他线性表中的数据元素,不便于存储空间的动态分配,选项 D 是正确的。11.下列关于虚基类的描述中,错误的是( )。(分数:2.00)A.虚基类子对象的初始化由派生类完成
40、B.虚基类子对象的初始化次数与虚基类下面的派生类的个数有关 C.设置虚基类的目的是消除二义性D.带有虚基类的多层派生类构造函数的成员初始化列表中都要列出对虚基类构造函数的调用解析:解析 本题考核虚基类的初始化。从虚基类直接或间接派生的派生类的构造函数的成员初始化列表中都要列出对虚基类构造函数的调用,但只有用于建立对象的派生类的构造函数调用虚基类的构造函数,而该派生类的所有基类中列出的对虚基类的构造函数的调用在执行中被忽略,从而保证了对虚基类子对象只初始化一次。12.关系数据库的概念模型是( )的集合。(分数:2.00)A.关系模型B.关系模式 C.关系子模式D.存储模式解析:解析 本题考核关系
41、数据库的概念模型。数据库的概念模型体现了数据之间的关系,它是各种数据之间相互关系的集合。关系数据库的概念模型是关系模式的集合。关系子模式是指关系数据库模式中用户所见到的那部分数据模式描述。13.有以下程序: #includeiostream #includestring using namespace std; int main() char arr24; strcpy(arr0,“you“); strcpy(arr1,“me“); arr03= class point int x, y; public: point( int vx, int vy ) x = vx; y = vy; poin
42、t ( ) x = 0; y = 0; point operator+( point pl ) point p; int px = x + p1.x; int py = y + p1.y; return point( px, py ); point operator-( point p1 ) point p; int px = x - p1.x; int py = y - p1.y; return point( px, py ); void print() coutx“, “yend1; ; int main () point pl ( 10, 10 ), p2 ( 20, 20 ); p1
43、= p1 + p2; p1.print (); return 0; 执行后的输出结果是( )。(分数:2.00)A.10,10B.20,20C.10,20D.30,30 解析:解析 本题主要考察 C+中运算符重载的机制与实现。运算符重载函数一般分为成员函数形式和友元函数形式,这两种形式都可以访问类中的私有成员。本题中的运算符重载形式为成员函数形式。 程序在类 point 中声明了私有数据成员 int x 和 int y,并定义了两种形式的构造函数以完成对对象的初始化:之后,程序对运算符“+”进行了重载,令其输入参数为类 point 的对象,输出为操作符“+”右侧该对象的私有数据成员 x 和 y
44、 与操作符“+”左侧同类型对象的私有数据成员 x 和 y 的两数之和;print()函数则输出对象中数据成员的值。 主函数中,实例化了类 point 的两个对象 p1 和 p2,并完成对对象的初始化。在语句“p1=p1+p2;”中,由于操作符“+”左右两端的操作数为 point 类的对象,复合类 point 定义中的操作符“+”的重载函数,因此程序将调用重载后的操作符函数,并返回两 point 对象数据成员的加和值,覆盖对象 p1 的数据成员。因此 print()函数输出对象 p1 的数据成员值应该为:x=10+20=30,y=10+20=30。17.若有数组名作为实参,则传递给形参的是( )
45、。(分数:2.00)A.数组的首地址 B.第一个元素的值C.数组中全部元素的值D.数组元素的个数解析:解析 本题考查数组作为函数形参方面的应用。当将数组传递给函数时,调用的函数中可用不带下标的数组名。这实际上是传递数组第 1 个元素的地址给函数。在 C+语言中,不可能把整个数组作为一个参数来传递,而是用指针来完成。18.按照标识符的要求,下列选项中,( )符号不能组成标识符。(分数:2.00)A.连接符 B.下划线C.大小写字母D.数字字符解析:解析 C+规定标识符由大小写字母、数字字符(0-9)和下划线组成,并且以字母或下划线开始,后跟 0 个或多个字母、数字字符或下划线。由此可知,选项 A 中的连接符不能用于组成标识符。19.若有函数调用语句: fun(a+b,(x,y),fun(n+k,d,(a,b,); 那么在此函数调用语句中实参的个数是( )。(分数:2.00)A.3 B.4C.5D.6解析:解析 调用函数时,在函数名后面跟参数,参数用逗号隔开。调用时,实参