1、国家二级( C+)机试模拟试卷 69及答案与解析 一、选择题 1 下列关于栈的叙述正确的是 ( )。 ( A)栈按 “先进先出 “组织数据 ( B)栈按 “先进后出 “组织数据 ( C)只能在栈底插入数据 ( D)不能删除数据 2 关于运算符重载,下列表述中正确的是 ( )。 ( A) C+已有的任何运算符都可以重载 ( B)运算符函数的返回类型不能声明为基本数据类型 ( C)在类型转换符函数的定义中不需要声明返回类型 ( D)可以通过运算符重载来创建 C+中原来没有的运算符 3 有如下程序: #include using namespace std; class Music public:
2、void setTitle(char* str) strcpy(title, str); protected: char type 10 ; private: char title 20 ; ; class Jazz : public Music public: void set(char* str) strcpy(type, “Jazz“); / strcpy(title, str); / ; 下列叙述中正确的是 ( )。 ( A)程序编译正确 ( B)程序编译时语句 出错 ( C)程序编译时语句 出错 ( D)程序编译时语句 和 都出错 4 数据库设计中反映用户对数据要求的模式是 ( )。
3、 ( A)内模式 ( B)概念模式 ( C)外模式 ( D)设计模式 5 在 C+中,编译系统自动为一个类生成默认构造函数的条件是 ( A)该类没有定义任何有参构造函数 ( B)该类没有定义任何无参构造函数 ( C)该类没有定义任何构造函数 ( D)该类没有定义任何成员函数 6 在定义一个类模板时,模板形参表是用一对括号括起来的,所采用的括号是 ( A) () ( B) ( C) 0; i-=3) n+; n的值是 ( A) 23 ( B) 24 ( C) 25 ( D) 71 17 有如下类定义: class Base1 int m; public: Base(int m1): m(m1)
4、; class Base2 int n; public: Base(int n1): n(n1) ; class Derived: public Base2,public Base1 int q; public: Derived(int m1, int n1, int q1): q(q1),Base1(m1),Base2(n1); ; 在创建一个 Derived 对象时,数据成员 m、 n 和 q 被初始化的顺序是 ( A) m、 n、 q ( B) n、 m、 q ( C) q、 m、 n ( D) q、 n、 m 18 有如下程序段: int i=100; while ( int i=10
5、 ) cout #include using namespace std; class MyBag public: MyBag(string br,string cr):brand(br),color(cr) +count; MyBag() -count; static int GetCount() return count; private: string brand,color; static int count; ; int MyBag:count=0; int main() MyBag one(“CityLife“,“Gray“),two(“Micky“,“Red“); cout T1
6、 FUN(T2 n) return n*5.0; 若要求以 int型数据 9作为函数实参调用该模板,并返回一个 double型数据,则该调用应表示为 ( A) FUN(9) ( B) FUN ( C) FUN(9) ( D) FUN(double) 28 下列语句或语句序列中错误的是 ( A) inta;constint*point= ( B) constinta=10; ( C) constint*point=10; ( D) constint*point=newint(10); 29 有如下类和变量定义: class Parents public: int publicData; priv
7、ate: int privateData; ; class dA : public Parents /*类体略 */ ; class dB : private Parents /*类体略 */ ; dA x; dB y; 下列表达式中正确的是 ( A) x.publicData ( B) x.privateData ( C) y.privateData ( D) y.publicData 30 在下列选项中,不允许作为 C+标识符的是 ( A) 999a ( B) _ ( C) T ( D) mmm 31 当一个派生类对象结束其生命周期时,系统自动做的事情是 ( A)先调用派生类的析构函数后调
8、用基类的析构函数 ( B)先调用基类的析构函数后调用派生类的析构函数 ( C)如 果派生类没有定义析构函数,则只调用基类的析构函数 ( D)如果基类没有定义析构函数,则只调用派生类的析构函数 32 设序列长度为 n,在最坏情况下,时间复杂度为 O(log2n)的算法是 ( A)二分法查找 ( B)顺序查找 ( C)分块查找 ( D)哈希查找 33 下面是重载为非成员函数的运算符的函数原型,其中错误的是 ( )。 ( A) Fractionoperator+(Fraction,Fraction); ( B) Fractionoperator-(Fraction); ( C) Fraction (
9、 D) Fraction 34 在下列枚举符号中,用来表示 “相对于当前位置 “文件定位方式的是 ( )。 ( A) ios_base:cur ( B) ios_base:beg ( C) ios_base:out ( D) ios_base:end 35 对 C+编译器区分重载函数无任何意义的信息是 ( )。 ( A)参数类型 ( B)参数个数 ( C)返回 值类型 ( D)常成员函数关键字 const 36 有如下程序: #include using namespace std; class MyClass public: MyClass(int i=0) cout usingnamesp
10、acestd; clasSStudentInfo protected: ERROR*found* CharName; intAge; intID; intCourseNum; floatRecord; public: StudentInfo(char*name, intAge, intID, intcourseNum, floatrecord); ERROR*found* voidStudentInfo() floatAverageRecord() returnRecord CourseNum; voidshow()const coutID=ID; CourseNum=courseNum; R
11、ecord=record; intmain() StudentInfost(”Smith”, 21, 99999, 12, 970); st show(); return0; 三、简单应用题 42 请使用 VC6或使用【答题】菜单打开考生文件夹 proj2下的工程 proj2,该工程中包含一个程序文件 main cpp,其中有日期类 Date、人员类 Person及排序函数sortByName和主函数 main的 定义。请在程序中的横线处填写适当的代码并删除横线,以实现上述类定义和函数定义。此程序的正确输出结果应为: 按姓名排序 排序前 张三男出生日期: 1978年 4月 20日 王五女出生日
12、期: 1965年 8月 3日 杨六女出生日期: 1965年 9月 5日 李四男出生日期: 1973年 5月 30日 排序后: 李四男出生日期: 1973年 5月 30日 王五女出生日期: 1965年 8月 3日 杨六女出生日期: 1965年 9月 5日 张三男出生日期: 1978年 4月 20日 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动 “ *found*”。 #include usingnamespacestd; classDate日期类 intyear, month, day;年、月、日 public: Date(intyear, intmonth, i
13、ntday): year(year), month(month), day(day) intgetYear()constreturnyear; intgetMonth()constreturnmonth; intgetDay()constreturnday; ; classPerson人员类 charname14;姓名 boolismale;性别,为 true时表示男性 Datebirthdate;出生日期 public: Person(char*name, booliSmale, Datebirth_date) *found* : _ strcpy(this-name, name); con
14、stchar*getName()constreturnname; boolisMale()constreturnis male; DategetBirthdate()constreturn birthdate; 利用 strcmp()函数比较姓名,返回一个正数、 0或负数,分别表示大于、等于、小于 intcompareName(constPerson p) const *found* _ voidshow() couti) PersonP=psm; psm=psi; psi=p; intmain() Personstaff= Person(“张三 “, true, Date(1978, 4,
15、20), Person(“王五 “, false, Date(1965, 8, 3), Person(“杨六 “, false, Date(1965, 9, 5), Person(“李四 “, true, Date(1973, 5, 30) ; constintsize=sizeof(staff) Si zeof(staff0); inti; cout usingnamespacestd; #include“prj3 h“ intFriFun(FriFunClassx) *333* 由于函数 FriFun()是类 FriFunClass的友元函数。所以它可以直接访问 a和 b *666* in
16、tmain() FriFunClassn(10, 20); if(FriFun(n) cout,所以答案为 C选项 。 7 【正确答案】 D 【试题解析】 用来表示变量、符号常量、函数、数组类型等实体名字的有效字符序列称为标识符,标识符由字母、数字、和下划线 3种字符组成,且第一个字符必须为字母或者下划线。所以 D选项错误。 8 【正确答案】 B 【试题解析】 本题考查运算符重载,重载运算符不能定义新的运算符, C+规定=, , (), -这四个运算符只能被重载为类的非静态成员函数,其他的可以被友元重载,主要是因为其他的运算符重载函数都会根据参数类型或数目进行精确匹配,这四个不具有这种检查的功
17、能,用友元定 义就会出错,所以本题选择 B。 9 【正确答案】 A 【试题解析】 C+操作符 endl可以实现输出的回车换行的功能;在处理文件 I/O时,要包含头文件 iostream,是为了说明引用的参数或函数的位置;函数 eof()用来检测是否到达文件尾,如果到达件尾返回非 0值,否则返回 0。 10 【正确答案】 B 【试题解析】 本题考查实型变量, 4.2默认为 double, 4.2f为 float型的、 4L为long型的。所以 B选项正确。 11 【正确答案】 B 【试题解析】 C+中,关键字 public、 protected、 private用来声明类的访问权限,另外 fri
18、end 关键字可以用来声明友元,同样可以控制类的访问权限; const用来修饰常量性,与类的访问权限无关,答案为 B。 12 【正确答案】 A 【试题解析】 E-R模型和关系模式的对照表如下:由表中可以看出,联系转换为关系数据库的关系, A选项正确。 13 【正确答案】 C 【试题解析】 默认参数是通过给形参表中的形参提供明确的初始值来指定的,可以为一个或多个形参定义默认值,但是如果有一个形参具有默认值,那它右边的形参都必须 有默认值 (即全是默认参数 )。选项 C错误,形参 y 也必须要有默认值;答案为 C。 14 【正确答案】 A 【试题解析】 C+中,以 class 关键字定义的类默认的
19、访问级别为 private,另外对于公有继承,基类成员保持自己的访问级别( private成员除外),即基类的public成员为派生类的 public成员,基类的 protected 成员为派生类的 protected成员;本题中, Derived 类以 public方式继承 Base,所以 Derived 中 public成员有: n, protected 成员有: p, private成员有: k,不可见的成员有: m;这些成员中,对 Derived 类对象可见的只有 public成员 n,答案为 A。 15 【正确答案】 B 【试题解析】 A)错误,可行性分析阶段产生可行性分析报告。 C
20、)错误,概要设计说明书是总体设计阶段产生的文档。 D)错误,集成测试计划是在概要设计阶段编写的文档。 B)正确,需求规格说明书是后续工作如设计、编码等需要的重要参考文档。 16 【正确答案】 B 【试题解析】 for循环中, i初值为 70,每次循环 i自减 3, n自增 1,循环终止条件为 i0不成立; 由 70/3=23,可知循环最少执行 23次,之后 i取值为 1,仍然满足循环条件,所以循环总共执行 24次, n自增 24次,答案为 B。 17 【正确答案】 B 【试题解析】 C+中,派生类构造函数都是先调用基类构造函数,再根据声明次序定义数据成员,所以 Derived构造函数的初始化列
21、表中,最后初始化 q;另外对于多继承,派生类的构造函数初始化列表中,基类构造函数是按照基类在派生类的派生列表中出现的次序调用的;由于 Derived类的派生列表中, Base2在前,所以应该先调用 Base2的构造函数;这样 Derived 类中初始化顺序为:基类 Base2、基类 Base1、数据成员 q;所以数据成员 m、 n、 q 的初始化顺序为: n、 m、 q,答案为 B。 18 【正确答案】 D 【试题解析】 首先,程序定义了局部变量 i并初始化为 100,在 while循环中定义了同名局部变量 i并初始化为 10,由变量的作用域可知 while循环中的 i屏蔽了while语句前的
22、局部变量 i,所以 while循环体中的 i初值为 10;其次,由于 while循环的循环条件为 inti=10,每次循环都是重新定义并初始化 i,条件始终为真,所以 while循环将会无限执 行下去,输出无穷个 “*“。答案为 D。 19 【正确答案】 A 【试题解析】 在创建类的对象之前,必须完整的定义该类,在一个类的声明之后,定义之前,这个类是一个不完全类型,对于不完全类型,只能用于定义指向该类型的指针及引用,或者用于声明(不是定义)使用该类型作为形参类型或返回类型的函数;选项 A中,类 A中的 BB还未定义(也未声明),无法创建 BB类对象,错误;选项 B中,声明之后定义的是指针或引用
23、,正确;选项 C中,声明 BB之后定义 BB类的指针,定义 AA之后创建 AA类的对象,正确;选项 D中,声明 AA之后定义 AA类的引用,定义 BB 之后创建 BB类的对象,正确;答案为 A。 20 【正确答案】 B 【试题解析】 在需求分析阶段可以使用的工具有数据流图 DFD图,数据字典DD,判定树与判定表,所以选择 B)。 21 【正确答案】 C 【试题解析】 重载运算符的规则如下: C+不允许用户自己定义新的运算符,只能对已有的 C+运算符进行重载; C+不能重载的运算符只有 5个; 重载不能改变运算符运算对象的个数; 重载不能改变运算符的优先级和结合性; 重载运算符的函数不能有默认的
24、参数; 重载的运算符必须和用 户定义的自定义类型的对象一起使用,至少应有一个是类对象,即不允许参数全部是 C+的标准类型。故本题答案为 C。 22 【正确答案】 D 【试题解析】 本题考查类模板的概念和定义,模板参数可以作为成员函数的局部变量的类型。 23 【正确答案】 D 【试题解析】 本题考查函数参数的相关知识,函数原型中必须声明形参类型,所以 A选项错误,调用一个函数时如果修改了形参值,那么实参可能改变也可能不改变,所以 B 选项错误,函数形参的生存期一般在函数执行整个函数中存在,除了静态变量。 24 【正确答案】 C 【试题解析】 本题考查构造函数和析构函数,以及静态数据成员,定义 o
25、ne,two时,构造函数被执行了两次,所以 count为 2,后续又定义了一个指针对象,所以 count加 1变为了 3,当删除那个指针对象时,执行析构函数, count减 1,所以是 2,答案 C正确。 25 【正确答案】 A 【试题解析】 在数据流图中,对所有元素都进行了命名,所有名字的定义集中起来就构成了数据字典。因此选 A,而 B, C, D都不符合。 26 【正确答案】 C 【试题解析】 本题考查对象的定义和对象的初始化,定义 对象时,自动调用构造函数,不需要显示调用,所以 C选项正确。 27 【正确答案】 C 【试题解析】 本题中要求返回值为 double行,那么 T1就是 dou
26、ble型, T2默认为 int,所以只有 C选项正确。 28 【正确答案】 C 【试题解析】 本题考查常指针, C选项中不能直接将整型变量赋值给常指针,所以 C选项错误。 29 【正确答案】 A 【试题解析】 dA公有继承 Parents, dB私有继承 Parents,所以 Parents中的公有成员 publicData 在 dA 中是公有成员,对 x可 见,在 dB中是私有成员,对 y不可见, Parents中的私有成员 privateData 对 x和 y都不可见;由此可知:只有 x可以访问 publicData,答案为 A。 30 【正确答案】 A 【试题解析】 C+的标识符由字母、
27、数字和下划线组成,其中必须以字母或下划线开头。 A选项错误;答案为 A。 31 【正确答案】 A 【试题解析】 派生类的对象结束生命周期时,系统先调用派生类的析构函数,然后按继承层次依次向上调用各个基类的析构函数,这是为了每次调用析构函数,都有完整的类对象与析构函数对应,当然 如果某个类没有定义析构函数,编译器会自动合成对应的析构函数并调用之,答案为 A。 32 【正确答案】 A 【试题解析】 对长度为 n 的线性表排序,最坏情况下时间复杂度,二分法查找为O( log2n);顺序查找法为 O( n);分块查找时间复杂度与分块规则有关;哈希查找时间复杂度为 O(1),因其通过计算 HashCod
28、e来定位元素位置,所以只需一次即可。故正确答案为 A选项。 33 【正确答案】 C 【试题解析】 本题考查四种运算符作为非成员函数的重载的使用方法,根据重载规则,本题答案为 C, C项正确原型 为: Fractionoperator=( Fraction&)。 34 【正确答案】 A 【试题解析】 streamoff定义于 iostream.h 中,定义有偏移量 offset所能取得的最大值, seek_dir表示移动的基准位置,是一个有以下值的枚举: ios:beg:(文件开头)、 ios:cur:(文件当前位置)、 ios:end:(文件结尾)。 35 【正确答案】 C 【试题解析】 所谓
29、函数重载是指同一个函数名可以对应多个函数的实现。每种实现对应一个函数体,这些函数的名字相同,其参数 类型或个数不同,但不能出现函数返回值类型不同而参数类型和个数完全相同的重载。所以本题答案为 C。 36 【正确答案】 A 【试题解析】 本题考查构造函数和复制构造函数以及重载运算符。本题中先后定义了两个对象 obj1, obj2,依次输出 11,然后定义了对象 obj3,调用复制构造函数,输出 2,最后执行三次析构函数,输出 444。 37 【正确答案】 A 【试题解析】 C+作为面向对象的语言,具有三种特点封装性、继承性、多态性。所以答案为 A。 38 【正确答案】 C 【试题解析】 本题 考
30、查默认析构函数,题中定义了对象、包含三个元素的一维对象数组,所以析构函数执行 4次,而对象指针数组并没有实际占用空间,所以不执行析构函数。 39 【正确答案】 B 【试题解析】 用来表示变量、符号常量、函数、数组类型等实体名字的有效字符序列称为标识符,标识符由字母、数字、和下划线 3种字符组成,且第一个字符必须为字母或者下划线,只有 B 选项正确。 40 【正确答案】 D 【试题解析】 派生类保护继承基类,那么基类的公用成员和保护成员在派生类中成为保护成员,私有成员不可访问,所以 D选项正确。 二、基本操作题 41 【正确答案】 (1)char*Name; (2)StudentInfo() (
31、3)Studentlnfo: StudentInfo(char*nalne, intage, intID, intcourseNum, floatrecord) 【试题解析】 (1)主要考查考生对动态数组的掌握,由题目可知 Name应该指向一个动态数组,而不是一个有效 char型字符,因此要定义成 char型指针。 (2)主要考查考生对析构函数的掌握,析构函数不需要函数返回类型,应把 void去掉。 (3)主要考查考生对构造函数定义的掌握,构造函数也要使用作用域符号 “: ”。 三、简单应用题 42 【正确答案】 (1)is_male(is_male), birth_date(birth_da
32、te) (2)returnstrcmp(nallle, p getName(); (3)name, name);可知,要使用成员列表初始化的成员为 is_male和 birth_date。 (2)主要考查考生对 strcmp()函数的掌握,先看程序对该函数的功能要求:利用strcmp()函数比较姓名,返回一个正数、 0或负数,分别表示大于、等于、小于。因为 strcmp()函数的功能是比较字符串大小,因此可以直接被 return语句调用:returnstrcmp(name, p getName();。 (3)主要考查考生对成员函数的掌握,程序的注释为:显示出生月,由此可以知道这里要输出出生月份
33、,直接调用函数 getMonth()即可。 四、综合应用题 43 【正确答案】 intmin=x ax b?x a: x b; 此处为取出 x a与 x b中的最小值 for(inti=2; i=min; i+) 从 i到 min遍历数组 if(x a i=0& x b i=0) 如 i能同时整除 x a来的 x b,则仅回 i returni; return一 1; 【试题解析】 主要考查考生对友元函数的掌握情况,友元函数可以访问类的私有数据成员,题目要求函数求出两个数据成员的大于 1的最小公因子,从 2开始往上算,因此要同时可以被两个私有成员整除,这里用取余符号完成,取余为 0即为整除。