1、国家二级(C+)机试-试卷 7-2 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.数据流图中带有箭头的线段表示的是( )。(分数:2.00)A.控制流B.事件驱动C.模块调用D.数据流2.将前缀运算符“-“重载为非成员函数,下列原型中能正确用于类中说明的是( )。(分数:2.00)A.DecrB.Decroperator-(DecrC.friendDecrD.friendDecroperator-(Decr3.有如下程序: #include using namespace std; class Base public: Base(int x
2、=0) coutTabs(Tx);18.要定义整型数组 x,使之包括初值为 1 的三个元素,下列语句正确的是(分数:2.00)A.staticintx3=1;B.intx3;x1=x2=x3=1;C.intx3=1,1,1;D.intx=1,1,1;19.有如下类定义: class Base int l; public: int m; private: int n; ; class Derived: public Base;则类 Derived 所拥有的数据成员的个数是(分数:2.00)A.0B.1C.2D.320.软件按功能可以分为:应用软件、系统软件和支撑软件(或工具软件)。下面属于应用软
3、件的是( )。(分数:2.00)A.编译程序B.操作系统C.教务管理系统D.汇编程序21.有如下函数定义:void func(int a, int b+; 若执行代码段:int x = 0, y = 1;func(x, y);则变量 x 和 y 的值分别是( )。(分数:2.00)A.0 和 1B.1 和 1C.0 和 2D.1 和 222.下列有关模板的叙述中,正确的是( )。(分数:2.00)A.函数模板不能含有常规形参B.函数模板的一个实例就是一个函数定义C.类模板的成员函数不能是模板函数D.用类模板定义对象时,绝对不能省略模板实参23.有如下程序段: int i=1; while(1)
4、 i+; if(i = 100) break; if(i%2 = 0) cout Tabs(Tx);解析:解析:选项 B 中类型形参 T 前需要有关键字 class 或 typename 修饰;选项 C 中函数 ads 需要返回值;选项 D 中形参表不能为空;答案为 A。18.要定义整型数组 x,使之包括初值为 1 的三个元素,下列语句正确的是(分数:2.00)A.staticintx3=1;B.intx3;x1=x2=x3=1;C.intx3=1,1,1; D.intx=1,1,1;解析:解析:选项 A 中,数组 x 的后两个元素初值默认为 0;选项 B 中,数组下标从 0 开始,x0未赋初
5、值,x3访问越界;选项 D 中,x 是整型变量,不是整型数组,赋值语法错误;只有 C 正确,定义整型数组 x,并对三个元素赋初值为 1;答案为 C。19.有如下类定义: class Base int l; public: int m; private: int n; ; class Derived: public Base;则类 Derived 所拥有的数据成员的个数是(分数:2.00)A.0B.1C.2D.3 解析:解析:C+中派生类拥有基类的所有成员,所以 Derived 类中数据成员分别是:l、m、n,答案为D。20.软件按功能可以分为:应用软件、系统软件和支撑软件(或工具软件)。下面属
6、于应用软件的是( )。(分数:2.00)A.编译程序B.操作系统C.教务管理系统 D.汇编程序解析:解析:编译软件、操作系统、汇编程序都属于系统软件,只有 C)教务管理系统才是应用软件。21.有如下函数定义:void func(int a, int b+; 若执行代码段:int x = 0, y = 1;func(x, y);则变量 x 和 y 的值分别是( )。(分数:2.00)A.0 和 1B.1 和 1C.0 和 2 D.1 和 2解析:解析:函数参数的 3 种传递方式:将变量名作为形参和实参,即传值方式;传递变量指针;引用形参。本题中实参 x 为传值方式,所以 x 的值不会改变;y 为
7、引用形参,所以会改变。故本题答案为C。22.下列有关模板的叙述中,正确的是( )。(分数:2.00)A.函数模板不能含有常规形参B.函数模板的一个实例就是一个函数定义 C.类模板的成员函数不能是模板函数D.用类模板定义对象时,绝对不能省略模板实参解析:解析:本题考查函数模板和类模板的基础知识,所以本题答案为 B。23.有如下程序段: int i=1; while(1) i+; if(i = 100) break; if(i%2 = 0) cout *; 执行这个程序段输出字符 * 的个数是(分数:2.00)A.100B.48C.49 D.50解析:解析:本题中 while 循环中当 i 为偶数
8、时输出*,而 i 为 100 时跳出循环,所以输出 49 个*,答案为 C。24.已知 TV 是一个类,并有函数 func 定义如下: void func() TV li,*net2,company3; 则在调用func() 后,TV 类的析构函数被调用的次数是(分数:2.00)A.2 次B.3 次C.4 次 D.6 次解析:解析:本题考查默认析构函数,题中定义了对象、包含三个元素的一维对象数组,所以析构函数执行 4 次,而对象指针数组并没有实际占用空间,所以不执行析构函数。25.下面对对象概念描述正确的是(分数:2.00)A.对象间的通信靠消息传递 B.对象是名字和方法的封装体C.任何对象必
9、须有继承性D.对象的多态性是指一个对象有多个操作解析:解析:对象之间进行通信的构造叫做消息,A 正确。多态性是指同一个操作可以是不同对象的行为,D 错误。对象不一定必须有继承性,C 错误。封装性是指从外面看只能看到对象的外部特征,而不知道也无须知道数据的具体结构以及实现操作,B 错误。26.下列关于重载运算符的说法正确的是:(分数:2.00)A.运算符:不能被重载,运算符.必须作为类成员重载B.运算符不能被重载,运算符=必须作为类成员重载C.运算符*不能被重载,运算符()必须作为类成员重载D.运算符.不能被重载,运算符必须作为类成员重载 解析:解析:本题考查运算符重载,不能重载的运算符只有 5
10、 个:.、.*、:、sizeof、?:。C+规定有的运算符(如赋值运算符、下标运算符、函数调用运算符)必须定义为类的成员函数,只有 D 选项正确。27.下列关于模板的表述中,错误的是(分数:2.00)A.类模板的成员函数都是模板函数B.函数模板是一种参数化类型的函数C.满足一定条件时可以省略模板实参D.模板形参只能由关键字 typename 声明 解析:解析:模板形参由关键字 typename 或者 class 声明,所以 D 选项错误。28.已知有数组定义 char a34;下列表达式中正确的是(分数:2.00)A.a0=“AAA“B.strcpy(a1,“BBBBB“)C.a21=“CC“
11、D.a11=a11 解析:解析:程序定义一个 3 行 4 列的二维字符数组。由于是二维数组,所以 a0代表一维数组,数组是不能直接赋值的,A 错误;由于是二维数组,a1代表数组 a 的第二行行地址,可以使用 strcpy 函数赋值,但是 a1只有 4 个字节大小的空间,而字符串“BBBBB“占 6 个字节,拷贝越界,B 错误;同 B 情况一样,a21只有 1 个字节空间,“CC“占 3 个字节,无法完成赋值,C 错误;D 选项是对 a11完成自我赋值,正确;答案为 D。29.有如下类声明: class Fin public: Fin(); / Fin *pf; / Fin f; / Fin /
12、 ; 在标有数字的四个成员声明中,将产生编译错误的是(分数:2.00)A.B.C. D.解析:解析:只有当类定义体完成之后才能定义类,题目中四个声明语句位置,Fin 类未定义完整,属于不完全类型,此时数据成员只能是指向该类类型的指针或引用,而不能是该类的对象;语句 3 会产生编译错误;答案为 C。30.有如下程序段: int i=100; while ( int i=10 ) cout*; i-; 运行时输出“*“的个数是(分数:2.00)A.0B.100C.10D.无穷 解析:解析:首先,程序定义了局部变量 i 并初始化为 100,在 while 循环中定义了同名局部变量 i 并初始化为 1
13、0,由变量的作用域可知 while 循环中的 i 屏蔽了 while 语句前的局部变量 i,所以 while 循环体中的 i 初值为 10;其次,由于 while 循环的循环条件为 inti=10,每次循环都是重新定义并初始化 i,条件始终为真,所以 while 循环将会无限执行下去,输出无穷个“*“。答案为 D。31.除了显式定义的构造函数外,类中还有可能包含编译器自动生成的构造函数,因此一个类所拥有的构造函数的至少有(分数:2.00)A.1 个 B.2 个C.3 个D.4 个解析:解析:一个类,如果没有显示定义的构造函数,那么编译器自动生成一个构造函数;一个类,如果显示定义了构造函数,无论
14、个数多少,编译器也不会再生成任何构造函数,所以一个类所拥有的构造函数至少有 1 个,答案为 A。32.在软件开发中,需求分析阶段产生的主要文档是( )。(分数:2.00)A.可行性分析报告B.软件需求规格说明书 C.概要设计说明书D.集成测试计划解析:解析:A)错误,可行性分析阶段产生可行性分析报告。C)错误,概要设计说明书是总体设计阶段产生的文档。D)错误,集成测试计划是在概要设计阶段编写的文档。B)正确,需求规格说明书是后续工作如设计、编码等需要的重要参考文档。33.有如下程序: #include using namespace std; int main() void function(
15、double val); double val; function(val); coutA.编译出错,无法运行B.输出:3C.输出:3.0D.输出一个不确定的数 解析:解析:本题考查函数调用及传值方式传递参数,执行函数 function 时,并没有将 3 的值传回来,而 val 又没有初始化,所以会输出一个不确定的值,D 选项正确。34.在 C+中,cin 是一个( )。(分数:2.00)A.类B.对象 C.模板D.函数解析:解析:本题考查流对象 cin,属于基础知识,cin 是输入流对象,负责从键盘获取数据,然后送到内存。本题答案为 B。35.已知函数 FA 调用函数 FB,若要把这两个函数
16、定义在同一个文件中,则( )。(分数:2.00)A.FA 必须定义在 FB 之前B.FB 必须定义在 FA 之前C.若 FA 定义在 FB 之后,则 FA 的原型必须出现在 FB 的定义之前D.若 FB 定义在 FA 之后,则 FB 的原型必须出现在 FA 的定义之前 解析:解析:如果使用用户自己定义的函数,而该函数与调用它的函数(即主调用函数)在同一程序单元中,且位置在主调用函数之后,则必须在调用此函数之前对被调用的函数作声明。36.有如下类定义: class Vechicle /基类 public: Vechicle(string s):name(s) protected: string
17、name; ; _ /Vechicle 的派生类 public: Bicycle(string name):Vechicle(name) ;横线处缺失部分为(分数:2.00)A.classVechicle:publicBicycleB.classBicycle:classVechicleC.classBicycle:publicVechicle D.classBicycle:publicclassVechicle解析:解析:本题考查如何定义派生类以及派生类对基类成员的访问,声明派生类的一般形式为:class派生类名:继承方式基类名题目中只有公用继承才能使用基类中 name 成员,所以 C 选项
18、正确。37.下列枚举类型的定义中,包含枚举值 3 的是(分数:2.00)A.enumtestLEFT,UP,RIGHT,DOWN; B.enumtestLEFT,UP=5,RIGHT,DOWN;C.enumtestLEFT=-1,UP,RIGHT,DOWN;D.enumtestLEFT,UP,RIGHT=6,DOWN;解析:解析:枚举常量的定义 enum 枚举类型名常量 1,常量 2,常量 3,.;A 选项包含的枚举值为 0、1、2、3,B 选项包含的枚举值为 4、5、6、7,C 选项包含的枚举值为-1、0、1、2,D 选项包含的枚举值为 4、5、6、7,所以 A 选项正确。38.已知 Bag
19、 是一个类,并有函数 FBag 定义如下: Void FBag() Bag *ptr, my, colleage2, 则在调用函数 FBag()后,Bag 类的析构函数被调用的次数是(分数:2.00)A.2 次B.3 次 C.4 次D.5 次解析:解析:本题考查默认析构函数,题中定义了一个对象、包含 2 个元素的一维对象数组,所以析构函数执行 3 次,而对象指针数组并没有实际占用空间,所以不执行析构函数。39.下列符号中能够作为 C+标识符的是(分数:2.00)A.Class B.gpa4.0C.1481quanzhanD.-score解析:解析:用来表示变量、符号常量、函数、数组类型等实体名
20、字的有效字符序列称为标识符,标识符由字母、数字、和下划线 3 种字符组成,且第一个字符必须为字母或者下划线,只有 A 选项正确。40.在定义一个类模板时,模板形参表是用一对括号括起来的,所采用的括号是(分数:2.00)A.圆括号B.中括号C.尖括号 D.花括号解析:解析:定义类模板时,模板形参表同样使用尖括号括起来,答案为 C。二、基本操作题(总题数:1,分数:2.00)41.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj1 下的工程 proj1,此工程中含有一个源程序文件 proj1cpp。其中每个注释“ERROR*found*”之后的一行语句存在错误。请改正这些错误,使程序的输
21、出结果为:ConstructorThevalueis10Destructor 注意:只修改注释“ERROR*found*”的下一行语句,不要改动程序中的其他内容。proj1cpp#includeiostreamusingnamespacestd;classMyClasspublic:MyClass(intx):value(x)(cout“Constructor“end1;)ERROR*found*voidMyClass()cout“Destructor“end1;)voidPrint()const;private:ERROR*found*intvalue=0;ERROR*found*voidM
22、yClass:Print()cout“Thevalueis“valueend1;intmain()MyClassobject(10);objectprint();return0;(分数:2.00)_正确答案:(正确答案:(1)MyClass() (2)int value; (3)void MyClass:Print() const)解析:解析:(1)主要考查考生对析构函数定义的掌握,析构函数前不能有任何类型,因此应将 void 去掉。 (2)value 是类的私有成员,私有成员只能声明不能定义初始值。 (3)主要考查考生对成员函数的掌握,由类的定义中关于函数的声明 void Print() c
23、onst,可知在函数定义时应加上 const。三、简单应用题(总题数:1,分数:2.00)42.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj2 下 的工程 proj2。此工程中包含一个源程序文件 mainepp,其中有“房间”类 Room 及其派生出的“办公室”类 Office 的定义,还有主函数 main 的定义。请在程序中“*found*”下的横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为:办公室房间号:308 办公室长度:56 办公室宽度:48 办公室面积:2688 办公室所属部门:会计科注意:只能在横线处填写适当的代码,不要改动程序中的其他内容
24、,也不要删除或移动“*found*”。#include10streamusingnamespacestd;classRoom“房间”类 introomno;房间号doublelength;房间长度(m)doublewidth;房间宽度(m)public:Room(intthe_room_no,doublethe_length,doublethe_width):room_no(the_room_no),length(the_length),width(the_width)inttheRoomNo()constreturnroom_no;返回房间号doubletheLength()constret
25、urnlength;返回房间长度 doubletheWidth()constreturnwidth;返回房间宽度*found*doubletheArea()const_)返回房间面积(矩形面积),classOffice:publicRoom“办公室”类 char*depart;所属部门public:Office(intthe_room_no,doublethe_length,doublethe_width,constchar*thedepart)*found*:_depart:newcharstrlen(thedepart)+1;*found*strcpy(_);Office()deleted
26、epart;constchar*theDepartment()constreturndepart;返回所属部门;intmain()*found*Office_;cout“办公室房问号:“anofficetheRoomNo()end1“办公室长度:“an_officetheLength()end1-办公室宽度:“an_officetheWidth()end1“办公室面积:“an_officetheArea()end1“办公室所属部门:“an_officetheDepartment()end1;return0;(分数:2.00)_正确答案:(正确答案:(1)returnlength*width;
27、(2)Room(theroom_no,the_length,the_width) (3)depart,the_depayt (4)an_offce(308,56,48,“会计科“)解析:解析:(1)主要考查考生对成员函数的掌握,题目要求返回房间面积(矩形面积)。由此可知空格部分要填写的是一个 return 语句,返回房间面积,也就是 length*width,因此可以得 出程序returnlength*width;。 (2)主要考查考生对派生类的构造函数的掌握,派生类的构造函数要使用成员列表初始法先对基类进行初始化。 (3)考查 strcpy 函数,由前一条语句depart=newcharst
28、rlen(the_depart)+1;可知,程序给 depart 分配了长度为 the_depart 串长加 1 的空间,因此要复制字符串 the_depart 串到 depart,直接填写 strcpy(depart,the_depart)即可。 (4)主要考查考生对类的掌握,题目要求输出的结果为: 办公室房间号:308 办公室长度:56 办公室宽度:48 办公室面积:2688 办公室所属部门:会计科 由 Office 类的构造函数可知要定义的一个 Office类的对象为 an_office(308,56,48,“会计科“)。四、综合应用题(总题数:1,分数:2.00)43.请使用 VC6
29、或使用【答题】菜单打开考生文件夹 proj3 下的工程文件 proj3。本题创建一个小型字符串类,字符串长度不超过 100。程序文件包括 proj3hproj3cpp、writeToFileobj。补充完成proj3h,重载复合赋值运算符+=。要求:补充编制的内容写在“*333*”与“*666*”之间,不得修改程序的其他部分。注意:程序最后将结果输出到文件outdat 中。输出函数 writeToFih 已经编译为 obj 文件,并且在本程序中调用。proj3h#includeiostream#includeiomanipusingnamespacestd;classMiniStringpublic:friendostream strcpy(pt, sPtr); int blength = length; length += s.length; delete sPtr; sPtr = new charlength+1; strcpy(sPtr,pt); delete pt; for (int i = 0; i length; +i) sPtrblength+i = s.sPtri; return *this; )解析:解析:主要考查考生对运算符重载的掌握,因为有动态数组,所以要使用 new 语句来重新分配空间。