1、二级 C+-235 及答案解析(总分:65.00,做题时间:90 分钟)一、选择题(总题数:36,分数:65.00)1.有以下程序 #include iostream using namespace std; int a; int fun (); int main () extern int a; int b; a = 100; b = fun(); coutbend1; return 0; int fun) extern int a; return (10*a ; 其程序运行后的输出结果是(分数:2.00)A.100B.10C.1000D.100002.在软件开发中,需求分析阶段产生的主要文
2、档是 _ 。(分数:2.00)A.软件集成测试计划B.软件详细设计说明书C.用户手册D.软件需求规格说明书3.对关系 S 和关系 R 进行集合运算,结果中既包含 S 中元组也包含 R 中元组,这种集合运算称为 _ 。(分数:2.00)A.并运算B.交运算C.差运算D.积运算4.下列不属于 C+关键字的是(分数:2.50)A.defaultB.unsignedC.goD.try5.有如下程序: #includeiostream using namespace std; class Instrument public: virtual void Display()=0; ; class Piano
3、:public Instrument public: void Display()/*函数体略*/ ; int main() Instrument s; Instrument*p=0; /; return 0; 下列叙述中正确的是_。(分数:1.00)A.语句“Insturment*p=0;”编译时出错B.语句“Instrument s;”编译时出错C.类 Piano 中的 Display 函数不是虚函数D.类 Instrument 是一个虚基类6.下列虚基类的声明中正确的是 _。(分数:2.00)A.class virtual B: public AB.class B: public A v
4、irtualC.class B: public virtual AD.virtual class B: public A7.有如下的运算符重载函数定义: double operator+(int i,int k)return double(i+k); 但定义有错误,对这个错误最准确的描述是_。(分数:3.00)A.+只能作为成员函数重载,而这里的+是作为非成员函数重载的B.两个 int 型参数的和也应该是 int 型,而这里将+的返回类型声明为 doubleC.没有将运算符重载函数声明为某个类的友元D.C+已经提供了求两个 int 型数据之和的运算符+,不能再定义同样的运算符8.有下列程序:
5、#include stdio.h void fun(char*a,char*b) while(*a=“*“)a+; while(*b=*a)b+;a+; void main() char+s=“*a+b*“,t80; fun(s,t);puts(t) 程序的运行结果是_。(分数:2.50)A.*a*bB.a*bC.a*b*D.ab9.下面程序中对一维坐标点类 Point 进行运算符重载 #includeiostream using namespace std; class Point public: Point(int val)x=val; Pointreturn *this; Point o
6、perator+(int)Point old=*this;+(*this);return old; Int GetX()constreturn x; private: int x; ; int main() Point a(10); cout(+a).GetX(); couta+.GetX(); return 0; 编译和运行情况是_。(分数:3.00)A.运行时输出 1011B.运行时输出 1111C.运行时输出 1112D.编译有错10.语句 cout setprecison (3)3.1415926end1;的输出为 _ 。(分数:2.00)A.3.14B.3.1C.3.142D.3.1
7、4111.下列关于运算符重载的描述中,错误的是_。(分数:2.50)A.可以通过运算符重载在 C+中创建新的运算符B.赋值运算符只能重载为成员函数C.运算符函数重载为类的成员函数时,第一操作数是该类对象D.重载类型转换运算符时不需要声明返回类型12.有如下程序: #includeiostream using namespace std; int main() void function(double val); double val; function(val); coutval; return 0; void function(double val) val= 3; 编译运行这个程序将出现的
8、情况是 _ 。(分数:2.00)A.编译出错,无法运行B.输出:3C.输出:3.0D.输出一个不确定的数13.当使用 ofstream 流类定义一个流对象并打开一个磁盘文件时,文件的默认打开方式为_。(分数:2.50)A.ios base:inB.ios_base:binaryC.ios base:in|ios_base:outD.ios_base:out14.对长度为 n 的线性表排序,在最坏情况下,比较次数不是 n(n-1)/2 的排序方法是_。(分数:1.00)A.快速排序B.冒泡排序C.直接插入排序D.堆排序15.下列叙述中正确的是_。(分数:2.50)A.算法就是程序B.设计算法时只
9、需要考虑数据结构的设计C.设计算法时只需要考虑结果的可靠性D.以上三种说法都不对16.以下程序的输出结果是 #includeiostreamh void main() int x=1,y=3; cout x+ “ , “; int x=0;X+=y*2; coutx“ ,“y“ ;“; coutx“ ,“y; (分数:1.00)A.1,6,3,1,3B.1,6,3,6,3C.1,6,3,2,3D.1,7,3,2,317.下面有关重载函数的说法中,正确的是 _ 。(分数:1.00)A.重载函数必须具有不同的返回值类型B.重载函数形参个数必须不同C.重载函数必须有不同的形参列表D.重载函数名可以不
10、同18.下面四个关键字中,说明友元函数的是 _ 。(分数:2.00)A.friendB.virtualC.publicD.base19.已知表达式+x 中的“+”是作为成员函数重载的运算符,则与+x 等效的运算符函数调用形式为_。(分数:1.00)A.operator+(1)B.operator+(x)C.operator+()D.operator+(x)20.将 E-R 图转换到关系模式时,实体与实体间的联系可以表示成_。(分数:1.00)A.属性B.关系C键D域21.若有函数调用“fun(x*y,3,max(a,b,c)”,则 fun 的实参个数为_。(分数:2.00)A.3B.4C.5D
11、.622.以下过程设计工具不属于图形工具的是 _ 。(分数:1.00)A.程序流程图B.PADC.HIPOD.PDL23.具有 3 个结点的二叉树有(分数:1.00)A.2 种形态B.4 种形态C.7 种形态D.5 种形态24.软件测试的目的是_。(分数:1.00)A.评估软件可靠性B.发现并改正程序中的错误C.改正程序中的错误D.发现程序中的错误25.有如下模板声明: templatetypename T1,typename T2class A; 下列声明中,与上述声明不等价的是_。(分数:1.00)A.templateclass T1,class T2class A;B.templatec
12、lass T1,typename T2class A;C.templatetypename T1,class T2class A;D.templatetypename T1,T2class A;26.一个非空广义表的表头 _ 。(分数:2.00)A.不可能是子表B.只能是子表C.只能是原子D.可以是子表或原子27.下列特征中不是面向对象方法的主要特征的是 _ 。(分数:2.00)A.多态性B.继承C.封装性D.模块化28.下面程序的运行结果是 _ 。 #includeiostream.h void main() int i1; while(i8) if(+i%3!2)continue; els
13、e couti; (分数:2.00)A.25B.36C.258D.36929.下列关于构造函数的描述中,错误的是_。(分数:1.00)A.构造函数名与类名相同B.构造函数可以有返回值C.构造函数可以重载D.每个类都有构造函数30.关于静态数据成员的描述中正确的是 _ 。(分数:2.00)A.类的静态数据成员不是类的所有对象共享的数据B.类的静态数据成员不能被类的成员函数调用C.类的静态数据成员不能被类的构造函数调用D.类的静态数据成员必须进行初始化31.数据库设计中,用 ER 图来描述信息结构但不涉及信息在计算机中的表示,它属于数据库设计的_。(分数:2.50)A.需求分析阶段B.逻辑设计阶段
14、C.概念设计阶段D.物理设计阶段32.若已知 char str 20;,且有语句 cinstr;,此时输入为“This is a program“,则所得的结果是 str= _ 。(分数:2.00)A.This is a programB.ThisC.This isD.This is a33.有以下程序: #includeiostream using namespace std; #define PI 3.14 class Point private: int x,y; public: Point(int a,int b) x=a; y=b; int getx() return x; int
15、gety() return y; class Circle:public Point private: int r: public: Circle(int a,int b,int c):Point(a,b) r=c; int getr() return r; double area() return PI*r*r; int main() Circle c1(5,7,10); coutc1.area()endl; relurn 0; 程序执行后的输出结果是_。(分数:1.00)A.314B.157C.78.5D.153.8634.有如下说明: int a10=1,2,3,4,5,6,7,8,9,
16、10,*p=a; 则数值为 9 的表达式是_。(分数:1.00)A.*p+9B.*(p+8)C.*p+=9D.p+835.执行下列语句: #includeiostream using namespace std; int main() int x=3; if(x=5) coutx+endl; else coutxendl; return 0; 程序的输出是_。(分数:2.50)A.3B.4C.5D.636.下面是一个模板声明的开始部分: templatetypename Tdouble. 由此可知_。(分数:2.50)A.这可能是一个函数模板的声明B.这可能是一个类模板的声明C.这既可能是一个
17、函数模板的声明,也可能是一个类模板的声明D.这肯定是一个错误的模板声明二级 C+-235 答案解析(总分:65.00,做题时间:90 分钟)一、选择题(总题数:36,分数:65.00)1.有以下程序 #include iostream using namespace std; int a; int fun (); int main () extern int a; int b; a = 100; b = fun(); coutbend1; return 0; int fun) extern int a; return (10*a ; 其程序运行后的输出结果是(分数:2.00)A.100B.10
18、C.1000 D.10000解析:解析 本题考核变量的作用域、生存周期和存储类别(自动、静态、存储器,外部)。先来了解外部变量:外部变量用关键字 extern 表示。由于外部变量可以被程序中的所有函数共同访问,其作用域为全局,因此也称为全局变量。对于外部变量而言,“定义变量”和“说明变量”是两个不同的概念。定义a 为外部变量是告诉编译程序, a 是一个外部变量,并要求系统为 a 分配一个固定的永久存储空间。a 的值在整个程序的运行期间都存在,只有当定义它的程序运行结束时,它的存储空间才释放。外部变量定义后,当程序中的函数要引用外部变量时,应在函数中作引用说明。在此程序中,在第二行定义了一个外部
19、变量 a,主函数 main 给外部变量赋的初始值为 100,当调用函数 fun()时,外部变量 a 的值传到函数 fun()中,因此函数所返回的值为 100*10=1000。2.在软件开发中,需求分析阶段产生的主要文档是 _ 。(分数:2.00)A.软件集成测试计划B.软件详细设计说明书C.用户手册D.软件需求规格说明书 解析:解析 在软件开发过程中,需求分析阶段产生的要文档是软件需求规格说明书。3.对关系 S 和关系 R 进行集合运算,结果中既包含 S 中元组也包含 R 中元组,这种集合运算称为 _ 。(分数:2.00)A.并运算 B.交运算C.差运算D.积运算解析:4.下列不属于 C+关键
20、字的是(分数:2.50)A.defaultB.unsignedC.go D.try解析:5.有如下程序: #includeiostream using namespace std; class Instrument public: virtual void Display()=0; ; class Piano:public Instrument public: void Display()/*函数体略*/ ; int main() Instrument s; Instrument*p=0; /; return 0; 下列叙述中正确的是_。(分数:1.00)A.语句“Insturment*p=0
21、;”编译时出错B.语句“Instrument s;”编译时出错 C.类 Piano 中的 Display 函数不是虚函数D.类 Instrument 是一个虚基类解析:解析 本题考查纯虚函数和抽象类,纯虚函数是在声明虚函数时被“初始化”为 0 的函数,包含纯虚函数的类为抽象类,抽象类不能被实例化,所以语句“Instrument s;”在编译时出错。6.下列虚基类的声明中正确的是 _。(分数:2.00)A.class virtual B: public AB.class B: public A virtualC.class B: public virtual A D.virtual class
22、B: public A解析:7.有如下的运算符重载函数定义: double operator+(int i,int k)return double(i+k); 但定义有错误,对这个错误最准确的描述是_。(分数:3.00)A.+只能作为成员函数重载,而这里的+是作为非成员函数重载的B.两个 int 型参数的和也应该是 int 型,而这里将+的返回类型声明为 doubleC.没有将运算符重载函数声明为某个类的友元D.C+已经提供了求两个 int 型数据之和的运算符+,不能再定义同样的运算符 解析:解析 此题考查的是运算符的重载。C+语言规定,不能作为非成员函数重载的运算符有=、()、-以及所有的类
23、型转换运算符,故选项 A 错误;运算符重载对返回值类型没有限制,故选项 B 错误;C+并不强制要求非成员重载的运算符一定是某个类的友元,所以 C 选项错误;题目中重载的“+”运算符的两个参数都是 int 类型,而 C+已经提供了求两个 int 型数据之和的运算符+,编译器无法区分应该调用哪一个,所以应该选择 D 选项。8.有下列程序: #include stdio.h void fun(char*a,char*b) while(*a=“*“)a+; while(*b=*a)b+;a+; void main() char+s=“*a+b*“,t80; fun(s,t);puts(t) 程序的运行
24、结果是_。(分数:2.50)A.*a*bB.a*bC.a*b* D.ab解析:解析 在程序的主函数中,maon 定义了一个指向字符串的指针和一个字符数组,然后调用fun(s,t),在 fun()中第一个 while 语句判断*a 中的值为“*”时继续扫描,如果不是“*”终止,第二个 while 循环,将*a 中从“a”开始的后续所有字符都赋予*b,也就是 t80中的内容为“a*b*”,所以此时的运行结果为选项 C。9.下面程序中对一维坐标点类 Point 进行运算符重载 #includeiostream using namespace std; class Point public: Poin
25、t(int val)x=val; Pointreturn *this; Point operator+(int)Point old=*this;+(*this);return old; Int GetX()constreturn x; private: int x; ; int main() Point a(10); cout(+a).GetX(); couta+.GetX(); return 0; 编译和运行情况是_。(分数:3.00)A.运行时输出 1011B.运行时输出 1111 C.运行时输出 1112D.编译有错解析:解析 此题考查的是重载增 1 运算符“+”。此题中,Point调用
26、前缀+的重载函数,因为返回值是改变前保存的 old 对象,故仍输出 11。10.语句 cout setprecison (3)3.1415926end1;的输出为 _ 。(分数:2.00)A.3.14 B.3.1C.3.142D.3.141解析:11.下列关于运算符重载的描述中,错误的是_。(分数:2.50)A.可以通过运算符重载在 C+中创建新的运算符 B.赋值运算符只能重载为成员函数C.运算符函数重载为类的成员函数时,第一操作数是该类对象D.重载类型转换运算符时不需要声明返回类型解析:解析 运算符重载是针对 C+中原有运算符进行的,不可能通过重载创造出新的运算符。12.有如下程序: #in
27、cludeiostream using namespace std; int main() void function(double val); double val; function(val); coutval; return 0; void function(double val) val= 3; 编译运行这个程序将出现的情况是 _ 。(分数:2.00)A.编译出错,无法运行B.输出:3C.输出:3.0D.输出一个不确定的数 解析:13.当使用 ofstream 流类定义一个流对象并打开一个磁盘文件时,文件的默认打开方式为_。(分数:2.50)A.ios base:inB.ios_bas
28、e:binaryC.ios base:in|ios_base:outD.ios_base:out 解析:解析 对于 ifstream,默认打开模式是 ios_base:in。ifstream 只能用于输入,不可用于输出。对于 ofstream,默认打开模式是 ios_base:out。ofstream 只能用于输出,不可用于输入。对于fstream,没有默认的打开模式,因此在打开文件时必须在 ios_base:in、ios_base:out 和ios_base:in|ios_base:out 这三种打开模式中指定一个。14.对长度为 n 的线性表排序,在最坏情况下,比较次数不是 n(n-1)/
29、2 的排序方法是_。(分数:1.00)A.快速排序B.冒泡排序C.直接插入排序D.堆排序 解析:解析 除了堆排序算法的比较次数是 O(nlog2n),其他的都是 n(n-1)/2。15.下列叙述中正确的是_。(分数:2.50)A.算法就是程序B.设计算法时只需要考虑数据结构的设计C.设计算法时只需要考虑结果的可靠性D.以上三种说法都不对 解析:解析 所谓算法是指解题方案的准确而完整的描述。但算法不等于程序,也不等于计算方法。故A 项错误。设计算法时要考虑可行性、确定性、有穷性和拥有足够的情报。B、C 皆错误,故选 D。16.以下程序的输出结果是 #includeiostreamh void m
30、ain() int x=1,y=3; cout x+ “ , “; int x=0;X+=y*2; coutx“ ,“y“ ;“; coutx“ ,“y; (分数:1.00)A.1,6,3,1,3B.1,6,3,6,3C.1,6,3,2,3 D.1,7,3,2,3解析:解析 coutx+;语句中,程序先输出 x 的值,然后再加 l,所以结果为 1,此时 x 的值为2;布 int x=0;x+=y*2;语句中,将 0 的值赋给 x,然后再运算 x+=y*2 的值,结果为 x=6(此时 x 的值为局部变量),y 的值不变,在最后在执行了 x 语句后的值,所以应为 2。17.下面有关重载函数的说法中
31、,正确的是 _ 。(分数:1.00)A.重载函数必须具有不同的返回值类型B.重载函数形参个数必须不同C.重载函数必须有不同的形参列表 D.重载函数名可以不同解析:解析 函数重载允许用同一个函数名定义多个函数。被重载的函数必须要有不同的形参列表。不可以根据函数返回值类型来重载函数。18.下面四个关键字中,说明友元函数的是 _ 。(分数:2.00)A.friend B.virtualC.publicD.base解析:解析 firend 是友元成员的关键字。19.已知表达式+x 中的“+”是作为成员函数重载的运算符,则与+x 等效的运算符函数调用形式为_。(分数:1.00)A.operator+(1
32、)B.operator+(x)C.operator+() D.operator+(x)解析:解析 本题考查的是前缀自增运算符的重载。由于题意中“+”是作为成员函数重载的运算符,所以若要显式的调用该运算符,需要使用该类的对象加上“.”运算符,即 x.operator+();又因为为了区分前缀运算符和后缀运算符,在调用后缀运算符时,需要给出一个整型实参值,而前缀运算符则不需要,所以+x 等效的运算符函数调用形式为:x.operator+(),答案为 C 选项。20.将 E-R 图转换到关系模式时,实体与实体间的联系可以表示成_。(分数:1.00)A.属性B.关系 C键D域解析:解析 将 E-R 图
33、转换成指定 RDBMS 中的关系模式是数据库逻辑设计的主要工作。从 E-R 图到关系模式的转换是比较直接的,实体和联系都可以表示成关系。21.若有函数调用“fun(x*y,3,max(a,b,c)”,则 fun 的实参个数为_。(分数:2.00)A.3 B.4C.5D.6解析:22.以下过程设计工具不属于图形工具的是 _ 。(分数:1.00)A.程序流程图B.PADC.HIPOD.PDL 解析:解析 常用的过程设计工具有图形工具、表格工具和语言工具,其中图形工具包括:程序流程图、N-S、PAD、HIPO:表格工具有判定表:语言工具有 PDL(伪码)。23.具有 3 个结点的二叉树有(分数:1.
34、00)A.2 种形态B.4 种形态C.7 种形态D.5 种形态 解析:解析 考查二叉树的基础知识。 解题要点 具有 3 个结点的二叉树具有以下的几种形态: 24.软件测试的目的是_。(分数:1.00)A.评估软件可靠性B.发现并改正程序中的错误C.改正程序中的错误D.发现程序中的错误 解析:解析 软件测试是为了发现错误而执行程序的过程,测试要以查找错误为中心,而不是为了演示软件的正确功能。不是为了评估软件或改正错误。25.有如下模板声明: templatetypename T1,typename T2class A; 下列声明中,与上述声明不等价的是_。(分数:1.00)A.templatec
35、lass T1,class T2class A;B.templateclass T1,typename T2class A;C.templatetypename T1,class T2class A;D.templatetypename T1,T2class A; 解析:解析 在类模板中,数据类型本身成了它的参数,因而是一种参数化类型的类,是类的生成器。声明一个类模板的格式是:template模板形参表声明类声明,模板形参表声明是由一个或多个模板形参组成。对于本题来说,模板形参表中包括类型 T1 和 T2 两个类型参数,而在选项 D 中 T1说明其类型,而 T2 没有说明其类型,与题干中的模板
36、说明不一致。26.一个非空广义表的表头 _ 。(分数:2.00)A.不可能是子表B.只能是子表C.只能是原子D.可以是子表或原子 解析:解析 一个非空广义表的表头可以是子表或原子。27.下列特征中不是面向对象方法的主要特征的是 _ 。(分数:2.00)A.多态性B.继承C.封装性D.模块化 解析:解析 面向对象设计方法与面向过程设计方法有本质的不同,其基本原理是使用现实世界的概念抽象地思考问题从而自然地解决问题。其特点包括分类性、多态性、封装性、模块独立性、继承和多态性等。模块化是结构化程序设计的特点。28.下面程序的运行结果是 _ 。 #includeiostream.h void main
37、() int i1; while(i8) if(+i%3!2)continue; else couti; (分数:2.00)A.25B.36C.258 D.369解析:解析 应镇先做+运算,然后进行%运算,最后比较不等式,实际上最后输出的结果就是被 3 除,余数为 2 的不大于 8 的数。29.下列关于构造函数的描述中,错误的是_。(分数:1.00)A.构造函数名与类名相同B.构造函数可以有返回值 C.构造函数可以重载D.每个类都有构造函数解析:解析 构造函数没有返回值,虽然叫函数但是它没有任何返回值,包括 void 型都不是,官方叫法为“构造器”。30.关于静态数据成员的描述中正确的是 _
38、。(分数:2.00)A.类的静态数据成员不是类的所有对象共享的数据B.类的静态数据成员不能被类的成员函数调用C.类的静态数据成员不能被类的构造函数调用D.类的静态数据成员必须进行初始化 解析:31.数据库设计中,用 ER 图来描述信息结构但不涉及信息在计算机中的表示,它属于数据库设计的_。(分数:2.50)A.需求分析阶段 B.逻辑设计阶段C.概念设计阶段D.物理设计阶段解析:解析 本题考查的知识点是 E-R 图。E-R 图也即实体联系图(Entity Relationship Diagram),提供了表示实体型、属性和联系的方法,用来描述现实世界的概念模型。E-R 图设计属于数据库设计的需求
39、分析阶段。32.若已知 char str 20;,且有语句 cinstr;,此时输入为“This is a program“,则所得的结果是 str= _ 。(分数:2.00)A.This is a programB.This C.This isD.This is a解析:33.有以下程序: #includeiostream using namespace std; #define PI 3.14 class Point private: int x,y; public: Point(int a,int b) x=a; y=b; int getx() return x; int gety()
40、return y; class Circle:public Point private: int r: public: Circle(int a,int b,int c):Point(a,b) r=c; int getr() return r; double area() return PI*r*r; int main() Circle c1(5,7,10); coutc1.area()endl; relurn 0; 程序执行后的输出结果是_。(分数:1.00)A.314 B.157C.78.5D.153.86解析:解析 本程序设计了一个点类 Point,包含了横、纵两个坐标数据 x 和 y,
41、由它派生出了圆类Circle,并加入了新的数据成员,即一个半径 r 和一个求圆面积的函数成员 area。在主函数 main 中,首先定义了一个圆 Circle 类的对象 c1,并通过它的构造函数初始化其数据成员。由此可知,其半径 r 的值为 10,所以其面积为 PI*10*10=314,即对象 c1 的函数成员 area 的返回值为 314。34.有如下说明: int a10=1,2,3,4,5,6,7,8,9,10,*p=a; 则数值为 9 的表达式是_。(分数:1.00)A.*p+9B.*(p+8) C.*p+=9D.p+8解析:解析 本题考查指向数组的指针,本题中指针变量 p 指向数组
42、a,那么*p 的值就是 1,即表示数组的第一个元素,那么数值为 9 的表达式就是将指针向后移动 8 个地址,即 p+8 指向的是数组元素值为9,所以数值为 9 的表达式是*(p+8)。35.执行下列语句: #includeiostream using namespace std; int main() int x=3; if(x=5) coutx+endl; else coutxendl; return 0; 程序的输出是_。(分数:2.50)A.3B.4C.5 D.6解析:解析 if条件语句 1 else 语句 2,语句的执行过程是:首先判断条件是否为真(不为 0),为真则执行语句 1,否则执行语句 2。题目中的条件是 x=5,意思是把 5 赋予变量 x,它将 x 置 5 且返回一个真值。36.下面是一个模板声明的开始部分: templatetypename Tdouble. 由此可知_。(分数:2.50)A.这可能是一个函数模板的声明 B.这可能是一个类模板的声明C.这既可能是一个函数模板的声明,也可能是一个类模板的声明D.这肯定是一个错误的模板声明解析:解析 函数模板的定义格式为 template模板形参表函数声明 类模板定义的格式为 template模板形参表类声明 可以看出,题中是一个函数模板的声明。