1、国家二级(C+)机试-试卷 7-1 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.一个栈的初始状态为空。现将元素 1、2、3、4、5、A、B、C、D、E 依次入栈,然后再依次出栈,则元素出栈的顺序是( )。(分数:2.00)A.12345ABCDEB.EDCBA54321C.ABCDE12345D.54321EDCBA2.下列符号中不属于 C+关键字的是( )。(分数:2.00)A.friendB.namespaceC.continueD.byte3.有如下程序: #include using namespace std; class CD
2、 public: CD() coutGetValue(); / sp-Task:GetValue(); / sp-Displayed:GetValue(); / sp-Draw(); / 在标注号码的语句行中,对类中成员访问存在二义性的是(分数:2.00)A.B.C.D.10.一个运动队有多个队员,一个队员仅属于一个运动队,一个队一般都有一个教练,则实体运动队和队员的联系是(分数:2.00)A.一对多B.一对一C.多对一D.多对多11.有如下程序: #include using namespace std; void fun(int c=a; a=b; b=c; int main() int
3、x,y; x=1; y=2; fun(x,y); coutopen(“file.dat“);16.下列字符中,可以出现在合法的 C+标识符中的是(分数:2.00)A.:B.C. class AA public: virtual void disp() coutGetValue(); / sp-Task:GetValue(); / sp-Displayed:GetValue(); / sp-Draw(); / 在标注号码的语句行中,对类中成员访问存在二义性的是(分数:2.00)A.B.C.D.28.下列关于货币数据类型的叙述中,错误的是(分数:2.00)A.DOUBLEB.abcC._5_D.x
4、yz29.在 C+中,编译系统自动为一个类生成默认构造函数的条件是(分数:2.00)A.该类没有定义任何公有构造函数B.该类没有定义任何无参构造函数C.该类没有定义任何构造函数D.该类没有定义任何成员函数30.某二叉树中有 15 个度为 1 的结点,16 个度为 2 的结点,则该二叉树中总的结点数为(分数:2.00)A.32B.46C.48D.4931.有如下类定义: class Base public: void fun() coutfun();C.Base:fun();D.fun();32.有如下类定义: class Base public: int a; protected: int b
5、; private: int c; ; class Derived: public Base protected: int d; ;若 obj 是类 Derived 的对象,以下语句编译正确的是(分数:2.00)A.obj.a;B.obj.b;C.obj.c;D.obj.d;33.在函数中,可以用 auto、extern、register 和 static 这四个关键字中的一个来说明变量的存储类型,如果不说明存储类型,则默认的存储类型是( )。(分数:2.00)A.autoB.externC.registerD.static34.有如下程序: #include using namespace
6、std; class Music public: void setTitle(char* str) strcpy(title, str); protected: char type10; private: char title20; ; class Jazz : public Music public: void set(char* str) strcpy(type, “Jazz“); / strcpy(title, str); / ; 下列叙述中正确的是( )。(分数:2.00)A.程序编译正确B.程序编译时语句出错C.程序编译时语句出错D.程序编译时语句和都出错35.已知枚举类型声明语句为
7、:enum COLOR WHITE, YELLOW, GREEN=5, RED, BLACK=10 ;则下列说法中错误的是( )。(分数:2.00)A.枚举常量 YELLOW 的值为 1B.枚举常量 RED 的值为 6C.枚举常量 BLACK 的值为 10D.枚举常量 WHITE 的值为 136.有如下类定义: class Cup public: Cup(double val,string cr=“red“):price(val),color(cr) / Cup(); / private: string color; / double price=5.8; / ;在标注号码的语句行中存在语法错
8、误的是(分数:2.00)A.B.C.D.37.负责数据库中查询操作的数据库语言是( )。(分数:2.00)A.数据定义语言B.数据管理语言C.数据操纵语言D.数据控制语言38.如果派生类以 protected 方式继承基类,则原基类的 protected 成员和 public 成员在派生类中的访问属性分别是(分数:2.00)A.public 和 publicB.public 和 protectedC.protected 和 publicD.protected 和 protected39.对长度为 n 的线性表排序,在最坏情况下,比较次数不是 n(n1)/2 的排序方法是( )。(分数:2.00
9、)A.快速排序B.冒泡排序C.直接插入排序D.堆排序40.有如下类声明和函数声明 class Base int m; public: int n; protected: int p; ; class Derived: public Base int k; friend void f(Derived d); ;则在函数 f 中通过 d 可访问类数据成员的个数是(分数:2.00)A.1B.2C.3D.4二、基本操作题(总题数:1,分数:2.00)41.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj1 下的工程 proj1,其中有矩形类 Rectangle、函数 show 和主函数 ma
10、in 的定义。程序中位于每个“ERROR*found*”下一行的语句有错误,请力11 以改正。改正后程序的输出结果应该是:Upperleft=(1,8),downright:(5,2),areal=24注意:只修改每个“ERROR*found*”下的那一行,不要改动程序中的其他内容。#includeiostream#includecmathusingnamespacestd;classRectangledoublex1ty1;左上角坐标 doublex2,y2;右下角坐标public:ERROR*found*Rectangle(doublex1,y1;doublex2,y2)this-x1=x
11、1;this-y1=y1;thiS-x2=x2;this-y2=y2;doublegetXl()constreturnx1;doublegetYl()constreturny1;doublegetX2()constreturnx2;doublegetY2()constreturny2;doublegetHeight()constreturnfabs(y1y2);doublegetWidth()constfreturnfabs(x1x2);doublearea()constreturngetHeight()*getWidth();ERROR*found*voidshow(Rectangler)c
12、onstcout“Upperleft=(“;ERROR*found*coutrx1”,”ry1”),downright=(“rx2“,“ry2;cout“),area=“rarea()“end1;intmain()Rectanglerl(1,8,5,2);show(r1);return0;(分数:2.00)_三、简单应用题(总题数:1,分数:2.00)42.请使用 VC6 或使用【答题】菜单打开考生文件夹 prog2 下的工程 prog2,此工程中包含一个程序文件mmncpp,其中有“班级”类 Class 和“学生”类 Student 的定义,还有主函数 main 的定义。在主函数中定义了两个
13、“学生”对象,他们属于同一班级。程序展示,当该班级换教室后,这两个人的教室也同时得到改变。请在横线处填写适当的代码,然后删除横线,以实现上述类定义。此程序的正确输出结果应为:改换教室前:学号:0789 姓名:张三班级:062113 教室:521 学号:0513 姓名:李四班级:062113 教室:521 改换教室后:学号:0789 姓名:张三班级:062113 教室:311 学号:0513 姓名:李四班级:062113教室:311 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容。#includeiostreamusingnamespacestd;classClass(“班级”类pu
14、blic:Class(constchar*id,constchar*room)strcpy(classid,id);f*found*constchar*getClassID()constreturnclassid;返回班号*found*constchar*getClassroom()const_返回所在教室房号voidchangeRoomTo(constchar*newroom)改换到另一个指定房号的教室strcpy(classroom,new_room);private:charclassid20;班号 charclassroom20;所在教室房号;classStudent“学生”类 cha
15、rmyid10;学号 charmyname20;姓名Class class CD public: CD() coutGetValue(); / sp-Task:GetValue(); / sp-Displayed:GetValue(); / sp-Draw(); / 在标注号码的语句行中,对类中成员访问存在二义性的是(分数:2.00)A. B.C.D.解析:解析:本题考查派生类对基类的继承二义性问题,类 Satellite 公用继承 Task 和 Displayed,两个基类中都有 GetValue 函数,所以引起二义性,A 选项错误。10.一个运动队有多个队员,一个队员仅属于一个运动队,一个
16、队一般都有一个教练,则实体运动队和队员的联系是(分数:2.00)A.一对多 B.一对一C.多对一D.多对多解析:解析:一般来说,实体集之间必须通过联系来建立联接关系,分为三类:一对一联系(1:1)、一对多联系(1:m)、多对多联系(m:n)。实体运动队和队员的关系为 1:m 联系,故 A 选项正确。11.有如下程序: #include using namespace std; void fun(int c=a; a=b; b=c; int main() int x,y; x=1; y=2; fun(x,y); coutopen(“file.dat“);解析:解析:本题考查对文件流输入的操作,可
17、以调用文件流的成员函数 pen,一般形式如下:文件流对象.open(磁盘文件名,输入/输出方式)。根据以上格式,可以判断 A 选项错误。16.下列字符中,可以出现在合法的 C+标识符中的是(分数:2.00)A.:B.C. class AA public: virtual void disp() coutGetValue(); / sp-Task:GetValue(); / sp-Displayed:GetValue(); / sp-Draw(); / 在标注号码的语句行中,对类中成员访问存在二义性的是(分数:2.00)A. B.C.D.解析:解析:本题考查派生类对基类的继承二义性问题,类 Sa
18、tellite 公用继承 Task 和 Displayed,两个基类中都有 GetValue 函数,所以引起二义性,A 选项错误。28.下列关于货币数据类型的叙述中,错误的是(分数:2.00)A.DOUBLEB.abc C._5_D.xyz解析:解析:C+的标识符由字母、数字和下划线组成,其中必须以字母或下划线开头。选项 B 错误,答案选 B。29.在 C+中,编译系统自动为一个类生成默认构造函数的条件是(分数:2.00)A.该类没有定义任何公有构造函数B.该类没有定义任何无参构造函数C.该类没有定义任何构造函数 D.该类没有定义任何成员函数解析:解析:C+中,只有当一个类没有定义构造函数时,
19、编译器才会自动生成一个默认构造函数,一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数;答案为 C。30.某二叉树中有 15 个度为 1 的结点,16 个度为 2 的结点,则该二叉树中总的结点数为(分数:2.00)A.32B.46C.48 D.49解析:解析:在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。对任何一棵二叉树,度为 0 的结点(即叶子结点)总是比度为 2 的结点多一个。由 16 个度为 2 的结点可知叶子结点个数为 17,则结点结点总数为 16+17+15=48,C 选项正确。31.有如下类定义: class Base public:
20、 void fun() coutfun();C.Base:fun(); D.fun();解析:解析:基类 Base 和派生类 Derived 中使用同一名字的成员函数 fun,所以在派生类 Derived 的作用域中,派生类 Derived 中的 fun 函数会屏蔽基类 Base 中的 fun 函数,即 Base 的 fun 函数对 Derived 不可见,这是因为编译器在查找名字 fun 时,首先在 Derived 中找到,这样编译器就不再继续查找,所以若想在 Derived 中调用 Base 的 fun 函数,必须显式的说明 fun 函数属于 Base,这里使用作用域运算符访问被屏蔽的 f
21、un,调用语句为:Base:fun();答案为 C。32.有如下类定义: class Base public: int a; protected: int b; private: int c; ; class Derived: public Base protected: int d; ;若 obj 是类 Derived 的对象,以下语句编译正确的是(分数:2.00)A.obj.a; B.obj.b;C.obj.c;D.obj.d;解析:解析:类 Derived 以 public 方式继承 Base,所以 a 在 Derived 中是 public 成员,b 在 Derived 中是 prot
22、ected 成员,c 对 Derived 不可见;所以对类 Derived 对象 obj 可见的成员为 a,答案为 A。33.在函数中,可以用 auto、extern、register 和 static 这四个关键字中的一个来说明变量的存储类型,如果不说明存储类型,则默认的存储类型是( )。(分数:2.00)A.auto B.externC.registerD.static解析:解析:变量的存储方法分为静态存储和动态存储两大类,包含 4 种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。变量如果没有说明存储类型,那么默认就是 auto。34.
23、有如下程序: #include using namespace std; class Music public: void setTitle(char* str) strcpy(title, str); protected: char type10; private: char title20; ; class Jazz : public Music public: void set(char* str) strcpy(type, “Jazz“); / strcpy(title, str); / ; 下列叙述中正确的是( )。(分数:2.00)A.程序编译正确B.程序编译时语句出错C.程序编译
24、时语句出错 D.程序编译时语句和都出错解析:解析:本题考查公用继承和保护继承对基类成员的访问属性。公用继承中,基类的公用成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有。保护成员不能被类外访问,但是可以被派生类的成员函数访问。Type 成为派生类的保护成员,可以被派生类访问,title 仍为基类私有,派生类不能直接访问。所以答案为 C。35.已知枚举类型声明语句为:enum COLOR WHITE, YELLOW, GREEN=5, RED, BLACK=10 ;则下列说法中错误的是( )。(分数:2.00)A.枚举常量 YELLOW 的值为 1B.枚举常量 RED 的值为 6
25、C.枚举常量 BLACK 的值为 10D.枚举常量 WHITE 的值为 1 解析:解析:C+语言规定枚举常量的默认值依次等于 0,1,n-l。也可以给枚举常量赋初值,方法是:在枚举常量的后面跟上“=整型常量“,在给枚举常量赋初值时,如果给其中任何一个枚举常量赋初值,则其后的枚举常量将按自然数的规则依次赋初值。所以本题答案为 D。36.有如下类定义: class Cup public: Cup(double val,string cr=“red“):price(val),color(cr) / Cup(); / private: string color; / double price=5.8;
26、 / ;在标注号码的语句行中存在语法错误的是(分数:2.00)A.B.C.D. 解析:解析:本题考查如何初始化对象,其中类的数据成员是不能再声明类时初始化的,所以 D 选项错误,在定义类的同时对数据成员 price 进行赋值是错误的。37.负责数据库中查询操作的数据库语言是( )。(分数:2.00)A.数据定义语言B.数据管理语言C.数据操纵语言 D.数据控制语言解析:解析:数据定义语言:负责数据的模式定义与数据的物理存取构建;数据操纵语言:负责数据的操纵,包括查询及增、删、改等操作;数据控制语言:负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等功能。38.如果派生类以 protec
27、ted 方式继承基类,则原基类的 protected 成员和 public 成员在派生类中的访问属性分别是(分数:2.00)A.public 和 publicB.public 和 protectedC.protected 和 publicD.protected 和 protected 解析:解析:本题考查继承与派生,派生类中的成员访问基类中的成员由派生方式决定,派生类保护继承基类,那么基类中的私有成员不可访问,基类的保护成员和公用成员变成了派生类的保护成员。所以 D 选项正确。39.对长度为 n 的线性表排序,在最坏情况下,比较次数不是 n(n1)/2 的排序方法是( )。(分数:2.00)A
28、.快速排序B.冒泡排序C.直接插入排序D.堆排序 解析:解析:除了堆排序算法的比较次数是 O(nlog 2 n),其他的都是 n(n1)/2。40.有如下类声明和函数声明 class Base int m; public: int n; protected: int p; ; class Derived: public Base int k; friend void f(Derived d); ;则在函数 f 中通过 d 可访问类数据成员的个数是(分数:2.00)A.1B.2C.3 D.4解析:解析:公有继承中,派生类不改变基类的成员访问权限(private 成员除外),即基类的 public
29、 成员在派生类中是 public 成员,基类的 protected 成员在派生类中是 protected 成员;另外友元函数可以访问类的 private 成员、protected 成员和 public 成员,所以 f 函数中 d 可以访问的数据成员有:n、p、k;m 对派生类不可见;答案为 C。二、基本操作题(总题数:1,分数:2.00)41.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj1 下的工程 proj1,其中有矩形类 Rectangle、函数 show 和主函数 main 的定义。程序中位于每个“ERROR*found*”下一行的语句有错误,请力11 以改正。改正后程序的
30、输出结果应该是:Upperleft=(1,8),downright:(5,2),areal=24注意:只修改每个“ERROR*found*”下的那一行,不要改动程序中的其他内容。#includeiostream#includecmathusingnamespacestd;classRectangledoublex1ty1;左上角坐标 doublex2,y2;右下角坐标public:ERROR*found*Rectangle(doublex1,y1;doublex2,y2)this-x1=x1;this-y1=y1;thiS-x2=x2;this-y2=y2;doublegetXl()const
31、returnx1;doublegetYl()constreturny1;doublegetX2()constreturnx2;doublegetY2()constreturny2;doublegetHeight()constreturnfabs(y1y2);doublegetWidth()constfreturnfabs(x1x2);doublearea()constreturngetHeight()*getWidth();ERROR*found*voidshow(Rectangler)constcout“Upperleft=(“;ERROR*found*coutrx1”,”ry1”),dow
32、nright=(“rx2“,“ry2;cout“),area=“rarea()“end1;intmain()Rectanglerl(1,8,5,2);show(r1);return0;(分数:2.00)_正确答案:(正确答案:(1)Rectangle(double x1, double y1, double x2, double y2) (2)void show(Rectangle r) (3)cout r.getX1() “ , “ r.getY1() “),down right=(“ r.getX2() “ , “ r.getY2();)解析:解析:(1)主要考查考生对构造函数的掌握,函数
33、的参数要使用“,“隔开,不能使用“;“。 (2)主要考查考生对 const 函数的掌握,程序中调用函数 r.area(),该函数修改了成员值,因此不能使用 const。 (3)主要考查考生对成员函数的掌握,类外函数不能直接调用类的私有成员,只能通过成员函数调用。三、简单应用题(总题数:1,分数:2.00)42.请使用 VC6 或使用【答题】菜单打开考生文件夹 prog2 下的工程 prog2,此工程中包含一个程序文件mmncpp,其中有“班级”类 Class 和“学生”类 Student 的定义,还有主函数 main 的定义。在主函数中定义了两个“学生”对象,他们属于同一班级。程序展示,当该班
34、级换教室后,这两个人的教室也同时得到改变。请在横线处填写适当的代码,然后删除横线,以实现上述类定义。此程序的正确输出结果应为:改换教室前:学号:0789 姓名:张三班级:062113 教室:521 学号:0513 姓名:李四班级:062113 教室:521 改换教室后:学号:0789 姓名:张三班级:062113 教室:311 学号:0513 姓名:李四班级:062113教室:311 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容。#includeiostreamusingnamespacestd;classClass(“班级”类public:Class(constchar*id,
35、constchar*room)strcpy(classid,id);f*found*constchar*getClassID()constreturnclassid;返回班号*found*constchar*getClassroom()const_返回所在教室房号voidchangeRoomTo(constchar*newroom)改换到另一个指定房号的教室strcpy(classroom,new_room);private:charclassid20;班号 charclassroom20;所在教室房号;classStudent“学生”类 charmyid10;学号 charmyname20;姓名Class for (int i = 0; i size; i+)/判断数组元素 if (vi != other.vi) return false; return true;)解析:解析:主要考查考生对数组的掌握,函数 bool ValArray:equals(const ValArray& other)要求判断两个数组是否相等,先判断数组长度,如果长度相同再根据数组元素依次判断。