1、国家二级( C+)机试模拟试卷 78及答案与解析 一、选择题 1 在面向对象方法中,不属于 “对象 “基本特点的是 ( )。 ( A)一致性 ( B)分类性 ( C)多态性 ( D)标识唯一性 2 下列运算符中,不能被重载的是 ( )。 ( A) class Base public: void output() coutoutput(); ptr-Print(); delete ptr; return 0; 执行这个程序的输出结果是 ( )。 ( A) 1B ( B) 1D ( C) 2B ( D) 2D 4 有三个关系 R、 S和 T如下: 则由关系 R和S得到关系 T的操作是 ( )。 (
2、 A)自然连接 ( B)交 ( C)投影 ( D)并 5 有如下类定义和变量定义: class A public: A() data = 0; A() int GetData() const return data; void SetData(int n) data = n; private: int data; ; const A a; A b; 下列函数调用中错误的是 ( A) a.GetData(); ( B) a.SetData(10); ( C) b.GetData(); ( D) b.SetData(10); 6 下列关于模板形参的叙述中,错误的是 ( A)模板形参表必须在关键字
3、template之后 ( B)模板形参表必须用括弧 ()括起来 ( C)可以用 class修饰模板形参 ( D)可以用 typename修饰模板形参 7 下列选项中,正确的 C+标识符是 ( A) student-3 ( B) _3student ( C) 3student ( D) student3 8 下列关于类的析构函数的叙述中,错误的是 ( A)定义析构函数时不能指定返回值 ( B)析构函数的函数名就是类名前加上字符 ( C)析构函数可以重载 ( D)在一个类中如果没有定义析构函数,系统将自动生成一个析构函数 9 要利用 C+流进行文件操作,必须在程序中包含的头文件是 ( A) ios
4、tream ( B) fstream ( C) strstream ( D) cstdlib 10 有如下程序段: int i=1;int j=4; int main() int j=i, i=8; coutclassA; ( B) templateclassA; ( C) templateclassA; ( D) templateclassA; 18 设变量 x和 y为整型变量,若有函数调用为 “fun( ( B) voidfun(int ( C) voidfun(int*a,int ( D) voidfun(int*a,int*b) 19 有如下类声明: class Pam int k;
5、public: Pam(int n):k(n) void show()const; ; 若要在类体外给出成员函数 show的定义,下列定义中正确的是 ( A) voidshow()constcout using namespace std; class TV public: TV(int s=41):size(s) void Print() cout using namespace std; class XA int a; public: static int b; XA(int aa):a(aa) b+; XA() int get() return a; ; int XA:b=0; int
6、main() XA d1(2),d2(3); cout #include using namespace std; class Person public: Person(string n):name(n) cout #include using namespace std; class TV public: TV(int s=41):size(s) cout0; i-=3) n+; 之后,变量 n的值是 ( A) 20 ( B) 21 ( C) 60 ( D) 61 40 下列函数模板声明中,合法的是 ( A) templateTabs(Tx); ( B) templateclassTabs
7、(Tx); ( C) templateTabs(Tx); ( D) templatePrint(); deletepm; return0; 四、综合应用题 43 请使用 VC6或使用【答题】菜单打开考生目录 proj3下的工程文件 pmj3,该工程中包含一个源程序文件 proj3 cpp,其中定义了用于表示平面坐标系中的点的类NyPoint和表示圆形的类 NyCircle;程序应当显示: (1, 2), 5, 31 4159, 78 5398 但程序中有缺失部分,请按照以下提示,把缺失部分补充完整: (1)在 “ *1*found*”的下方是构造函数的定义,它用参数提供的圆心和半径分别对 ce
8、n和 rad进行初始化。 (2)在 “ *2*found*”的下方是非成员函数 perimeter的定义,它返回圆的周长。 (3)在 “ *3*found*”的下方是友元函数 area的定义,它返回圆的面积。 注 意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动 “*found*”。 proj3 cpp #include #include usingnamespacestd; classMyPoint表示平面坐标系中的点的类 doublex; doubley; public: MyPoint(doublex, doubley) this-x=x; this-y=y; d
9、oublegetX()constreturnx; doublegetY()constreturny; voidshow()const coutoutput后,会执行基类的 output函数,输出 1,由于 Print是虚函数,所以 ptr-Print()会执行 派生类的 Print,即输出 D,所以本题答案为 B。 4 【正确答案】 A 【试题解析】 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以根据 T 中元组可以判断 R和 S做的是自然连接操作。 5 【正确答案】 B 【试题解析】 本题考查常对象,如果一个对象被定义为常
10、对象,那么它不能调用该对象的非 const型的成员函数,所以 B选项错误, a为常对象,调用了 SetData这个非 const型的成员函数。 6 【正确答案】 B 【 试题解析】 本题考查模板的定义,使用的括号为 ,所以 B 选项错误。 7 【正确答案】 B 【试题解析】 用来表示变量、符号常量、函数、数组类型等实体名字的有效字符序列称为标识符,标识符由字母、数字、和下划线 3种字符组成,且第一个字符必须为字母或者下划线,只有 B 选项正确。 8 【正确答案】 C 【试题解析】 本题考查类的析构函数的定义,析构函数 (destructor)与构造函数相反,当对象脱离其作用域时(例如对象所在的
11、函数已调用完毕),系统自动执行析构函数。析构函数往往用来做 “清理善后 “的 工作(例如在建立对象时用 new 开辟了一片内存空间,应在退出前在析构函数中用 delete释放)。以 C+语言为例,析构函数名也应与类名相同,只是在函数名前面加一个波浪符 ,例如stud(),以区别于构造函数。它不能带任何参数,也没有返回值(包括 void 类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数,它也不进行任何操作。所以 C选项错误。 9 【正确答案】 B 【试题解析】 iostream通用 I/O 流类和其他 I/O 流的基类; fstream类用来对
12、 文件流进行操作, fstream类的头文件是 fstream.h: stxstream类同时可以支持 C风格的串流的输入输出操作 iomanip 是 I/O 流控制头文件,就像 c中的格式化输出一样。 10 【正确答案】 B 【试题解析】 程序首先在 main 函数之前定义两个 int型全局变量 i、 j,并赋予初始值 i=1, j=4;在 main 函数中又定义了两个 int型局部变量 i、 j,并使用全局变量 i初始化局部变量 j,使用数值 8初始化局部变量 i,所以局部变量 j=1,局部变量 i=8;由于在命名空间中,局部变量会覆盖同名的全局变 量,所以输出的 i、 j都是局部变量,输
13、出结果为 81,答案为 B。 11 【正确答案】 D 【试题解析】 派生类对基类成员的访问权限由基类成员的访问标识和类派生列表中的访问标识共同决定的,类 D公有继承类 B,所以类 B中成员函数 fun1对类 D不可见;成员函数 fun2为类 D的 protected 成员;成员函数 fun3 为类 D的 public成员;综上所述 fun1, fun2, fun4对类 D对象 obj均不可见, fun3对 obj可见,答案为 D。 12 【正确答案】 B 【试题解析】 二叉树遍历可以分为 3种:前序 遍历(访问根结点在访问左子树和访问右子树之前)、中序遍历(访问根结点在访问左子树和访问右子树两
14、者之间)、后序遍历(访问根结点在访问左子树和访问右子树之后)。本题中前序序列为 ABCD,中序序列为 DCBA,可知 D为根结点, ABC为左侧结点, C为 D左子结点, A为 B子结点,故后序序列为 DCBA,故 B选项正确。 13 【正确答案】 B 【试题解析】 函数定义时,形参列表若不为空,需要给出函数的形参;调用函数时,参数列表若不为空,必须给出函数的实参;选项 A、 C、 D正确,选项 B 错误;答案为 B。 14 【正确 答案】 C 【试题解析】 私有继承中,基类的所有成员(除了 private成员)在派生类中为private成员;另外 C+中, class 关键字定义的类,默认的
15、访问级别为 private;题目中 Derived以 private方式继承 Base,所以 Derived中 private成员有: n、 p、k,没有 public和 protected 成员,成员函数 f可以访问 Derived 的 private成员、public成员和 protected 成员,答案为 C。 15 【正确答案】 D 【试题解析】 软件具有以下特点: 软件是一种逻辑实体,具有抽象性;软件没有明显的制作过程;软件在使用期间不存在磨损、老化问题;对硬件和环境具有依赖性;软件复杂性高,成本昂贵;软件开发涉及诸多的社会因素,如知识产权等。故选项 D正确。 16 【正确答案】 C
16、 【试题解析】 流运算符 “不能重载为类的成员函数,因为一旦该操作符重载为类的成员函数,那么左操作数将只能是该类类型的对象,这样的用法与正常 I/O使用方式相反。为了支持正常用法,左操作数必须为 ostream类型。但是,标准库中的类是不能人为添加成员的,答案为 C。 17 【正 确答案】 D 【试题解析】 在类模板声明中,每个模板类型形参前面都必须用关键字 class 和typename来修饰;选项 D错误,答案为 D。 18 【正确答案】 D 【试题解析】 fun(输出 /N41。而定义 constTVroom2(54)时,给 size赋值为 54,最后输出结果为 /S54,所以答案为 A
17、。 25 【正确答案】 C 【试题解析】 数据库系统的特点为高共享、低冗余、独立性高、具有完整性等,C错误。 26 【正确答案】 C 【试题解析】 本题考查类的静态数据成员,题目中定义了类的静态数据成员 b,当执行定义两个对象时执行构造函数,构造函数执行 b+,所以 b 最终为 2,而d1.get()为 2, d2.get()为 3,最终结果为 7, C选项正确。 27 【正确答案】 B 【试题解析】 本题考查文件流操作时使用需要包含的头文件,属于基础知识, B选项正确。 28 【正确答案】 D 【试题解析】 A选项中, a+b是表达式,不可以作为左值;选项 B中,运算符“+“作为一元运算符,
18、应该放在操作数之前, 返回操作数本身;作为二元运算符,必须作用于两个操作数之间;选项 C中,运算符 “+“是一元运算符,只能有一个操作数;答案为 D。 29 【正确答案】 B 【试题解析】 C+中,派生类构造函数都是先调用基类构造函数,再根据声明次序定义数据成员,所以 Derived构造函数的初始化列表中,最后初始化 q;另外对于多继承,派生类的构造函数初始化列表中,基类构造函数是按照基类在派生类的派生列表中出现的次序调用的;由于 Derived类的派生列表中, Base2在前,所以应该先调用 Base2的构造函数;这样 Derived 类中初始化顺序为:基类 Base2、基类 Base1、数
19、据成员 q;所以数据成员 m、 n、 q 的初始化顺序为: n、 m、 q,答案为 B。 30 【正确答案】 D 【试题解析】 A选项中, int是定义整型数据的关键字; B 选项中, static是定义静态数据类型的关键字; C选项中 enum是定义枚举类型的关键字;答案为 D。 31 【正确答案】 A 【试题解析】 在创建类的对象之前,必须完整的定义该类,在一个类的声明之后,定义之前,这个类是一个不完全类型,对于不完全类型,只能用于定义指向该类型的指针及引用, 或者用于声明(不是定义)使用该类型作为形参类型或返回类型的函数;选项 A中,类 A中的 BB还未定义(也未声明),无法创建 BB类
20、对象,错误;选项 B中,声明之后定义的是指针或引用,正确;选项 C中,声明 BB之后定义 BB类的指针,定义 AA之后创建 AA类的对象,正确;选项 D中,声明 AA之后定义 AA类的引用,定义 BB 之后创建 BB类的对象,正确;答案为 A。 32 【正确答案】 D 【试题解析】 除了堆排序算法的比较次数是 O(nlog2n),其他的都是 n(n 1)/2。 33 【正确答案】 B 【试题解析】 类 的成员访问权限有 3种: public(公用 )、 protected(保护 )、private(私有 )。 34 【正确答案】 C 【试题解析】 树是简单的非线性结构,所以二叉树作为树的一种也
21、是一种非线性结构。 35 【正确答案】 A 【试题解析】 一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换,一般只将规模很小而使用频繁的函数声明为内联函数,可以避免函数调用时间开销,从而提高运行速度。 36 【正确答案】 D 【试题解析】 本题考查派生类的构造函数,派生类的构造函数初始化时按照参数列表初始化顺序,所以先初始化 Person(n),输出 P,然后依次输出 D和 S,答案为 D选项。 37 【正确答案】 D 【试题解析】 本题考查以为数组和指针,一维数组名可以作为一个指针,指向数组的第一个元素,题目
22、中要求输出 3,那么就是指向了数组的第三个元素, *arr表示数组的第一个元素 1,所以输出不出来 3,所以选择 D选项。 38 【正确答案】 A 【试题解析】 本题考查构造函数相关知识,本题中定义一个对象 room1,输出C,定义 room2时输出 CC,然后执行 room3.Print时,输出 54,最后执行三个析构函数输出 DDD,所以答案为 A。 39 【正确答案】 A 【试题解析】 本题考查 for循环语句, i每次减 1,所以 for循环执行 20次。选项 A正确。 40 【正确答案】 A 【试题解析】 选项 B中类型形参 T 前需要有关键字 class 或 typename修饰;
23、选项 C中函数 ads需要返回值;选项 D中形参表不能为空;答案为 A。 二、基本操作题 41 【正确答案】 (1): base(the_base), bonus(the_bonus), tax(the_tax) (2)Salary()deletestaff_id; (3)cout“实发工资: “pay getNetPay()end1; 【试题解析】 (1)主要考查考生对构造函数的掌握情况,构造函数的成员初始列表要把形参放在括号内。 (2)主要考查考生对析构函数的掌握情况,析构函数使用 delete释放指针, delete后要跟标识符 “”。 (3)主要考查考生对成员函数调用的掌握情况,调用类
24、的成员函数使用标识符“ ”,而不是作用 域符 “: ”。 三、简单应用题 42 【正确答案】 (1)charstrlen(sir)+1; (2)Mammal(str) (3)retumoutputMOUSE; (4)Elephant 【试题解析】 (1)主要考查分配空间,程序要给 name分配空间,由下一条语句中strcpy(name, str)可知程序要把字符串 str复制给 name,因此要分配的空间大小为 strlen(str)+1。 (2)主要考查考生对构造函数的掌握,因为 Elephant类是 Mammal 类的派生类,所以其构造函数 要使用成员列表先对 Mammal 类初始化。 (
25、3)主要考查考生对枚举类型的掌握,先看程序: enumcategoryEMPTY,ELEPHANT, MOUSE。再参考 Elephant类中的 WhoAmI函数:char*WhoAmI()returnoutputELEPHANT; 。可知这里要填写的返回语句为:retumoutputMOUSE;。 (4)主要考查考生对派生类的掌握,题目要求输出: ELEPHANANT MOUSE 可知,要先调用 Elephant类的 WhoAmI 函数,因此给指针 pm分配 Elephant类空间。 四、综合应用题 43 【正确答案】 (1)rad(r) (2)2*c.radius() (3)MyCircle a 【试题解析】 (1)主要考查考生对构造函数的掌握 ,使用成员列表初始化给 rad 赋初始值。 (2)主要考查考生对成员函数的掌握 ,函数功能为返回圆 c的周长。要返回圆的周长 ,应利用公式 PI*2*c.radius()完成。 (3)主要考查考生对成员函数的掌握 ,因为函数功能为返回圆 a的面积 ,所以函数的形参应该为 MyCircle a。