1、全国计算机等级考试二级 C+真题题库 1+2015 年 3 月及答案解析(总分:100.00,做题时间:120 分钟)一、选择题(每小题 1 分,共 40 分)(总题数:40,分数:40.00)1.下列排序方法中,最坏情况下比较次数最少的是( )。(分数:1.00)A.冒泡排序B.简单选择排序C.直接插入排序D.堆排序2.下面程序的运行结果为( )。 #include class A public: A()toutP:(分数:1.00)A.* P 表示的是指针变量 P 的地址B.P 表示的是变量 a 的地址,而不是变量 a 的值C.*P 表示的是指针变量 P 的值D.*P 只能用来说明 P 是
2、一个指针变量4.与语句 coutP:(分数:1.00)A.* P 表示的是指针变量 P 的地址B.P 表示的是变量 a 的地址,而不是变量 a 的值 C.*P 表示的是指针变量 P 的值D.*P 只能用来说明 P 是一个指针变量解析:P 表示的是变量 a 的地址,定义后*P 表示的是变量 a 的值。4.与语句 coutA.cout B.coutC.cout D.cout解析:题干表示的是回车换行,选项 A、B、c 都表示回车换行,而选项 D 是字符串的结尾标志。5.如果表达式 x * y+z 中,“*”是作为友元函数重载的,“+”是作为成员函数重载的,则该表达式还可为( )。(分数:1.00)
3、A.operator+(operator*(X,Y),z) B.xoperator+(operator * (x,y),Z)C.Yoperator * (operator+(x,Y),z)D.xoperator+(operator(X,Y)解析:C+中用成员函数重载 x * y 为:xoper-ator(y),用友元函数重载 x*Y 为:(,perator*(x,Y),用成员函数重载 x+Y 为:xoperator+(Y),用友元函数重载 x+Y 为:operator+(x,Y)。6.在下列关键字中,不能用来表示继承方式的是( )。(分数:1.00)A.privateB.static C.pu
4、blicD.protected解析:3 种继承方式:公用继承、私有继承和保护继承分别使用 public、private 和 protected3 个关键字来定义。7.下面的( )选项不能作为函数的返回类型。(分数:1.00)A.voidB.intC.new D.long解析:new 是动态申请内存空间时使用的关键字,不能作为函数的返回类型,选项 A 为无返回值,选项 B为返回整型,选项 D 为返回长整型。8.有如下函数定义: void funC(int a,int&Ba+;b+; 若执行代码段: int x=0,Y=1: funC(X,y); 则变量 X 和 y 的值分别是( )。(分数:1.
5、00)A.0 和 1B.1 和 1C.0 和 2 D.1 和 2解析:函数参数的 3 种传递方式:将变量名作为形参和实参,即传值方式;传递变量指针;引用形参。本题中实参 x 为传值方式,所以 X 的值不会改变;Y 为引用形参,所以会改变。故本题答案为 C。9.定义无符号整数类为 UInt,下面可以作为类 UInt 实例化值的是( )。(分数:1.00)A.-369B.369 C.0.369D.整数集合1,2,3,4,5解析:只有 B 选项中 369 可以用无符号整数来表示和存储。A 选项中一 369 有负号,选项 C 中 0369 是小数都不能用无符号整数类存储。选项 D 是一个整数集合得用数
6、组来存储。10.下列关于类定义的说法中,正确的是( )。(分数:1.00)A.类定义中包括数据成员和函数成员的声明 B.类成员的缺省访问权限是保护的C.数据成员必须被声明为私有的D.成员函数只能在类体外进行定义解析:类的成员的缺省访问权限是私有的,数据成员可以是私有,可以是公用的,也可以是受保护的。类的成员函数可以在类内定义。11.有如下程序: #nclude using namespace std; int main() void function(double val); double val; function(val); coutA.编译出错,无法运行B.输出:3C.输出:30D.输出
7、一个不确定的数 解析:本题考查函数调用及传值方式传递参数,执行函数 function 时,并没有将 3 的值传回来,而 val又没有初始化,所以会输出一个不确定的值,D 选项正确。12.this 指针是 C+语言实现( )的一种机制。(分数:1.00)A.抽象B.封装 C.继承D.重载解析:this 指针是 c+语言实现封装的一一种机制,它将对象和该对象调用的成员函数连接在一起在外部看来,每-个对象都拥有自己的函数成员。13.下面关于虚函数的描述,错误的是( )。(分数:1.00)A.在成员函数声明的前面加上 virtual 修饰,就可把该函数声明为虚函数B.基类中说明了虚函数后,派生类中对应
8、的函数也必须说明为虚数 C.虚函数可以是另一个类的友元函数,但不能是静态成员函数D.基类中说明的纯虚函数在其任何派生类中都必须实现解析:基类中说明的虚函数,在派生类中自然就是虚函数,对于纯虚函数必须在后面继承的派生类中给出具体的实现;静态成员函数不能进行动态联编,所以虚函数不能是静态的。14.有如下程序: #include using namespaee std; int main() void function(double val); double val: function(val); eoutA.编译出错,无法运行B.输出:3C.输出:30D.输出一个不确定的数 解析:本题考查函数调用
9、及传值方式传递参数,执行函数 function 时,并没有将 3 的值传回来,而 val又没有初始化,所以会输出一个不确定的值,D 选项正确。15.面向对象方法中,继承是指( )。(分数:1.00)A.一组对象所具有的相似性质B.一个对象具有另一个对象的性质C.各对象之间的共同性质D.类之间共享属性和操作的机制 解析:继承是面向对象的方法的一个主要特征,是使用已有的类的定义作为基础建立新类的定义技术。广义的说,继承是指能够直接获得已有的性质和特征,而不必重复定义它们,所以说继承是指类之间共享属性和操作的机制。16.下列程序的运行结果为( )。 #include void main() int
10、a=2: int b=a+1: coutA.066667B.0 C.07D.066666666解析:表达式值的类型是由操作数的类型决定的,因为本题的两个数都是 int 型的,所以得出的结果也为int 型,即去掉小数点后的部分,只取商的整数部分。17.有如下定义: int a5=1,3,5,7,9,* P=a; 下列表达式中不能得到数值 5 的是( )。(分数:1.00)A.a2B.a3 C.*(P+2)D.+P+4解析:本题考查指向数组的指针,本题中指针变量 P 指向数组 a,直接使用数组下标即可取值,数组 F 标是从 0 开始标号的,所以 a2能取到 5,而 a3取不到 5,(:选项中使用指
11、针后移方法能够取到 5,D 选项中*P 为 1,所以*P+4 为 5。18.C+系统预定义了 4 个用于标准数据流的对象,下列选项中不属于此类对象的是( )。(分数:1.00)A.coutB.cinC.cerrD.cset 解析:c+标准数据流的对象分别足 cout、cin、CelT、cl09,所以本题答案为 D。19.有如下程序: #include using namespace std; class GA public: virtual int f()t retum l; ;class GB:public GA public: virtual int f()retum 2; ; void
12、show(GA g)eoutA.1111B.1211C.1112 D.1212解析:本题主要考察虚函数。虚函数指在某基类中声明为 virtual 并在一一个或多个派生类中被重新定义的成员函数,本题中定义类 GA 的对象 a,执行 show(a)、display(a),输出 ll,定义了类 GB 的对象 b,执行 show(b),仍然输出 1,display(b)执行会调用派生类的 f 函数,因为 f 函数为虚函数,输出 2,所以本题答案为 c。20.下列叙述中正确的是( )。(分数:1.00)A.有一个以上根结点的数据结构不一定是非线性结构B.只有一个根结点的数据结构不一定是线性结构 C.循环
13、链表是非线性结构D.双向链表是非线性结构解析:线性结构应满足:有且只有一个根结点与每个结点最多有一个前件,也最多有一个后件,所以 8 正确。所以有一个以上根结点的数据结构一定是非线性结构,所以 A 错误。循环链表和双向链表都是线性结构的数据结构。21.下列关于虚函数的说明中,正确的是( )。(分数:1.00)A.从虚基类继承的函数都是虚函数B.虚函数不得是静态成员函数 C.只能通过指针或引用调用虚函数D.抽象类中的成员函数都是虚函数解析:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数一虚函数必须是基类的非静态成员函数,其访问权限可以是 protected 或 pu
14、blic。如果一个类包含了纯虚函数,称此类为抽象类。所以本题答案为 B。22.某二叉树共有 7 个结点,其中叶子结点只有 l 个,则该二叉树的深度为(假设根结点在第 1 层)( )。(分数:1.00)A.3B.4C.6D.7 解析:根据二叉树的基本性质 3:在任意一棵二叉树中,度为 0 的叶子结点总比度为 2 的结点多一个,所以本题中度为 2 的结点为 1-1=0 个,所以可以知道本题目中的二叉树的每一个结点都有一个分支,所以共7 个结点共 7 层,即度为 7。23.在数据库设计中,将 ER 图转换成关系数据模型的过程属于( )。(分数:1.00)A.需求分析阶段B.概念设计阶段C.逻辑设计阶
15、段 D.物理设计阶段解析:ER 图转换成关系模型数据则是把图形分析出来的联系反映到数据库中,即设计出表,所以属于逻辑设计阶段。24.下列关于类模板的模板参数的叙述中,错误的是( )。(分数:1.00)A.模板参数可以作为数据成员的类型B.模板参数可以作为成员函数的返回类型C.模板参数可以作为成员函数的参数类型D.模板参数不能作为成员函数的局部变量的类型 解析:本题考查类模板的概念和定义,模板参数可以作为成员函数的局部变量的类型。25.在软件开发中,需求分析阶段产生的主要文档是( )。(分数:1.00)A.可行性分析报告B.软件需求规格说明书 C.概要没计说明书D.集成测试计划解析:A 错误,可
16、行性分析阶段产生可行性分析报告。C 错误,概要设计说明书是总体设计阶段产生的文档。D 错误,集成测试计划是在概要设计阶段编写的文档。B 正确,软件需求规格说明书是后续工作如设计、编码等需要的重要参考文档。26.下面关于模板的描述,错误的是( )。(分数:1.00)A.函数模板和类模板的参数可以是任意的数据类型 B.类模板不能直接使用,必须先实例化为相应的模板类,然后定义了模板类的对象后才能使用C.函数模板不能直接使用,需要实例化为模板函数后才能使用D.类模板的成员函数都是模板函数解析:类模板不能被重载,而函数模板可以,它们不能被未知的数据类型替换。27.数据库系统的三级模式不包括( )。(分数
17、:1.00)A.概念模式B.内模式C.外模式D.数据模式 解析:数据库系统的二二级模式是概念模式、外模式和内模式,所以选择 D。28.下列语句中不是死循环的是( )。(分数:1.00)A.int i=10; B.for(int i=1;j10;i+)while(1) i-; i-; if(i=1)break;C.int i-0;D.int i=1:解析:选项 A 中 i 自减到 1 时就会执行 break 语句跳出循环,选项 B 中 i0 永远不会跳出循环,选项 D 中未给出结束循环的条件。29.为了取代 c 中带参数的宏,在 c+中使用( )。(分数:1.00)A.重载函数B.内联函数 C.
18、递归函数D.友元函数解析:一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换,即类似于宏。30.C+语言对 C 语言做了很多改进,C+语言相对于 C 语言的最根本的变化是( )。(分数:1.00)A.增加了一些新的运算符B.允许函数重载,并允许设置默认参数C.规定函数说明符必须用原型D.引进了类和对象的概念 解析:c+语言最重要的特点是其为一种面向对象的程序设计语言,但是 c+语言也包含了 C 语寿的全部特征。31.派生类的成员函数不能访问基类的( )。(分数:1.00)A.公有成员和保护成员B.公有成员C.私有
19、成员 D.保护成员解析:本题考查 3 种继承方式,其中,基类的私有成员始终为基类私有。所以派生类无法访问基类的私有成员。本题答案为 c。32.下列代码段中声明了 3 个类: Class Person; Class Student:publiC Person; Class Undergraduate:Student; 下列关于这些类之间关系的描述中,错误的是( )。(分数:1.00)A.类 Person 是类 Undergraduate 的基类B.类 Undergraduate 从类 Student 公有继承 C.类 Student 是类 Person 的派生类D.类 Undergraduate
20、 是类 Person 的派生类解析:本题考查基类和派生类的逻辑关系,属于基础知汉,如果没有指明哪种继承方式,那么默认为私有继承,所以 B 选项错误。33.若有下面的函数调用: fun(fl+b,3,max(n 一 1,B) 则 fun 的实参个数是( )。(分数:1.00)A.3 B.4C.5D.6解析:本题考查函数实参个数的基础知识,根据实参的概念,(a+b)、3、mflJc(n 一 1,b)分别为其中的3 个实参。故答案为 A。34.有如下两个类定义: class XX private: double xl; protected: double x2; public: double x3;
21、 ; class YY:protected XX private: double yl; protected: double y2; public: double y3; 在类 YY 中保护成员变量的个数是( )。(分数:1.00)A.1B.2C.3 D.4解析:本题考查保护继承中派生类对基类的访问属性,在受保护继承中,基类的公用成员和保护成员在派生类中成了保护成员,所以基类的成员 x2、x3 变成了保护成员,派生类中的 y2 也是保护成员,所以共有3 个保护成员。本题答案为 C。35.下列关于运算符重载的描述中,正确的是( )。(分数:1.00)A.运算符重载为成员函数时,若参数表中无参数,
22、重载的是一元运算符 B.一元运算符只能作为成员函数重载C.二元运算符重载为非成员函数时,参数表中有一个参数D.C+中可以重载所有的运算符解析:运算符重载为成员函数时,会省一个参数,如果无参数,表明是一元运算符。一元运算符既可以作为成员函数重载,也可以作为非成员函数重载。二元运算符如果作勾非成员函数,则参数表中必须有两个参数。c+有 5 个运算符不能重载,它们是:(成员访问运算符)、*(成员指针访问运算符)、:(域运算符)、sizeof(长度运算符)和?:(条件运算符)。故本题答案为 A。36.建立派生类对象时,3 种构造函数分别是 a(基类的构造函数)、b(成员对象的构造函数)、C(派生类)构
23、造函数),这 3 种构造函数的调用顺序为( )。(分数:1.00)A.abC B.aCbC.CabD.Cba解析:本题考查的是在继承中派生类的对象调用构造函数的顺序,应该是先调用基类的构造函数,然后是成员中的对象对应类的构造函数,最后是派生类自已的构造函数。37.在下列枚举符号中,用来表示“相对于当前位置”文件定位方式的是( )。(分数:1.00)A.ios_base:cur B.iosbase:begC.los_base:0utD.iosbase:end解析:streamoff 定义于 iostreamh 中,定义有偏移量 0ffset 所能取得的最大值,seekdir 表示移动的基准位置,
24、是一个有以下值的枚举:ios:be9:(文件开头)、ios:cur:(文件当前位置)、ios:end:(文件结尾)。38.当使用 ifstream 流类定义一个流对象并打开一个磁盘文件时,文件的默认打开方式为( )。(分数:1.00)A.ios-base:in B.ios-base:in l ios base:0utC.los base;:0utD.ios_base:in&ios_base:0ut解析:本题考查对文件输入流的操作,ifstream 流类为输入流类,默认的文件输入流扣开方式为ios:in。故答案为 A。39.下列有关运算符重载的叙述中,正确的是( )。(分数:1.00)A.运算符
25、重载是多态性的一种表现 B.C+中可以通过运算符重载创造新的运算符C.C+中所有运算符都可以作为非成员函数重载D.重载运算符时可以改变其结合性解析:重载运算符的规则如 F:c+不允许用户自己定义新的运算符,只能对已有的 c+运算符进行重载;c+不能重载的运算符只有 5 个;重载不能改变运算符运算对象的个数;重载不能改变运算符的优先级和结合性;重载运算符的函数不能有默认的参数;重载的运算符必须和用户定义的自定义类型的对象一起使用,至少应有一个是类对象,即不允许参数全部是 c+的标准类型。故本题答案为 A。40.必须用一对大括号括起来的程序段是( )。(分数:1.00)A.switCh 语句中的
26、ease 标号语句B.if 语句的分支C.循环语句的循环体D.函数的函数体 解析:本题考查 C+基本控制结构A、B、C 三个选项中的大括号不是必须的,而 D 选项中的函数体必须使用大括号。二、基本操作题(18 分)(总题数:1,分数:18.00)41.请使用 VC6 或使用【答题】菜单打开考生文件夹 projl 下的工程 projl,该工程含有一个源程序文件pn,jlcpp。其中位于每个注释“/ERROR 木水 found水木”之后的一行语句存在错误。请改正这些错误,使程序的输出结果为: The value is 10 注意:只修改注释“/ERROR * found*”的下一行语句,不要改动程
27、序中的其他内容。 /pmjlcpp #include using namespace std; class MyClass int value; public: /ERROR*found* void MyClass(int val):value(val) int GetValue()constreturn value; void SetValue(int val); ; /ERROR*found* inline void SetValue(int val)value=val; int main() MyClass obj(O); objSetValue(10); /ERROR*found*下列
28、语句功能是输出 obj 的成员 value 的值 toutobjvalue_正确答案:(1)MyClass(int val):value(val) (2)void MyClass:SetValue(int val)value=val; (3)cout“”The value is”“objGetValue()“end1;)解析:三、简单应用题(24 分)(总题数:1,分数:24.00)42.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj2 下的工程 proj2,其中有矩阵基类MatrixBase、矩阵类 Matrix 和单位阵 UnitMatrix 的定义,还有 main 函数的定义
29、。请在横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为: 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“/t+found 母 *”。 #nClude using namespaCe std; /矩阵基础类,一个抽象类 Class MatrixBase int rows,Cols; publiC: MatrixBase(int rows,
30、int Cols):roWS(rows),Cow(Cols) int getRows()Constretum rows;/矩阵行数 int getCols()Constreturn Cols;/矩阵列数 virtual double getElement(int r,int C)Const=0;/取第 i 个元素的值 void show()Const/分行显示矩阵中所有元素 for(int i=0;i _正确答案:(1)getElemenl(1,i) f2)MatrixBase(rows,cols) (3)flew doublerows*cols (4)r=C)解析:四、综合应用题(18 分)
31、(总题数:1,分数:18.00)43.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj3 下的工程 proj3,其中声明的 CDeepCopy 是一个用于表示矩阵的类。请编写这个类的赋值运算符成员函数 0perator=,以实现深层复制。 要求: 补充编制的内容写在“/*333*”与“/*666*”之间。不得修改程序的其他部分。 注意:程序最后将结果输出到文件 outdat 中。输出函数 writeToFile 已经编译为 obj 文件,并且在本程序中调用。 /CDeepCopyh #include #include using namespace std; class CDeepC
32、opy public: int n;/动态数组的元素个数 int *p;/动态数组首地址 CDeepCopy(int); CDeepCopy(); CDeepCopy&operator=(const CDeepCopy&r);/赋值运算符函数 ;void writeToFile(char); /maincpp #include”CDeepCopyh” CDeepCopy:一 CDeepCopy()deleteP; CDeepCopy:CDeepCopy(int k)n=k;p=new intn;/构造函数实现 CDeepCopy&CDeepCopy:0perator=(const CDeepCopy&r)/赋值运算符函数实现 /*333* /*666* int main() CDeepCopy a(2),d(3); apO=1;dpO=666;/对象 a,d 数组元素的赋值 CDeepCopy b(3);/调用赋值运算符函数 apO=88;b=a; cout_正确答案:(lq=rn;/把对象 r 字符长度赋值给 n deleteP;/删除动态数组 P P=new intn;/给动态数组 P 分配空间为 n for(int i=0;i解析: