1、国家二级( C+)机试模拟试卷 121及答案与解析 一、选择题 1 下列关于 return 语句的叙述中,正确的是 ( A)任何函数的函数体中至少有一个 return 语句 ( B)任何函数的函数体中最后一条语句必须是 return 语句 ( C)如果函数的返回类型为 void,则其函数体中可以没有 return 语句 ( D)如果函数的返回类型为 int,则其函数体中可以没有 return 语句 2 下列关于运算符重载的叙述中正确的是 ( A)跟普通函数一样,可以为重载的运算符函数的参数设置默认值 ( B)通过重载,可以改变一个运算符原有的优先级和操作数个数 ( C)只能重载 C+ 中已经有
2、的运算符,不能定义新运算符 ( D) C+ 中已有的运算符都可以重载 3 下列关于内联函数的叙述中,正确的是 ( A)内联函数就是在一个函数体内定义的函数 ( B)内联函数必须通过关键字 inline 来定义 ( C)在类体中定义的函数,都是内联函数 ( D)内联函数不需要 return 语句 4 下列叙述中正确的是 ( )。 ( A)所谓算法就是计算方法 ( B)程序可以作为算法的一种描述方法 ( C)算法设计只需考虑得到计算结果 ( D)算法设计可以忽略算法的运算时间 5 下列各序列中不是堆的是 ( )。 ( A) (9l, 85, 53, 36, 47, 30, 24, 12) ( B)
3、 (9l, 85, 53, 47, 36, 30, 24, 12) ( C) (47, 9l, 53, 85, 30, 12, 24, 36) ( D) (91, 85, 53, 47, 30, 12, 24, 36) 6 深度为 5的完全二叉树的结点数不可能是 ( )。 ( A) 15 ( B) 16 ( C) 17 ( D) 18 7 设二叉树如下: 则前序序列 为 ( )。 ( A) ABDEGCFH ( B) DBGEAFHC ( C) DGEBHFCA ( D) ABCDEFGH 8 下面描述不属于软件特点的是 ( )。 ( A)软件是一种逻辑实体,具有抽象性 ( B)软件在使用中不
4、存在磨损、老化问题 ( C)软件复杂性高 ( D)软件使用不涉及知识产权 9 下面对类一对象主要特征描述正确的是 ( )。 ( A)对象唯一性 ( B)对象无关性 ( C)类的单一性 ( D)类的依赖性 10 在数据库中,数据模型包括数据结构、数据操作和 ( )。 ( A)数据约束 ( B)数据类型 ( C)关系运算 ( D)查询 11 一个运动队有多个队员,一个队员仅属于一个运动队,一个队一般都有一个教练,则实体运动队和队员的联系是 ( )。 ( A)一对多 ( B)一对一 ( C)多对一 ( D)多对多 12 设循环队列为 Q(1: m),其初始状态为 front=rear=m。经过一系列
5、入队与退队运算后, front=30, rear=10。现要在该循环队列中作顺序查找,最坏情况下需要比较的次数为 ( )。 ( A) 19 ( B) 20 ( C) m一 19 ( D) m一 20 13 有两个关系 R和 T如下: 则由关系 R得到关系T的操作是 ( )。 ( A)投影 ( B)交 ( C)选择 ( D)并 14 下列字符串中不能作为 C+标识符使用的是 ( )。 ( A) DOUBLE ( B) ab-c ( C) _5_ ( D) xyz 15 下列语句中错误的是 ( )。 ( A) const int*p=0; ( B) const int y=0; ( C) int
6、x=0; ( D) const int p=new int(100); 16 有如下程序: #include using namespace std; int main() int sum=O; for(im i=0; i0; i-=3)n+; n的值是 ( )。 ( A) 23 ( B) 24 ( C) 25 ( D) 71 23 下列关于函数的叙述中,正确的是 ( )。 ( A) C+不允许函数嵌套定义 ( B) C+中所有函数都有返回值 ( C)函数的形参列表一定不能为空 ( D)调用函数时一定会执行完函数体 的最后一条语句 24 下列关于运算符重载的叙述中,正确的是 ( )。 ( A)
7、不能改变重载运算符的优先级 ( B)运算符只能重载为类的成员函数 ( C) C+中已有的任何运算符都可以重载 ( D)可以为重载运算符函数的参数设置默认值 25 下列运算符中,可以重载为类的友元函数的运算符是 ( )。 ( A) = ( B) () ( D) 1)retum(2*n1)*xP(x, n一 1)一 (n一 1)*P(x, n一 2) n; 若执行函数调用表达式 P(1 3, 2),函数 P被调用的次数是 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 29 有如下类定义: class MyClass public: MyClass(double d=0 0):
8、val(d) _ 类型转换运算符 double的定义 private: double val; ; 若要使语句序列 MyClass x(2 1); cout using namespace std; elass Shape图形类 public: 图形绘制函数 (用显示字母模拟 ) virtual void draw()eonsteoutdraw(); t draw(); plot(t); delete ps; retum 0; 运行这个程序的输出是 ( )。 ( A) SCC ( B) SCS ( C) CSS ( D) CCC 37 有如下类及函数的定义: class Wow int k;
9、public: Wow(int n=0): k(n) int incre()retum+k; int deere(); void show()eonst; ; int Wow: deere()retum-k; inline void display(Wow w)w show(); void Wow: show()eonsteout using namespaee std; class CC int k; public: CC(int n): k(n) int get()constreturn k; ; int main() CC c3=CC(1), cc(2); retum 0; 此程序编译时
10、未能通过,原因是 ( )。 ( A)数组只能定义为基本数据类型 ( B)类 CC缺少复制构造函数 ( C)对象数组只能作为类的数据成员 ( D)类 CC缺少默认的构造函数 40 有如下类声明和函数声明 class Base int m; public: int n; protected: int P; ; class Derived: public Base public: int k; ; void f(Derived d); 则在函数 f中通过 d可访问的数据成员包括 ( )。 ( A) n ( B) n和 k ( C) n、 k和 P ( D) n、 k、 P和 m 41 下列关于模板的
11、表述中,错误的是 ( )。 ( A)模板形参表的两边使用尖括号括起来 ( B)模板以关键字 template开始 ( C)模板声明中的关键字 class都可以用关键字 typename替代 ( D)模板的形参表中可以有多个参数 42 要利用 C+流实现输入输出的各种格式控制,必须在程序中包含的头文件是( )。 ( A) fstream ( B) istream ( C) cstdlib ( D) iomanip 43 在下列标识符中,不属于文件流类的标识符是 ( )。 ( A) ifstream ( B) ofstream ( C) fstream ( D) operator 二、基本操作题
12、44 请使用 VC6或使用 答题 菜单打开考生文件夹 projl下的工程 projl,其中有枚举DOGCOLOR、狗类 Dog和主函数 main的定义。程序中位于每个 “ERROR*found*”下的语句行有错误,请加以改正。改正后程序的输出结果应该是: There is a white dog named Hoho There is a black dog named Haha There is a motley dog named Hihi 注意:只修改每个 ERROR*found*下的那一行,不要改动程序中的其他内容。 #include using namespace std; 狗的颜色
13、:黑、白、黄、褐、花、其他 enum DOGCOLORBLACK, WHITE, YELLOW, BROWN, PIEBALD,OTHER; class Dog狗类 DOGCOLOR color; char naIne20; static int count; public: Dog(char nanle, DOGCOLOR color) strcpy(this-nanle, nanle); ERROR*found* strcpy(this一 color, color); DOGCOLOR getColor()constretum color; ERROR *found* const char
14、 * getName()constreturn * name; const char * getColorString()const switch(color) case BLACK: return“black”: case WHITE: return”white“: case YELLOW: return“yellow”; case BROWN: retum“brown”; case PIEBALD: return”piebald“; return“motley“; void show()const cout using namespace std; 矩阵基础类,一个抽象类 class Ma
15、trixBase int rows, cols; public: MatrixBase(int rows, int cols): rows(rows), cols(cols) int getRows()constreturn rows; 矩阵行数 int getCols()constreturn cols; 矩阵列数 virtual double getElement(int r, int C)const=0;取第 i个元素的值 void show()const分行显示矩阵中所有元素 for(int i=0; ishow(); delete m; coutshow(); delete m; r
16、eturn 0; 四、综合应用题 46 请使用 VC6或使用 答题 菜单打开考生文件夹 proj3下的工程 proj3,其中声明的 CDeepCopy是一个用于表示矩阵的类。请编写这个类的赋值运算符成员函数operator=,以实现深层复制。 要求: 补充编制的内容写在 “ *333*”与 “*666*”之间。不得修改程序的其他部分。 注意:程序最后将结果输出到文 件 out dat中。输出函数 writeToFfle已经编译为 obj文件,并且在本程序中调用。 CDeepCopy h #include #include using namespace std; class CDeepCopy
17、 public: int n;动态数组的元素个数 int *p;动态数组首地址 CDeepCopy(int); CDeepCopy(); CDeepCopy&operator=(const CDeepCopy&r);赋值运算符函数 ; void writeToFile(char: *); main cpp #include”CDeepCopy h” CDeepCopy: CDeepCopy()deletep; CDeepCopy: CDeepCopy(int k)n=k; p=new intn; 构造函数实现 CDeepCopy&CDeepCopy: operator=(const CDeep
18、Copy&r)赋值运算符函数实现 *333* *666* int main() CDeepCopy a(2), d(3); a p0=1; d p0=666;对象 a, d数组元素的赋值 CDeepCopy b(3);调用赋值运算符函数 a p0=88; b=a; cout85,不满足条件,不是堆,故正确答案为 C选项。 6 【正确答案】 A 【试题解析】 在树结构中,定义一棵树的根结点所在的层次为 1,其他结点所在的层次等于它的父结点所在的层次加 1,树的最大层次称为树的深度。完全二叉树指除最后一层外,每一层上的结点数均达到 最大值,在最后一层上只缺少右边的若干结点。深度为 5的二叉树,结点
19、个数最多为 25一 1=31,最少为 24=16,不可能是 15,故正确答案为 A选项。 7 【正确答案】 A 【试题解析】 二叉树遍历可以分为 3种:前序遍历 (访问根结点在访问左子树和访问右子树之前 )、中序遍历 (访问根结点在访问左子树和访问右子树两者之间 )、后序遍历 (访问根结点在访问左子树和访问右子树之后 )。本题中前序遍历为ABDEGCFH,中序遍历为 DBGEAFHC,后序遍历为 DGEBHFCA,故 A选项正确。 8 【正确答案】 D 【试题解析】 软件具有以下特点:软件是一种逻辑实体,具有抽象性;软件没有明显的制作过程;软件在使用期间不存在磨损、老化问题;对硬件和环境具有依
20、赖性;软件复杂性高,成本昂贵;软件开发涉及诸多的社会因素,如知识产权等。故选项 D正确。 9 【正确答案】 A 【试题解析】 对象的基本特点是:标识唯一性、分类性、多态性、封装性、模块独立性好。类是具有共同属性、共同方法的对象的集合,是关于对象的抽象描述,反映属于该对象类型的所有对象的性质。对象具有的性质,类也具有。故 A选项正确。 10 【正确答案 】 A 【试题解析】 数据模型通常由数据结构、数据操作及数据约束 3部分组成。故 A选项正确。 11 【正确答案】 A 【试题解析】 一般来说,实体集之间必须通过联系来建立联接关系,分为三类:一对一联系 (1: 1)、一对多联系 (1: m)、多
21、对多联系 (m: n)。实体运动队和队员的关系为 1: m联系,故 A选项正确。 12 【正确答案】 D 【试题解析】 循环队列是队列的一种顺序存储结构,用队尾指针 rear指向队列中的队尾元素,用排头指针 front指向排头元素的前一个位置,因此,从排头指针front指向的后一个位置直到队尾指针 rear指向的位置之间所有的元素均为队列中的元素,队列初始状态为 front=rear=m,当 front=30, rear=10时,队列中有 m一 30+10+1=m一 19个元素,比较次数为 m一 20次, D选项正确。 13 【正确答案】 A 【试题解析】 用于查询的 3个操作无法用传统的集合
22、运算表示,引入的运算为投影运算、选择运算、笛卡尔积。常用的扩充运算有交、除、连接及自然连接等。投影,从关系模式中指定若干个属性组成新的关系,题目中从 R中指定 AB组成新的关系 T,故 A选项正确。 选择,从关系中找出满足给定条件的元组的操作称为选择,即结果 T应该包含 R中全部属性,故 C选项错误。假设, R与 S经过某种关系得到 T,则并: RuS是将 S中的记录追加到 R后面;交: RnS结果是既属于 R又属于 S的记录组成的集合。上述两种操作中,关系 R与 S以及 T要求有相同的结构,故 B、 D选项错误。 14 【正确答案】 B 【试题解析】 C+的标识符由字母、数字和下划线组成,其
23、中必须以字母或下划线开头。选项 B错误,答案选 B。 15 【正确答案】 D 【试题解析】 C+中使用 new表达式动态创建对象 , new表达式返回指向新创建对象的指针, D选项将 new返回的指针赋给整型 const变量,语法错误,答案选D。 16 【正确答案】 D 【试题解析】 程序在 for循环中嵌套 while循环。 for循环的初始条件为: sum、 i初值为 0;进入 for循环之后,首先将 sum累加 i,此时 sum、 i仍为 0; while循环中,若 sum小于 100,则将 sum累加 i,继续 while循环;当 sum不满足条件时,退出循环。由于 sum、 i初值为
24、 0,所以 while循环中 sum始终为 0,始终满足循环条件 sum0不成立;由 70 3=23,可知循环最少执行 23次,之后 i取值为 1,仍然满足循环条件,所以循环总共执行 24次, n自增 24次,答案为 B。 23 【正确答案】 A 【试题解析】 C+中函数可以不返回任何值,不返回任 何值指定返回类型为 void类型;函数形参表可以为空,但不能省略;函数调用过程中,可能会由于 return语句或者异常终止执行,不一定会执行完最后一条语句; B、 C、 D错误;函数不允许嵌套定义,答案为 A。 24 【正确答案】 A 【试题解析】 操作符 “”不能重载为成员函数,选项 B错误;成员
25、访问操作符 “ ”、成员指针访问操作符 “: c”、域操作符 “: ”、 sizeof和条件操作符 “?: ”是不能重载的,选项 C错误;除了函数调用操作符 “()”外,重载操作符时使用默认参数是非法的,选项 D错误;重 载操作符不能改变操作符的优先级别,选项 A正确;答案为 A。 25 【正确答案】 D 【试题解析】 C+规定,赋值操作符 “=”、下标操作符 “”、调用操作符 “()”和成员访问箭头操作符 “一 ”必须重载为成员函数,这些操作符定义为非成员函数将在编译时标记为错误,友元函数是非成员函数,上面四种操作符不能重载为类的友元函数,另外成员访问操作符 “ ”不能重载,答案为 D。 2
26、6 【正确答案】 A 【试题解析】 函数 fun的实参分别是: x水 y的结果、 3、 max函数的返回值,实参个数为 3。答案 为 A。 27 【正确答案】 D 【试题解析】 内联函数的函数定义必须出现在内联函数第一次被调用之前;内联函数可以避免函数频繁调用时的开销,提高程序运行效率;在类定义体内部定义的成员函数,编译器都将其视为内联函数; A、 B、 C正确;内联函数也可以有参数, D错误,答案为 D。 28 【正确答案】 C 【试题解析】 首先执行调用 P(1 3, 2);由于 n=2,大于 1,所以需要递归调用P(1 3, 1)和 P(1 3, 0),此时 n的值或者是 0,或者是 1
27、,函数 P返回。所以函数 P被调用 3次,答案为 C。 29 【正确答案】 A 【试题解析】 题目需要定义类型转换运算符 double,类型转换运算符是一种特殊的类成员函数,它定义将类类型的值转变为其他类型值,由于转换函数必须是成员函数,选项 B、 D错误;另外转换函数不能指定返回类型,并且形参列表必须为空,选项 C错误;所以 double类型转换运算符的定义为: operator double()constreturn val; 答案为 A。 30 【正确答案】 A 【试题解析】 常对象是指对象的数据成员的值在对象被调用时不能被改变,常对象必须进行 初始化,且不能被更新,不能通过常对象调用普
28、通成员函数,常对象只能调用常成员函数,选项 B、 D错误;常对象是可以包含普通成员的,选项 C错误;答案为 A。 31 【正确答案】 B 【试题解析】 C+中,关键字 public、 protected、 private用来声明类的访问权限,另外 friend关键字可以用来声明友元,同样可以控制类的访问权限; const用来修饰常量性,与类的访问权限无关,答案为 B。 32 【正确答案】 B 【试题解析】 定义一个 ClassA类型的对象 c1,生成新对象 c1,调用默 认构造函数;定义一个 ClassA类型的指针 c2,指针未赋初值,没有新对象生成,没有调用构造函数;定义一个 ClassA类
29、型的指针 c3,使用动态分配方式为 c3分配内存,生成新的对象,将 c3初始化为新对象的地址,调用默认构造函数;定义一个ClassA类型的引用 c4,引用 c1对象,没有新对象生成,未调用构造函数;答案为B。 33 【正确答案】 A 【试题解析】 在函数形参表后面添加 “: 0”可以指定该函数为纯虚函数,类中含有一个或多个纯虚函数,该类就是抽象类,选项 B错误;可以通过对象指针或引用调用虚函数,也 可以使用对象直接调用虚函数,只不过使用对象直接调用虚函数和调用普通成员函数一样,没有动态绑定,不具有多态性,选项 C错误;抽象类中的成员函数至少有一个纯虚函数,对虚函数没有要求,选项 D错误;一个函
30、数定义为虚函数,它就是动态绑定的,在派生类中可以覆盖,而静态成员函数是属于整个类,不属于某个类对象,对于每个类来说只有一份代码,所有同类的对象共享这份代码,没有动态绑定的必要,选项 A正确;答案为 A。 34 【正确答案】 A 【试题解析】 dA公有继承 Parents, dB私有继承 Parents,所以 Parents中的公有成员 publicData在 dA中是公有成员,对 x可见,在 dB中是私有成员,对 y不可见, Parems中的私有成员 privateData对 x和 y都不可见;由此可知:只有 x可以访问 publicData,答案为 A。 35 【正确答案】 A 【试题解析】
31、 C+的类定义中,只有非静态成员函数具有 this指针, Pass类中getCount()函数是友元函数,不属于成员函数,没有 this指针,选项 B、 D错误;incre()函数是静态成员函数,没有 this指针,选项 C错误;答案为 A。 36 【正确 答案】 D 【试题解析】 C+中,多态性调用需要满足两个条件, 1、被调用成员函数必须是虚函数; 2、必须通过基类类型的引用或指针进行函数调用。多态性使程序在运行时期根据指针或引用所指对象的类型来决定调用哪个函数。 程序中,类 shape定义了虚函数 draw(),在派生类 circle中重写了函数draw(); main函数中,分别使用指
32、针、对象、引用三种方式调用函数 draw(),指针 ps是基类指针,指向的是派生类的对象,所以这里根据多态性,将调用 Circle中的 draw函数,输出 “C”;对象 t是 Circle对象,也调用 Circle中的 dmw函数,输出 “C”;函数 p10t()执行时引用 s引用的是实参 t,引用对象是派生类 Circle对象,根据多态性,同样调用 Circle中的 draw函数,输出 “C”;结果输出为“CCC”;答案为 D。 37 【正确答案】 C 【试题解析】 类定义体内部定义的函数,编译器都默认为内联函数,类定义体外部定义的函数,使用关键字 inline修饰的函数为内联函数,所以内联
33、函数有:Wow(int n=0)、 incre()、 display(Wow w),答案为 C。 38 【正 确答案】 B 【试题解析】 类 How的定义体中没有定义任何构造函数,所以编译器需要自动生成一个默认构造函数和复制构造函数,答案为 B。 39 【正确答案】 D 【试题解析】 对象数组无论在哪里定义,都需要自动调用该对象元素的类的默认构造函数进行初始化,如果该类没有默认构造函数,必须为数组的元素提供显式初始化;程序中定义了对象数组 c,它包含了三个元素,前两个元素使用构造函数cc(int n)显式初始化,最后一个元素需要使用默认构造函数初始化,由于类 CC中已经定义了构造函数,所以编译
34、器不会自动生成 默认的构造函数,缺少默认构造函数导致对象数组 c的第三个元素无法完成初始化,编译错误;答案为 D。 40 【正确答案】 B 【试题解析】 公有继承中,基类成员保持自己的访问级别 (private成员除外 ),基类的 public成员在派生类中是 public成员,基类的 protected成员在派生类中是protected成员;所以程序中 Derired类的 public成员有: n、 k, protected成员有: p, m对 Derived不可见,所以: Derived对象 d可访问的成员有: n、 k,protected成员不 可见;答案为 B。 41 【正确答案】 C
35、 【试题解析】 模板定义以关键字 template开始,后接模板形参表,模板形参表是用尖括号括住的一个或多个模板形参的列表,形参之间用逗号分隔,选项 A、B、 D正确;至于选项 C,一般关键字 class和 typename在模板形参表中,是没有区别的,但是关于类模板,类定义的关键字也是 class,这里 class是不可用tvpename替代的,答案为 C。 42 【正确答案】 D 【试题解析】 C+中 I O流控制头文件是 iomanip,它负责实现输入输出的各种 格式控制;答案为 D。 43 【正确答案】 D 【试题解析】 文件流类的标识符由:输入文件流类 ifstream、输出文件流类ofstream和输入输出文件流类 fstream; operator是重载运算符的标识符,答案为D。 二、基本操作题 44 【正确答案】 (1)this-color=color; (2)const char getName()constreturn * name; (3)Dog dogl(“Hoho“, WHITE), dog2(“Haha“, BLACK), dog3(“Hihi“,OTHER);