1、国家二级( C+)机试模拟试卷 67及答案与解析 一、选择题 1 运算符重载是对已有的运算符赋予多重含义,因此 ( )。 ( A)可以对基本类型(如 int类型)的数据,重新定义 “+“运算符的含义 ( B)可以改变一个已有运算符的优先级和操作数个数 ( C)只能重载 C+中已经有的运算符,不能定义新运算符 ( D) C+中已经有的所有运算符都可以重载 2 有如下程序: #include using namespace std; class Obj static int i; public: Obj() i+; Obj() i-; static int getVal() return i; ;
2、 int Obj:i=0; void f() Obj ob2; coutgetVal(); delete ob3; cout using namespace std; class Appliance public: Appliance() cout using namespace std; class A public: static int a; void init() a = 10; A(int a = 5) init(); a+=10; ; int A:a = 0; A obj; int main() cout using namespace std; class Sample frie
3、nd long fun(Sample s); public: Sample(long a) x = a; private: long x; ; long fun(Sample s) if (s.x T square(T x) return x * x; 其中的参数 T是 ( A)函数形参 ( B)函数实参 ( C)模板实参 ( D)模板形参 32 下列运算符中,不能重载为类的友元函数的运算符是 ( A) + ( B) ( C) new ( D) c = 0; / int f(int a) const this-a = a; / static int g() return a; / void h
4、(int b) Test:b = b; ; / private: int a; static int b; const int c; ; int Test:b = 0; 在标注号码的行中,能被正确编译的是 ( )。 ( A) ( B) ( C) ( D) 34 将 E R图转换为关系模式时,实体和联系都可以表示为 ( )。 ( A)属性 ( B)键 ( C)关系 ( D)域 35 下列有关继承和派生的叙述中,正确的是 ( )。 ( A)派生类不能访问基类的保护成员 ( B)作为虚基类的类不能被实例化 ( C)派生类应当向基类的构造函数传递参数 ( D)虚函数 必须在派生类中重新实现 36 下列
5、叙述中正确的是 ( )。 ( A)有一个以上根结点的数据结构不一定是非线性结构 ( B)只有一个根结点的数据结构不一定是线性结构 ( C)循环链表是非线性结构 ( D)双向链表是非线性结构 37 已知表达式 -a中的 “-“是作为成员函数重载的运算符,则与 -a等效的运算符函数调用形式为 ( A) a.operator-(1) ( B) operator-(a) ( C) operator-(a,1) ( D) a.operator-() 38 下列链表中,其逻 辑结构属于非线性结构的是 ( A)二叉链表 ( B)循环链表 ( C)双向链表 ( D)带链的栈 39 将运算符 *重载为类成员函数
6、时,其参数表中有且仅有一个参数,说明该运算符是 ( A)无操作数的运算符 ( B)无操作数的运算符 ( C)二元运算符 ( D)三元运算符 40 下列函数模板的定义中,合法的是 ( A) templateTabs(Tx)returnxTabs(Tx)returnxabs(Tx)returnx usingnamespacestd; 将数组元素个数 Size定义为 4 ERROR*found* constintSize; template classMyClass public: MyClass(T*P) for(inti=0; i ERROR*found* voidMyClass: Print(
7、) for(inti=0; iobj(intArray); obj Print(), cout usingnamespacestd; char*GetNum(char*src, char*buf) while(*src!= 0) if(isdigit(*src)break; Src+; if(*src= 0) *found* _;: while(*src!=! 0 isdigit(*src) *found* _; buf+; Src+; *buf= 0; returnsrc; intmain() charstri00, digits20; cin getline(str, 100); char
8、*P: str; inti=1; while(p=GetNum(p, digits)!=NULL) cout #include usingnamespacestd; classCDeepCopy public: intn;动态数组的元素个数 int*p;动态数组首地址 CDeepCopy(int); CDeepCopy(); CDeepCopy operator=(constCDeepCopy&r);赋值运算符函数 ; voidwriteToFile(char*); main cpp #include“CDeepCopy h“ CDeepCopy: CDeepCopy()delete p; C
9、DeepCopy: CDeepCopy(intk)n=k; P=newintn; 构造函数实现 CDeepCopy CDeepCopy: operator= (constCDeepCopy r) 赋值运算符函数实现 *333* *666* intmain() CDeepCopya(2), d(3); a P0=1; d P0=666; 对象 a, d数组元素的赋值 CDeepCopyb(3); a P0=88; b=a; 调用赋值运算符函数 cout“不能重载为类的成员函数,因为如果将这两种操作符重载为类的成员函数,左操作数将只能是该类类型的对象,这样的用法与正常 I/O 使用方式相反,为了支
10、持正常用法,左操作数必须为标准库 I/O 内置类型,这又意味着如果该操作符重载为类的 成员,那它必须是标准库内置类型的类成员,而标准库内置的类是不能人为添加成员的, D选项错误;答案为 C。 13 【正确答案】 D 【试题解析】 派生类对基类成员的访问权限由基类成员的访问标识和类派生列表中的访问标识共同决定的,选项 A错误;派生类私有继承基类,基类的保护成员在派生类中为 private成员,派生类对象不可见,选项 B错误;派生类包含基类中没有的成员变量和成员函数,将基类对象赋给派生类对象,在调用这些成员时报错,选项 C错误;答案为 D。 14 【正确答案】 D 【试题解析】 派生类对基 类成员
11、的访问权限由基类成员的访问标识和类派生列表中的访问标识共同决定的,选项 A错误;多重继承的派生类可以有多个直接基类,选项 B错误;派生类构造函数可以隐式调用基类的默认构造函数初始化对象的基类部分,也可以在派生类构造函数初始化列表中显示调用基类构造函数,选项 C错误;答案为 D。 15 【正确答案】 D 【试题解析】 本题考查 C+标识符的命名规则,规定如下: 所有标识符可以由字母、数字和下画线组成,且必须以字母或下画线开头; C+的关键字不能作为标识符; 大、小写字母表示不同意义,即代表不同的标识 符,如 mun 和 Mun。A选项是 C+的关键字, B 选项不能以数字开头, C选项 “-“不
12、能用于组成标识符。 16 【正确答案】 B 【试题解析】 定义一个 ClassA类型的对象 c1,生成新对象 c1,调用默认构造函数;定义一个 ClassA类型的指针 c2,指针未赋初值,没有新对象生成,没有调用构造函数;定义一个 ClassA类型的指针 c3,使用动态分配方式为 c3 分配内存,生成新的对象,将 c3 初始化为新对象的地址,调用默认构造函数;定义一个ClassA类型的引用 c4,引用 c1 对象,没有新对象生成,未调用构造函数 ;答案为B。 17 【正确答案】 C 【试题解析】 有序是特指元素按非递减排列,即从小到大排列,但允许相邻元素相等, A选项错误。有序表可以顺序存储也
13、可以链式存储, B 选项错。能使用二分法查找的线性表必须满足两个条件:用顺序存储结构;线性表是有序表, D选项错误。故 C选项正确。 18 【正确答案】 D 【试题解析】 静态数据成员独立于任何对象而存在,不是类对象的组成部分,普通成员函数可以引用静态数据成员。程序定义了类 A,并在 A的定义体外初始化A的静态数据成员 a=0,构造函数 A(int)中的形参 a与 A:a属于不同的变量,在函数 A(int)中,形参 a屏蔽了 A:a,所以 A(int)中引用的变量 a是形参,而不是A:a,对 a的任何操作都不影响 A:a,而成员函数 init中引用的是 A:a,语句a=10是将 A:a赋值为
14、10,所以输出 obj.a其实是输出 A:a,结果为 10;答案为D。 19 【正确答案】 C 【试题解析】 存在纯虚函数的类是抽象基类,选项 A错误;函数模板的形参表不能为空,不然定义函数模板也没有意义,选项 B 错误;类模板中是可以包含构造函数的,选项 D错误。答案为 C。 20 【正确答案】 A 【试题解析】 重载运算符的规则如下: C+不允许用户自己定义新的运算符,只能对已有的 C+运算符进行重载; C+不能重载的运算符只有 5个; 重载不能改变运算符运算对象的个数; 重载不能改变运算符的优先级和结合性; 重载运算符的函数不能有默认的参数; 重载的运算符必须和用户定义的自定义类型的对象
15、一起使用,至少应有一个是类对象,即不允许参数全部是 C+的标准类型。故本题答案为 A。 21 【正确答案】 C 【试题解析】 本题考查默认构造函数,当 i=0、 1时, fun(Sample(i)为 1;当 i=2时, fun(Sample(i)为 2;当 i=3时, fun(Sample(i)为 6;当 i=4 时, fun(Sample(i)为 24;当 i=5时, fun(Sample(i)为 120。所以总和为 154。 22 【正确答案】 C 【试题解析】 因为一个人可以操作多个计算机,而一台计算机又可以被多个人使用,所以两个实体之间是多对多的关系。 23 【正确答案】 A 【试题解
16、析】 本题考查虚函数,在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成 员函数成为虚函数,虚函数不得是静态成员函数,但可以是友元函数 24 【正确答案】 A 【试题解析】 栈是先进后出的数据结构,所以栈顶元素最后入栈却最先被删除。栈底元素最先入栈却最后被删除。所以选择 A)。 25 【正确答案】 D 【试题解析】 本题考查运算符重载,重载不能改变运算符运算对象的个数;不能改变运算符的优先级别;不能改变运算符的结合性;重载运算符的函数不能有默认值,否则就改变了运算符参数的个数;不能定义新的运算符,某些运算符不能重载。所以答案为 D。 26 【正确答案】 D 【试题解析】 一
17、个派生类同时继承两个或者多个基类时称为多重继承,其一般形式为: class 派生类名: 继承方式 基类名 1, 继承方式 基类名 2,所以 D选项正确。 27 【正确答案】 C 【试题解析】 自然连接是一种特殊的等值连接,它满足下面的条件: 两关系间有公共域; 通过公共域的等值进行连接,选 C。 28 【正确答案】 B 【试题解析】 本题考查类的定义和对象的定义,题目中定义类 Te中又定义了 Te类型的对象 te,这样陷入循环中,所以 是错误的,答案为 B 选项。 29 【正确答案】 A 【试题解析】 循环队列是队列的一种顺序存储结构 .线性结构是个数据元素构成的有限序列,除第一个元素外的每一
18、个元素,有且只有一个前件,除最后一个元素外,有且只有一个后件。循环队列是线性结构。当需要插入的数据大于循环队列的存储长度,入队运算会覆盖前面的数据,发生溢出现象。故 A选项正确。 30 【正确答案】 A 【试题解析】 指向对象的指针使用 delete删除时,该指针指向的对象会被撤销,编译器会自动调用析构函数来释放该对象占有的资源,答案为 A。 31 【正确答案】 D 【试题解析】 参数 T是模板形参,答案为 D。 32 【正确答案】 B 【试题解析】 C+规定,赋值操作符 “=“、下标操作符 “、调用操作符 “()“和成员访问箭头操作符 “-“必须重载为成员函数,将这些操作符定义为非成员函数将
19、在编译时标记为错误,友元函数是非成员函数,答案为 B。 33 【正确答案】 D 【试题解析】 只能通过构造函数的参数初始化列表对常数据成员进行初始化,本题中常数据成员为 c。 通过默认构造函数初始化 c,所以不正确。常成员函数只能引用本类中数据成员,而不能修改它,所以 不正确。静态 成员函数由于没有this 指针,所以不能访问本类中的非静态成员,所以 错误。 34 【正确答案】 C 【试题解析】 从 E R图到关系模式的转换是比较直接的,实体与联系都可以表示成关系, E R图中属性也可以转换成关系的属性。 35 【正确答案】 C 【试题解析】 派生类可以访问基类的保护成员,而不能访问基类的私有
20、成员。作为虚基类的类可以被实例化。虚函数如果没有派生类中重新实现,那么仍然使用基类的成员函数。 36 【正确答案】 B 【试题解析】 线性结构应满足:有且只有一个根结点与每 个结点最多有一个前件,也最多有一个后件,所以 B)正确。所以有一个以上根结点的数据结构一定是非线性结构,所以 A)错误。循环链表和双向链表都是线性结构的数据结构。 37 【正确答案】 D 【试题解析】 本题考查重载自减运算符 -,根据重载的规则,只有 D选项能够正确调用重载函数。 38 【正确答案】 A 【试题解析】 在定义的链表中,若只含有一个指针域来存放下一个元素地址,称这样的链表为单链表或线性链表。带链的栈可以用来收
21、集计算机存储空间中所有空闲的存储结点,是线性表。在单链表中的结点中增加一 个指针域指向它的直接前件,这样的链表,就称为双向链表(一个结点中含有两个指针),也是线性链表。循环链表具有单链表的特征,但又不需要增加额外的存贮空间,仅对表的链接方式稍做改变,使得对表的处理更加方便灵活,属于线性链表。二叉链表是二叉树的物理实现,是一种存储结构,不属于线性结构。答案为 A选项。 39 【正确答案】 C 【试题解析】 本题考查运算符重载,题目中将 *重载为类成员函数时,如果是一元运算符,其参数就是默认的 this,而如果是二元运算符,其参数表中有且仅有一个参数,所以该运算符是二元运算符。 40 【正确答案】
22、 A 【试题解析】 本题考查模板的定义,一般形式为: templateT 通用函数定义,所以只有 A选项正确。 二、基本操作题 41 【正确答案】 (1)eonstintSize=4; (2)voidMyClass: Print() (3)MyClassobj(intArray); 【试题解析】 (1)主要考查考生对 const变量的掌握,因为 const变量不能修改,所以在定义的同时必须初始化。 (2)主要考查考生对模板类的成员函数定义的 掌握,因为 MyClass 类是模板类,所以在定义该函数时要加上模板标识符 “”,即语句 voidMyClass:Print( )。 (3)主要考查考生对
23、模板类构造函数的调用的理解,从上一条语句intintArraySize=1, 2, 3, 4;中可以知道 intArray为 int型,因此定义 obj时要使用 ,即 MyClassobj(intAtray);。 三、简单应用题 42 【正确答案】 (1)returnNULL (2)*buf=*src (3)i+ 【 试题解析】 (1)主要考查考生对 if语句的掌握,由判断条件 if(*src= 0),说明字符串 src为空,则返回 NULL即可。 (2)主要考查考生对 while循环语句的掌握, while语句的循环条件为 *src!=0&isdigit(*src),该条件是指,若字符串 s
24、rc不为空并且 *src指向的字符为数字字符,则进行循环。题目要求把数字字符放入字符串 buf 中,因此为 *buf=*src。 (3)主要考查考生对 while循环语句的掌握,从上一行语句cout“Digitstring“i“is“digitsend1;中可以得出,题目要求输出的 i是递增的,因此这里需添加语句 i+。 四、综合应用题 43 【正确答案】 n=r n;把对象 r字符长度赋值给 n deletep;删除动态数组 p p=newintn; 给动态数组 p分配空间为 n for(inti=0; in; i+) 遍历对象 r中的数组 p pi=r pi; 把 r pi赋值给 pi return*this;返回被赋值的对象 【试题解析】 主要考查考生对运算符重载的掌握,由注释可知此 处要实现赋值运算符函数。要重载的运算符是 “=”,该类的成员是动态数组 p,数组元素个数为n,因此先释放原来的动态数组,再分配空间,然后逐个复制元素即可。