1、二级 C+-17-2 及答案解析(总分:87.00,做题时间:90 分钟)一、B选择题/B(总题数:35,分数:65.00)1.有如下程序:#includeiostreamusing namespace std;class TestClassprivate:int x,y;public:TestClass(int i,int j)x=i;y=j;void print()cout“print1“endl;void print() const(cout “print2“endl;);int main()const TestClass a(1,2):a.print();return 0;该程序运行后
2、的输出结果是_。 A.print1 B.print2 C.print1 print2 D.程序编译时出错(分数:1.00)A.B.C.D.2.设有以下语句:int a10=0,1,2,3,4,5,6,7,8,9),*p=a;,对 a 数组元素的引用中(其中 0=i10)不正确的是U /U。 A.ap-a B.*(char ch;ofile.open(“d:/abc.txt“,W);docinch:ofile.put(ch);while(ch!=#);ofile.close();return 0: A. 成员函数 open()调用形式错误 B. 输入文件没有关闭 C. 成员函数 put()调用形
3、式错误 D. 对象 ofile 定义错误(分数:2.00)A.B.C.D.4.以下关键字不能用来声明类的访问权限的是_。 A.public B.static C.protected D.private(分数:1.00)A.B.C.D.5.下列叙述中正确的是 A. 所有形态的二叉树都只能采用链式存储结构 B. 循环队列是队列的一种存储方式 C. 栈只能采用顺序存储结构 D. 循环队列与循环链表都属于链式存储结构(分数:2.00)A.B.C.D.6.下列叙述中错误的是U /U。 A.一个函数中可以有多条 return 语句 B.调用函数必须在一条独立的语句中完成 C.函数中通过 return 语句
4、传递函数值 D.主函数名 main 也可以带有形参(分数:2.00)A.B.C.D.7.线性表进行二分法检索,其前提条件是U /U。 A. 线性表以顺序方式存储,并按关键码值排好序 B. 线性表以顺序方式存储,并按关键码的检索频率排好序 C. 线性表以链式方式存储,并按关键码值排好序 D. 线性表以链式方式存储,并按关键码的检索频率排好序(分数:2.00)A.B.C.D.8.下列关于 this 指针的叙述中,正确的是U /U。 A.任何与类相关的函数都有 this 指针 B.类的成员函数都有 this 指针 C.类的友元函数都有 this 指针 D.类的非静态成员函数才有 this 指针(分数
5、:2.00)A.B.C.D.9.一个函数为 void(int,char=a),另一个函数为 void f(int),则它们U /U。 A.不能在同一程序中定义 B.可以在同一程序中定义并可重载 C.可以在同一程序中定义,但不可以重载 D.以上说法均不正确(分数:1.00)A.B.C.D.10.已知:int m10;在下列定义引用的语句中,正确的是U /U。 A.int class Base char c; public : Base( char c0):c( c0) Base( )coutc; ; class Derived:public Base char c: public: Derive
6、d( char c0): Base(c0+1) ,c(c0) Derived()coute; ; int main() Derived obj(x); return 0: A) xy B) yx c)x D) y(分数:2.00)A.B.C.D.14.下列成对的表达式中,运算符“/”的意义相同的一对是U /U。 A.8/3 和 8.0/3.0 B.8/3.0 和 8/3 C.8.0/3 和 8/3 D.8.0/3.0 和 8.0/3(分数:2.00)A.B.C.D.15.对于算法的每一步,指令必须是可执行的。算法的U /U要求算法在有限步骤之后能够达到预期的目的。 A.可行性 B.有穷性 C.
7、正确性 D.确定性(分数:2.00)A.B.C.D.16.有如下程序:#includeiostreamvoid fun(int x=y; y=t;int main()int a2=23,42;fun(a1,a0);std:couta0“,“a1std:end1;return 0;执行后的输出结果是U /U。 A. 42,42 B. 23,23 C. 23,42 D. 42,23(分数:2.00)A.B.C.D.17.在面向对象方法中,一个对象请求另一个对象为其服务的方式是通过发送U /U。 A. 调用语句 B. 命令 C. 口令 D. 消息(分数:2.00)A.B.C.D.18.下列程序的运行
8、结果是U /U。#includeiostream.hvoid fun(int *a, int *b)int *k; k=a; a=b; b=k;void main()int a=2OO4,b=9,*x=fun(x, y);couta“ “bend1; A.20049 B.92004 C.00 D.编译时出错(分数:2.00)A.B.C.D.19.通过运算符重载,可以改变运算符原有的U /U。 A. 操作数类型 B. 操作数个数 C. 优先级 D. 结合性(分数:1.00)A.B.C.D.20.软件工程的出现是由于U /U。 A. 程序设计方法学的影响 B. 软件产业化的需要 C. 软件危机的出
9、现 D. 计算机的发展(分数:2.00)A.B.C.D.21.定义如下枚举类型 enumMonday,Tuesday,Wednesday,Thrusday,Friday=2);则下列选项正确的是( )。 A.表达式 wednesday=Friday 的值是 true B.Day day;day=3; C.Day day;day=Monday+3; D.Day day;day=Tuesday+10;(分数:2.00)A.B.C.D.22.以下关键字不能用来声明类的访问权限的是_。 A.public B.static C.protected D.private(分数:2.00)A.B.C.D.23
10、.计算斐波那契数列第 n 项的函数定义如下:int fib(int n)if (n=0)return 1;else if(n=1) return 2;else return fib(n=1)+fib(n=2);若执行函数调用表达式 fib(2),函数 fib 被调用的次数是U /U。 A.1 B.2 C.3 D.4(分数:2.00)A.B.C.D.24.概要设计中要完成的事情是U /U。 A.系统结构和数据结构的设计 B.系统结构和过程的设计 C.过程和接口的设计 D.数据结构和过程的设计(分数:2.00)A.B.C.D.25.执行语句:coutsetfill(*)setw(10)setfil
11、l(#)left123“OK“endl;return 0;)后将输出U /U。 A.123*OK B.123#OK C.123*OK* D.123#OK#(分数:2.00)A.B.C.D.26.对于模板定义关键字 class 和 typename 说法不正确的是 A. 程序中的 class 并不能都替换为 typename B. class 和 typename 都可互相替换 C. 程序中的 typename 都能替换为 class D. 程序中的部分 class 可以替换为 typename(分数:2.00)A.B.C.D.27.有如下程序:#include iostreamusing na
12、mespace std;class AAint n;public:AA(int k):n(k) int get()return n; int get()constreturn n+1;int main()AA a(5);const AA b(6);couta.get()b.get();return 0;执行后的输出结果是U /U。 A. 55 B. 57 C. 75 D. 77(分数:2.00)A.B.C.D.28.假定 MyClas 为一个类,那么该类的析构函数是U /U。 A. voidMyClas(); B. MyClas(int n); C. MyClas(); D. MyClas()
13、;(分数:2.00)A.B.C.D.29.如果类 A 被说明成类 B 的友元,则U /U。 A.类 A 的成员即类 B 的成员 B.类 B 的成员即类 A 的成员 C.类 A 的成员函数不得访问类 B 的成员 D.类 B 不一定是类 A 的友元(分数:2.00)A.B.C.D.30.设有 int x11;,则表达式(x+*2/3)的值是U /U。 A.7 B.8 C.11 D.12(分数:2.00)A.B.C.D.31.对于类定义class A public:virtual void funcl()void func2();class D:public Apublic:void funcl()
14、cout “class B rune 1“end1;virtual void func2()cout “class B func 2“end1;;下面正确的叙述是 _。 A. A:func2()和 B:funcl()都是虚函数 B. A:func2()和 B:funcl()都不是虚函数 C. B:func1()是虚函数,而 A:func2()不是虚函数 D. B:func1()不是虚函数,而 A:func2()是虚函数(分数:2.00)A.B.C.D.32.下列关系运算中,能使经运算后得到的新关系中属性个数多于原来关系中属性个数的是U /U。 A.选择 B.连接 C.投影 D.并(分数:2.0
15、0)A.B.C.D.33.存在定义 int a10,x,*pa;,若 pa: while(_) k*=m%10;s+=m%10; U U /U /U; if(ks)coutn; (分数:1.00)填空项 1:_37.在类的对象被创建时, 1 函数会被自动调用。(分数:2.00)填空项 1:_38.将下面的语句段(A) 补充完整,使其和语句段(B) 在功能上完全等价。 (a) double s=0.0; U U /U /U; int k=0; do s+=d; k+; d=1.0/(k*k+1); while(U U /U /U); (b) double s=1.0; for(int k=1;k
16、=10;k+) s+=1.0/(k*(k+1);(分数:1.00)填空项 1:_39.如果一个模板声明时有类型形参表,则多个参数之间必须使用 1 隔开,每个参数都必须重复使用关键字 2。(分数:1.00)填空项 1:_40.有如下程序: #inCludeiostream using namespace std; class AA public: viltual void f() cout“AA“; ; class BB:public AA public: BB() cout“BB“; ; class CC:public BB public: virtual void f() BB:f(); c
17、out“CC“; ; int main() AA aa,*p;BB bb;CC cc; p= class MyClass public: MyClass(); MyClass(); static int s; void SetValue(int val); ; int MyClass:s=0; MyClass:MyClass() s+; void MyClass:SetValue(int val) ( s=val; int main() MyClass my3,*p; p=my; for(int k=0;k3;k+) p-SetValue(k+l); p+; coutMyClass:send1
18、; return 0; 运行后的输出结果是U U /U /U。(分数:1.00)填空项 1:_47.下列软件系统结构图 (分数:2.00)填空项 1:_48.使用函数模板的方法是先说明函数模板,然后实例化成相应的 1 进行调用执行。(分数:1.00)填空项 1:_49.已知一个函数模板定义为 template typename T1typenaine T2 T1 FUN(T2 n)return n*5.0; 若要求以 int 型数据 7 为函数实参调用该模板函数,并返回一个 double 型数据,则该调用应表示为_。(分数:2.00)填空项 1:_50.在 C+语言中,访问一个对象的成员所用的
19、运算符是U U /U/U,访问一个指针所指向的对象的成员所用的运算符是U U /U/U。(分数:1.00)填空项 1:_二级 C+-17-2 答案解析(总分:87.00,做题时间:90 分钟)一、B选择题/B(总题数:35,分数:65.00)1.有如下程序:#includeiostreamusing namespace std;class TestClassprivate:int x,y;public:TestClass(int i,int j)x=i;y=j;void print()cout“print1“endl;void print() const(cout “print2“endl;)
20、;int main()const TestClass a(1,2):a.print();return 0;该程序运行后的输出结果是_。 A.print1 B.print2 C.print1 print2 D.程序编译时出错(分数:1.00)A.B. C.D.解析:解析 本题由主函数 main 入手,定义 TestClass 型的常对象 a,然后调用对象 a 中的成员函数print()。因为在 C+中,如果一个对象被声明为常对象,则不能调用该对象中的非 const 型的成员函数。所以,这里调用的是对象中的 const 型成员函数“void print() const”,输出为 print2。2.
21、设有以下语句:int a10=0,1,2,3,4,5,6,7,8,9),*p=a;,对 a 数组元素的引用中(其中 0=i10)不正确的是U /U。 A.ap-a B.*(char ch;ofile.open(“d:/abc.txt“,W);docinch:ofile.put(ch);while(ch!=#);ofile.close();return 0: A. 成员函数 open()调用形式错误 B. 输入文件没有关闭 C. 成员函数 put()调用形式错误 D. 对象 ofile 定义错误(分数:2.00)A. B.C.D.解析:解析 该程序在运行中会发现,如果不存在文件 abc.txt,
22、将不会生成新的文件;即使已经存在该文件,也不能成功完成输出操作。原因在于 open()函数的第二个参数错误,open()函数不能成功打开文件 abc.txt。4.以下关键字不能用来声明类的访问权限的是_。 A.public B.static C.protected D.private(分数:1.00)A.B. C.D.解析:解析 类的成员访问权限有 3 种:public(公用)、protected(保护)、private(私有)。5.下列叙述中正确的是 A. 所有形态的二叉树都只能采用链式存储结构 B. 循环队列是队列的一种存储方式 C. 栈只能采用顺序存储结构 D. 循环队列与循环链表都属于
23、链式存储结构(分数:2.00)A.B. C.D.解析:解析 一般来说,二叉树采用链式存储结构,但由于完全二叉树的特点,采用顺序存储也能方便地访问其中的每一个元素。因此,选项 A)中的说法是不对的。 所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再要进行人队运算时,只要存储空间的第一个位置空闲,便可将元素加人到第一个位置,即将存储空间的第一个位置作为队尾。因此,循环队列是队列的一种顺序存储方式,选项 B)中的说法是正确的。 栈是特殊的线性表,它既能采用顺序存储结构,又能采用链式存储结构。因此
24、,选项 C)中的说法也是不对的。 前面说过,循环队列是队列的一种顺序存储方式,不属于链式存储结构因此,选项 D)中的说法也是不对的。6.下列叙述中错误的是U /U。 A.一个函数中可以有多条 return 语句 B.调用函数必须在一条独立的语句中完成 C.函数中通过 return 语句传递函数值 D.主函数名 main 也可以带有形参(分数:2.00)A.B. C.D.解析:7.线性表进行二分法检索,其前提条件是U /U。 A. 线性表以顺序方式存储,并按关键码值排好序 B. 线性表以顺序方式存储,并按关键码的检索频率排好序 C. 线性表以链式方式存储,并按关键码值排好序 D. 线性表以链式方
25、式存储,并按关键码的检索频率排好序(分数:2.00)A. B.C.D.解析:解析 对线性表进行二分法检索,要求线性表是按顺序方式存储,并按关键码值的大小排好序,而不是按关键码的检索频率排序。8.下列关于 this 指针的叙述中,正确的是U /U。 A.任何与类相关的函数都有 this 指针 B.类的成员函数都有 this 指针 C.类的友元函数都有 this 指针 D.类的非静态成员函数才有 this 指针(分数:2.00)A.B.C.D. 解析:9.一个函数为 void(int,char=a),另一个函数为 void f(int),则它们U /U。 A.不能在同一程序中定义 B.可以在同一程
26、序中定义并可重载 C.可以在同一程序中定义,但不可以重载 D.以上说法均不正确(分数:1.00)A.B.C. D.解析:10.已知:int m10;在下列定义引用的语句中,正确的是U /U。 A.int class Base char c; public : Base( char c0):c( c0) Base( )coutc; ; class Derived:public Base char c: public: Derived( char c0): Base(c0+1) ,c(c0) Derived()coute; ; int main() Derived obj(x); return 0
27、: A) xy B) yx c)x D) y(分数:2.00)A. B.C.D.解析:解析 主函数结束时,派生类对象 obj 将被销毁,先调用派生类的析构函数输出 x,然后调用基类的析构函数输出 y。14.下列成对的表达式中,运算符“/”的意义相同的一对是U /U。 A.8/3 和 8.0/3.0 B.8/3.0 和 8/3 C.8.0/3 和 8/3 D.8.0/3.0 和 8.0/3(分数:2.00)A.B.C.D. 解析:15.对于算法的每一步,指令必须是可执行的。算法的U /U要求算法在有限步骤之后能够达到预期的目的。 A.可行性 B.有穷性 C.正确性 D.确定性(分数:2.00)A
28、. B.C.D.解析:16.有如下程序:#includeiostreamvoid fun(int x=y; y=t;int main()int a2=23,42;fun(a1,a0);std:couta0“,“a1std:end1;return 0;执行后的输出结果是U /U。 A. 42,42 B. 23,23 C. 23,42 D. 42,23(分数:2.00)A.B. C.D.解析:解析 此题考查的是函数的调用以及参数值的传递。函数。fun 中的第一个参数是引用传值方式,是双向的;第二个参数是按值传递,是单向的。17.在面向对象方法中,一个对象请求另一个对象为其服务的方式是通过发送U /
29、U。 A. 调用语句 B. 命令 C. 口令 D. 消息(分数:2.00)A.B.C.D. 解析:解析 在面向对象方法中,对象之间通过消息进行通信。消息中只包含传递者的要求,它告诉接受者需要做哪些处理,但并不指示接受者应该怎么完成这些处理,接受者独立决定采用什么方式完成所需的处理。18.下列程序的运行结果是U /U。#includeiostream.hvoid fun(int *a, int *b)int *k; k=a; a=b; b=k;void main()int a=2OO4,b=9,*x=fun(x, y);couta“ “bend1; A.20049 B.92004 C.00 D.
30、编译时出错(分数:2.00)A. B.C.D.解析:19.通过运算符重载,可以改变运算符原有的U /U。 A. 操作数类型 B. 操作数个数 C. 优先级 D. 结合性(分数:1.00)A. B.C.D.解析:解析 重载运算符的规则如下:C+不允许用户自己定义新的运算符,只能对已有的 C+运算符进行重载;C+不能重载的运算符只有 5 个;重载不能改变运算符运算对象的个数;重载不能改变运算符的优先级和结合性;重载运算符的函数不能有默认的参数;重载的运算符必须和用户定义的自定义类型的对象一起使用,至少应有一个是类对象,即不允许参数全部是 C+的标准类型。故本题答案为A。20.软件工程的出现是由于U
31、 /U。 A. 程序设计方法学的影响 B. 软件产业化的需要 C. 软件危机的出现 D. 计算机的发展(分数:2.00)A.B.C. D.解析:解析 软件工程的出现源自于软件危机。为了消除软件危机,通过认真研究解决软件危机的方法,认识到软件工程是使计算机软件走向工程科学的途径,逐步形成了软件工程的概念。21.定义如下枚举类型 enumMonday,Tuesday,Wednesday,Thrusday,Friday=2);则下列选项正确的是( )。 A.表达式 wednesday=Friday 的值是 true B.Day day;day=3; C.Day day;day=Monday+3; D
32、.Day day;day=Tuesday+10;(分数:2.00)A. B.C.D.解析:解析 枚举类型定义了一些整型符号常量的集合,使用枚举类型时应该注意以下几点:枚举类型的第一个常量默认值是 O;枚举类型常量的值允许彼此相同;虽然枚举类型常量是整数类型,但是不允许使用整数直接赋值给枚举类型变量,也不允许与整数进行运算,只可以与整数进行比较。22.以下关键字不能用来声明类的访问权限的是_。 A.public B.static C.protected D.private(分数:2.00)A.B. C.D.解析:类的成员访问权限有 3 种:public(公用)、protected(保护)、pri
33、vate(私有)。23.计算斐波那契数列第 n 项的函数定义如下:int fib(int n)if (n=0)return 1;else if(n=1) return 2;else return fib(n=1)+fib(n=2);若执行函数调用表达式 fib(2),函数 fib 被调用的次数是U /U。 A.1 B.2 C.3 D.4(分数:2.00)A.B.C. D.解析:解析 针对递归调用的含义。当 n 为 2 时有 fib(0),fib(1),fib(2)被调用,且 fib(0),fib(1)时调用结束,即共 3 次。24.概要设计中要完成的事情是U /U。 A.系统结构和数据结构的设
34、计 B.系统结构和过程的设计 C.过程和接口的设计 D.数据结构和过程的设计(分数:2.00)A. B.C.D.解析:解析 软件概要设计的基本任务是:设计软件系统结构、数据结构及数据库设计、编写概要设计文档、概要设计文档评审。25.执行语句:coutsetfill(*)setw(10)setfill(#)left123“OK“endl;return 0;)后将输出U /U。 A.123*OK B.123#OK C.123*OK* D.123#OK#(分数:2.00)A.B. C.D.解析:26.对于模板定义关键字 class 和 typename 说法不正确的是 A. 程序中的 class 并
35、不能都替换为 typename B. class 和 typename 都可互相替换 C. 程序中的 typename 都能替换为 class D. 程序中的部分 class 可以替换为 typename(分数:2.00)A.B. C.D.解析:解析 在 C程序中的 typename 是都可以替换为 class 的,但 class 不能都替换为 typename。27.有如下程序:#include iostreamusing namespace std;class AAint n;public:AA(int k):n(k) int get()return n; int get()constre
36、turn n+1;int main()AA a(5);const AA b(6);couta.get()b.get();return 0;执行后的输出结果是U /U。 A. 55 B. 57 C. 75 D. 77(分数:2.00)A.B. C.D.解析:28.假定 MyClas 为一个类,那么该类的析构函数是U /U。 A. voidMyClas(); B. MyClas(int n); C. MyClas(); D. MyClas();(分数:2.00)A.B.C.D. 解析:解析 析构函数名为符号“”加类名,析构函数没有参数和返回值。29.如果类 A 被说明成类 B 的友元,则U /U。
37、 A.类 A 的成员即类 B 的成员 B.类 B 的成员即类 A 的成员 C.类 A 的成员函数不得访问类 B 的成员 D.类 B 不一定是类 A 的友元(分数:2.00)A.B.C.D. 解析:解析 本题考查的是友元类的定义:类 A 为类 B 的友元类,则类 A 的所有成员函数都是类 B 的友元函数,但反之则不一定成立。30.设有 int x11;,则表达式(x+*2/3)的值是U /U。 A.7 B.8 C.11 D.12(分数:2.00)A. B.C.D.解析:解析 当自加运算符做后缀表达式的时候,表达式的值不变,只有变量的值增 1,所以表达式(x+*2/3)相当于(11*2/3)取整后
38、为 7。31.对于类定义class A public:virtual void funcl()void func2();class D:public Apublic:void funcl()cout “class B rune 1“end1;virtual void func2()cout “class B func 2“end1;;下面正确的叙述是 _。 A. A:func2()和 B:funcl()都是虚函数 B. A:func2()和 B:funcl()都不是虚函数 C. B:func1()是虚函数,而 A:func2()不是虚函数 D. B:func1()不是虚函数,而 A:func2
39、()是虚函数(分数:2.00)A.B.C. D.解析:32.下列关系运算中,能使经运算后得到的新关系中属性个数多于原来关系中属性个数的是U /U。 A.选择 B.连接 C.投影 D.并(分数:2.00)A.B. C.D.解析:33.存在定义 int a10,x,*pa;,若 pa: while(_) k*=m%10;s+=m%10; U U /U /U; if(ks)coutn; (分数:1.00)填空项 1:_ (正确答案:m-n m m/=10)解析:37.在类的对象被创建时, 1 函数会被自动调用。(分数:2.00)填空项 1:_ (正确答案:构造)解析:解析 此题考查的是构造函数的应用
40、。构造函数的作用是在对象被创建时利用特定的值构造对象,构造函数在对象被创建时由系统自动调用。38.将下面的语句段(A) 补充完整,使其和语句段(B) 在功能上完全等价。 (a) double s=0.0; U U /U /U; int k=0; do s+=d; k+; d=1.0/(k*k+1); while(U U /U /U); (b) double s=1.0; for(int k=1;k=10;k+) s+=1.0/(k*(k+1);(分数:1.00)填空项 1:_ (正确答案:8d=1.09k=10)解析:解析 本题考核 while 循环与 for 循环之间的转换。只要把握住循环的
41、起始条件、结束条件和变量控制,就易解这种类型的题目。39.如果一个模板声明时有类型形参表,则多个参数之间必须使用 1 隔开,每个参数都必须重复使用关键字 2。(分数:1.00)填空项 1:_ (正确答案:, class)解析:40.有如下程序: #inCludeiostream using namespace std; class AA public: viltual void f() cout“AA“; ; class BB:public AA public: BB() cout“BB“; ; class CC:public BB public: virtual void f() BB:f(
42、); cout“CC“; ; int main() AA aa,*p;BB bb;CC cc; p= class MyClass public: MyClass(); MyClass(); static int s; void SetValue(int val); ; int MyClass:s=0; MyClass:MyClass() s+; void MyClass:SetValue(int val) ( s=val; int main() MyClass my3,*p; p=my; for(int k=0;k3;k+) p-SetValue(k+l); p+; coutMyClass:s
43、end1; return 0; 运行后的输出结果是U U /U /U。(分数:1.00)填空项 1:_ (正确答案:3)解析:解析 本题考核静态数据成员。本题程序中把变量 s 定义为静态数据成员,它被 MyClass 类的所有对象所共享,但它不属于类的任何一个对象,它的作用域是类范围。 在类 MyClass 的构造函数中,每创建一个对象,s 就增 1,由此可知 s 用来记录建立对象的个数。由于创建对象指针 p 时并不会调用构造函数,所以 s 最后的值是 3。47.下列软件系统结构图 (分数:2.00)填空项 1:_ (正确答案:3)解析:48.使用函数模板的方法是先说明函数模板,然后实例化成相应的 1 进行调用执行。(分数:1.00)填空项 1:_ (正确答案:模板函数)解析:49.已知一个函数模板定义为 template typename T1typenaine T2 T1 FUN(T2 n)return n*5.