1、国家二级( C+)机试模拟试卷 68及答案与解析 一、选择题 1 在数据库设计中,将 E R图转换成关系数据模型的过程属于 ( )。 ( A)需求分析阶段 ( B)概念设计阶段 ( C)逻辑设计阶段 ( D)物理设计阶段 2 有如下程序: #include using namespace std; int main() void function(double val); double val; function(val); cout using namespace std; class Book public: Book(char* t=“ “) strcpy(title,t); priva
2、te: char title 40 ; ; class Novel : public Book public: Novel(char* t=“ “): Book(t) char* Category()const return “文学 “; ; int main() Book *pb; pb=new Novel(); coutCategory(); delete pb; return 0; 若程序运行时输出结果是 “文学 “,则横线处缺失的语句是 ( )。 ( A) char*Category(); ( B) char*Category()const; ( C) virtualchar*Cate
3、gory()const; ( D) virtualchar*Category()const=0; 4 有三个关系 R、 S和 T如下: 则由关系 R和 S得到关系 T的操作是 ( )。 ( A)自然连接 ( B)差 ( C)交 ( D)并 5 有如下程序: #include using namespace std; class Sample public: Sample() Sample() cout ( D) 7 下列叙述 中,错误的是 ( A) false是一个逻辑型常量 ( B) 0是一个字符型常量 ( C) 1481是一个 int常量 ( D) 1.732是一个 double常量 8
4、下列有关类继承的表述中,错误的是 ( A)继承可以实现软件复用 ( B)派生类构造函数要负责调用基类的构造函数 ( C)虚基类可以解决由多继承产生的二义性问题 ( D)派生类没有继承基类的私有成员 9 有如下 4个语句: cout #include using namespace std; class TV public: TV(int s=41):size(s) coutPrint(); delete room3; return 0; 运行时的输出结果是 ( A) NC54 ( B) NCN54D ( C) NNN54DDD ( D) NCN54DDD 25 软件需求规格说明书的作用不包括
5、( A)软件验收的依据 ( B)用户与开发人员对软件要做什么的共同理解 ( C)软件设计的依据 ( D)软件可行性研究的依据 26 若 MyClass为一个类,执行语句 “MyClassa4,*p5;“时会自动调用该类构造函数的次数是 ( A) 2 ( B) 4 ( C) 5 ( D) 9 27 下列有关 C+流的表述中,错误的是 ( A) C+流操作 符 setw设置的输出宽度永久有效 ( B) C+流操作符 endl可以实现输出的回车换行 ( C)利用 C+流处理文件 I/O时,要包含头文件 fstream ( D)利用 C+流进行输入操作时, eof()函数用于检测是否到达文件尾 28
6、在一个有参函数的原型声明中可有可无的语法成分是 ( A)形参类型 ( B)形参变量 ( C)函数名 ( D)函数返回类型 29 有如下类定义: class Pass static int count; public: Pass() void show()const; friend int getCount(); static int incre(); ; 在所声明的 4个函数中,具有 this指针的有 ( A) Pass和 show ( B) Pass和 show ( C) show和 incre ( D) getCount和 incre 30 下列关于运算符重载的叙述中,正确的是 ( A)可
7、以通过重载创造出新的运算符 ( B)可以为重载运算符函数的参数设置默认 值 ( C)可以将部分运算符函数重载为非成员函数 ( D)可以将任意运算符函数重载为静态成员函数 31 有如下类声明: class Why int n; public: double d; protected: long l; float f; private: char c; ; 类 Why的保护数据成员和私有数据成员的数量分别是 ( A) 1和 1 ( B) 1和 2 ( C) 2和 1 ( D) 2和 2 32 设数据集合为 D=1,3,5,7,9, D上的关系为 R,下列数据结构 B=( D, R)中为非线性结构的
8、是 ( A) R=(5,1),(7,9),(1,7),(9,3) ( B) R=(9,7),(1,3),(7,1),(3,5) ( C) R=(1,9),(9,7),(7,5),(5,3) ( D) R=(1,3),(3,5),(5,9) 33 有如下类定义: class MyClass public: private: int data; ; 若要为 MyClass类重载流输入运算符 “,使得程序中可以 “cinobj;“的形式改变MyClass类的对象 obj中数据成员 data的值,则横线处的声明语句应为 ( )。 ( A) friendistream ( B) friendistrea
9、m ( C) istream ( D) istream 34 下列关于 C+流的描述中,错误的是 ( )。 ( A) coutA表达式可输出字符 A ( B) eof()函数可以检测是否到达文件尾 ( C)对磁盘文件进行流操作时,必须包含头文件 fstream ( D)以 ios_base:out模式打开的文件不存在时,将自动建立一个新文件 35 运算符重载时不需要保持的性质是 ( )。 ( A)操作数个数 ( B)操作数类型 ( C)优先级 ( D)结合性 36 有如下类声明: class Base protected: int amount; public: Base(int n=0):
10、amount(n) int getAmount()const return amount; ; class Derived: public Base protected: int value; public: Derived(int m, int n):value(m), Base(n) int getData()const return value+amount; ; 已知 x是一个 Derived对象,则下列表达式中正确的是 ( )。 ( A) x.value+x.getAmount() ( B) x.getData()-x.getAmount() ( C) x.getData()-x.a
11、mount ( D) x.value+x.amount 37 有如下程序段: int i=2;int j=3; int main() int i=9, j=i; cout #include using namespace std; class MyBag public: MyBag(string br=“ABC“):brand(br) cout usingnamespacestd; classMyClass public: MyClass(): count(0)cout clasSvehicle private: intMaxSpeed; intWeight; public: *found*
12、vehicle(intmaxspeed, int weight): _ 一 vehicle(); intgetMaxSpeed()returnMaxSpeed; intgetWeight()returnWeight; , *found* classbicycle: _publicvehicle private: intHeight; public: bicycle(intmaxspeed, intweight, intheight): vehicle(maxspeed, weight), Height(height) intgetHeight()returnHeight; ; , *found
13、* classmotorcar: _publicvehicle private: intSeatNum; public: motorcar(intmaxspeed, intweight, intseatnum): vehicle(maxspeed, weight), SeatNum(seatnum) intgetSeatNum()returnSeatNum; ; ; *found* classmotorcycle: _ public: motorcycle(intmaxspeed, int weight, intheight): vehicle(maxspeed, weight), bicyc
14、le(maxspeed, weight, height), motorcar(maxspeed, weight, 1) ; voidmain() motorcyclea(80, 150, 100); cout usingnamespacestd; constintMAXELEMENTS=100; 集合最多可拥有的元素个数 classIntegerSet intelemMAXELEMENTS; 用于存放集合元素的数组 intcounter; 用于记录集合中元素个数的计数器 public: IntegerSet(): counter(0) 创建一个空集合 IntegerSet(intdata, i
15、ntsize); 利用数组提供的数据创建一个整数集合 voidadd(intelement); 添加一个元 素到集合中 voidremove(intelement); 删除集合中指定的元素 intgetCount()constreturncounter; 返回集合中元素的个数 intgetElement(inti)constreturn elemi; 返回集合中指定的元素 voidshow()const; , voidWriteToFile(char*); #endif main cpp #include“IntegerSet h“ #include IntegerSet: IntegerSe
16、t(intdata, intsize): counter(0) for(inti=0; i0; j-) if(element=elemj-1)break; 如果找到的是等于 element的元素,说明要添加的元素已经存在,直接返回if(j0) if(element=elemj-1)return; 如果找到的是小于 element的元素, j就是要添加的位置 该元素及其后面的元素依次后移,腾出插入位置 for(intk=counter; kj; k-) elemk=elemk-1; elemj: element; 将 element插入到该位置 counter+;计数器加 1 voidInteg
17、erSet: remove(intelement) *333* *666* voidIntegerSet: show()const for(inti=0; i,所以答案为 C选项。 7 【正确答案】 B 【试题解析】 本题主要考查了常量的类型,其中 B选项中 “0“中由于是双引号,所以是字符串,单引号表示字符常量,所以 B选项错误。 8 【正确答案】 D 【试题解析】 软件方面的可重用性是通过继承来实现的, A选项正确。派生类的构造函数负责调用基类的构造函数, B 选项正确。虚基类解决了由多继承产生的二义性问题,所以 C选项正确。派生类可以继承 基类的私有成员,但是不能直接访问,所以 D选项错
18、误。 9 【正确答案】 C 【试题解析】 本题考查输入输出格式的控制,只有 和 可以输出符合题目要求的格式,所以 C选项正确。 10 【正确答案】 C 【试题解析】 本题考查常指针, C选项中不能直接将整型变量赋值给常指针,所以 C选项错误。 11 【正确答案】 B 【试题解析】 定义一个 ClassA类型的对象 c1,生成新对象 c1,调用默认构造函数;定义一个 ClassA类型的指针 c2,指针未赋初值,没有新对象生成,没有调用构造函数;定义一 个 ClassA类型的指针 c3,使用动态分配方式为 c3 分配内存,生成新的对象,将 c3 初始化为新对象的地址,调用默认构造函数;定义一个Cl
19、assA类型的引用 c4,引用 c1 对象,没有新对象生成,未调用构造函数;答案为B。 12 【正确答案】 B 【试题解析】 顺序表和链表的优缺点比较如下表:由表中可以看出链式存储插入与删除运算效率高,故 B 选项正确。 13 【正确答案】 D 【试题解析】 既可以在函数声明中指定默认参数,也可以在函数定义中指定默认参数,但是,在一个源文件中,只能为形参指定默认参数一 次,通常应在函数声明中指定默认参数。 A、 B、 C正确,选项 D错误;答案为 D。 14 【正确答案】 B 【试题解析】 在类 How 定义中没有定义任何构造函数,所以编译器会自动生成一个默认构造函数,同时还生成复制构造函数,
20、所以类 How拥有两个构造函数,答案为 B。 15 【正确答案】 A 【试题解析】 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。有穷性是指算法程序的运行时间是有限的。 16 【正确答案】 A 【试题解析】 C+中函数可以不返回任何值,不返回任何值指 定返回类型为 void类型;函数形参表可以为空,但不能省略;函数调用过程中,可能会由于 return语句或者异常终止执行,不一定会执行完最后一条语句; B、 C、 D错误;函数不允许嵌套定义,答案为 A。 17 【正确答案】 A 【试题解析】 C+中,常数据成员必须在构造函数的初始化列表中完成初始化,答案为 A。 18 【正确
21、答案】 D 【试题解析】 程序定义含有五个整型元素的数组 arr,并初始化为: 1,2,3,4,5,数组名 arr为数组首地址。选项 A中输出第一个元素与 4之和,即 1+4,结果为5;选 项 B、 C都是输出第五个元素 5;选项 D中输出第二个元素与 5之和,即2+5,结果为 7, D错误;答案为 D。 19 【正确答案】 A 【试题解析】 C+中,以 class 关键字定义的类默认的访问级别为 private,另外对于公有继承,基类成员保持自己的访问级别( private成员除外),即基类的public成员为派生类的 public成员,基类的 protected 成员为派生类的 prote
22、cted成员;本题中, Derived 类以 public方式继承 Base,所以 Derived 中 public成员有: n, protected 成员有: p, private成员有: k,不可见的成员有: m;这些成员中,对 Derived 类对象可见的只有 public成员 n,答案为 A。 20 【正确答案】 A 【试题解析】 对象有如下一些基本特点:标识唯一性、分类性、多态性、封装性、模块独立性好。所以选择 A)。 21 【正确答案】 A 【试题解析】 类的成员的缺省访问权限是私有的,数据成员可以是私有,可以是公用的,也可以是受保护的。类的成员函数可以在类内定义。 22 【正确答
23、案】 A 【试题解析】 cin 是 C+预定义 的标准输入流对象, cout是 C+预定义的标准输出流对象。 23 【正确答案】 A 【试题解析】 本题考查字符串的定义, A选项中,定义了一个字符,而用字符串赋值,所以错误, C选项定义了字符数组,但是赋值的字符串实际上有 6个字符,所以赋值错误, D选项定义了一个字符串指针数组,赋值错误。 24 【正确答案】 D 【试题解析】 本题考查构造函数相关知识,本题中定义一个对象 room1,输出N,定义 room2时输出 C,定义 room3时输出 N,然后执行 room3.Print时,输出54,最后执行三个 析构函数输出 DDD,所以答案为 D
24、。 25 【正确答案】 D 【试题解析】 软件需求规格说明书是需求分析阶段的最后成果,是软件开发的重要文档之一。软件需求规格说明书有以下几个方面的作用。 便于用户、开发人员进行理解和交流, B正确; 反映出用户问题的结构,可以作为软件开发工作的基础和依据, C正确; 作为确认测试和验收的依据, A正确。 26 【正确答案】 B 【试题解析】 本题考查默认构造函数,题中定义了包含 4个元素的一维对象数组,而指针数组不占用空间,所以不调用构造函数,那么构造函数就执行 4次,答案为 B。 27 【正确答案】 A 【试题解析】 C+操作符 endl可以实现输出的回车换行的功能;在处理文件 I/O时,要
25、包含头文件 iostream,是为了说明引用的参数或函数的位置;函数 eof()用来检测是否到达文件尾,如果到达件尾返回非 0值,否则返回 0。 28 【正确答案】 B 【试题解析】 函数原型,包含返回值,函数名,参数类型,而形参变量可有可无,所以答案为 B选项。 29 【正确答案】 A 【试题解析】 C+的类定义中,只有非静态成员函数具有 this 指针, Pass类中getCount()函数是友元函数,不属于成员函数,没有 this 指针,选项 B、 D错误;incre()函数是静态成员函数,没有 this指针,选项 C错误;答案为 A。 30 【正确答案】 C 【试题解析】 C+中不能通
26、过连接其他合法符号来创建任何新的操作符, A选项错误;除了函数调用操作符 operator()之外,重载操作符时使用默认实参是非法的, B选项错误;并不是所有操作符都可以重载为静态成员函数,比如赋值操作符 “=“只能重载为类的非静态成员函数,因为静态成员函数是面向整个类的,不属于某个类对象, 所以静态成员函数只能操作类的静态数据成员,而 “=“只能基于对象进行操作;另外操作符 “不能重载为类的成员函数,因为如果将这两种操作符重载为类的成员函数,左操作数将只能是该类类型的对象,这样的用法与正常 I/O 使用方式相反,为了支持正常用法,左操作数必须为标准库 I/O 内置类型,这又意味着如果该操作符
27、重载为类的成员,那它必须是标准库内置类型的类成员,而标准库内置的类是不能人为添加成员的, D选项错误;答案为 C。 31 【正确答案】 D 【试题解析】 C+中,使用 class 关键字定义的类,默 认的成员访问级别是私有的,所以类 Why中,保护成员有: l、 f;私有成员有: n、 c。答案为 D。 32 【正确答案】 D 【试题解析】 一个非空的数据结构如果满足以下两个条件:有且只有一个根结点;每一个结点最多有一个前件,也最多有一个后件,则称为线性结构,在数据结构中习惯称为线性表。 A选项中, 5为根结点,线性表为 51793。 B 选项中, 9为根结点,线性表为 97135。 C选项中
28、, 1为根结点,线性表为 19753。 D选项,结点 1与 7都是根结点,属于非线性结构,故 D选项正确。 33 【正确答案】 A 【试题解析】 本题考查重载流运算符 “,根据重载规则,本题答案为 A。 34 【正确答案】 A 【试题解析】 本题考查 C+流,想要输出字符 “A“,则应该是 coutInc(); 【试题解析】 (1)考查考生对 const的掌握,在 Inc函数的函数体cout”,而不能使用 “ ”。 三、简单应用题 42 【正确答案】 (1)MaxSpeed(maxspeed), Weigllt(weigllt); (2)virtual (3)virtual (4)public
29、bicycle, publicmotorcar 【试题解析】 (1)主要考查考生对构造函数的掌握,构造函数使用初始化列表来对私有成员 MaxSpeed和 Weight初始化。 (2)主要考查考生对派生类的掌握,题目要求将 vehicle作为虚基类,避免二义性问题。因此在这里添加 virtual 使 vehicle成为虚基类。 (3)主要考查考生对派生类的掌握,题目要求以 motorcar和 bicycle 作为基类,再派生出 motorcycle类。在主函数中可以看到 motorcycle类的实例 a调用 getHeight函数和 getSeatNum函数,由此可知这两个基类都是公有继承,因此
30、得出语句:publicbicycle, publicmotorcaro。 四、综合应用题 43 【正确答案】 for(inti=0; icounter; i+) 遍历整个集合 (数组 elem) if(element=elemi) 如果 element等于 elemi for(intj=i; jcounter-1; j+)从 i开始遍历集合 elem elemj=elemj+1; 把 elemj+1赋值给 elemj counter-; elem长度自减 1 return; f返回 【试题解析】 主要考查考生对有序数组的掌握,题目要求成员函数 remove从集合 中删除指定的元素 (如果集合中存在该元素 )。遍历数组 elem中的元素,找出与形参 element相等的元素,并将其删除,每删除一个元素,即将该元素之后的每个元素前移一位,如果不存在与形参 element相等的元素则没有操作。使用下标 i遍历数组, if语句判断是否与 element相等。