1、国家二级 C+机试(选择题)模拟试卷 39及答案与解析 一、选择题 1 面向对象方法中,实现对象的数据和操作结合于统一体中的是 ( A)结合 ( B)封装 ( C)隐藏 ( D)抽象 2 在进行逻辑设计时,将 E-R图中实体之间联系转换为关系数据库的 ( A)关系 ( B)元组 ( C)属性 ( D)属性的值域 3 线性表的链式存储结构与顺序存储结构相比,链式存储结构的优点有 ( A)节省存储空间 ( B)插入与删除运算效率高 ( C)便于查找 ( D)排序时减少元素的比较次数 4 深度为 7的 完全二叉树中共有 125个结点,则该完全二叉树中的叶子结点数为 ( A) 62 ( B) 63 (
2、 C) 64 ( D) 65 5 下列叙述中正确的是 ( A)所谓有序表是指在顺序存储空间内连续存放的元素序列 ( B)有序表只能顺序存储在连续的存储空间内 ( C)有序表可以用链接存储方式存储在不连续的存储空间内 ( D)任何存储方式的有序表均能采用二分法进行查找 6 设二叉树如下: 则后续序列为 ( A) ABDEGCFH ( B) DBGEAFHC ( C) DGEBHFCA ( D) ABCDEFGH 7 计算 机软件包括 ( A)算法和数据 ( B)程序和数据 ( C)程序和文档 ( D)程序、数据及相关文档 8 下面描述中不属于软件需求分析阶段任务的是 ( A)撰写软件需求规格说明
3、书 ( B)软件的总体结构设计 ( C)软件的需求分析 ( D)软件的需求评审 9 当数据库中数据总体逻辑结构发生变化,而应用程序不受影响,称为数据的 ( A)逻辑独立性 ( B)物理独立性 ( C)应用独立性 ( D)空间独立性 10 有三个关系 R、 S和 T如下:则由关系 R和 S得到关系T的操作是 ( A)并 ( B)投 影 ( C)交 ( D)选择 11 在下列选项中,不允许作为 C+标识符的是 ( A) 999a ( B) _ ( C) T ( D) mmm 12 下列关于运算符重载的叙述中,正确的是 ( A)可以通过重载创造出新的运算符 ( B)可以为重载运算符函数的参数设置默认
4、值 ( C)可以将部分运算符函数重载为非成员函数 ( D)可以将任意运算符函数重载为静态成员函数 13 设 c1和 c2是类 MyClass的对象,若将前缀运算符 “-“和运算符 “/“作为类MyClass的友元函数重载,则表达式 -c1/c2等价 于 ( A) operator/(c1.operator-(),c2) ( B) operator/(operator-(c1),c2) ( C) c1.operator-().operator/(c2) ( D) c2.operator/(operator-(c1) 14 下列关于 C+函数的叙述中,正确的是 ( A)函数不能自己调用自己 ( B
5、)每个函数都必须返回一个值 ( C)每个函数至少要有一个参数 ( D)函数在被调用之前必须先进行声明或定义 15 有如下程序: #include using namesapce std; int return r; int main() int a=1,3,5,7; cout using namespace std; void fun(char c) cout using namespace std; void fun(int i) cout using namespace std; class Base public: Base() cout using namespace std; cla
6、ss AA public: AA() cout using namespace std; class AA public: virtual void disp() cout T fun(T x)return x*x; ( B) template T fun(T x, int n) return x+n; ( C) template T fun(T *p) return *p; ( D) template T fun()return T; 33 在定义一个类模板时,模板形参表是用一对括号括起来的,所采用的括号是 ( A)圆括号 ( B)中括号 ( C)尖括号 ( D)花括号 34 下列关于 C+
7、流的表述中,正确的是 ( A)与每个输入或输出设备的信息交换都可以通过流类来实现 ( B)从流中获取数据的操作称为插入操作 ( C) cin 是一个预定义的输入流类 ( D)输出流有一个名为 open的成员函数,其作用是生成一个新的流对象 35 下列函数模板声明中,合法的是 ( A) template T abs(T x); ( B) template class T abs(T x); ( C) template T abs(T x); ( D) template “不能重载为类的成员函数,因为如果将这两种操作符重载为类的成员函数,左操作数将只能是该类类型的对象,这样的用法与正常 I/O使用
8、方式相反,为了支持正常用法,左操作数必须为标准库 I/O内置类型,这又意味着如果该操作符重载为类的成员,那它必须是标准库内置类型的类成员,而标准库内置的类是不能人为添加成员的, D选项错误;答案为 C。 13 【正确答案】 B 【试题解析】 友元函数不是类的成员函数,所以友元函数的调用不需要使用类对象;另外运算符重载不改变运算符的优先级,所以先执行 “-“运算符重 载函数,之后执行 “/“运算符重载函数,选项 A、 C、 D错误, B正确,答案为 B。 14 【正确答案】 D 【试题解析】 函数可以自己调用自己,称为递归调用;函数返回类型为 void时,没有返回值;函数的参数列表中可以没有参数
9、;函数在被调用前必须先进行函数声明或定义。 A、 B、 C错误, D正确;答案为 D。 15 【正确答案】 D 【试题解析】 函数 f()的功能:根据形参整型数组 a和下标 index,返回数组 a中元素 aindex的引用, main函数定义数组 a并初始化,调用 f()函数并输出函数的返回值 。所以输出结果为 a2, a2 = 5,答案为 D。 16 【正确答案】 A 【试题解析】 程序中有三个重载 fun函数,形参类型分别为: char类型, double类型和 char*类型, main函数中,调用 fun函数,实参为 0,编译器需要确定重载函数中的最佳匹配,由于 0可以隐式转换为 c
10、har类型、 double类型、 char*类型,均不能精确匹配,所以该函数调用具有二义性,编译出错;答案为 A。 17 【正确答案】 B 【试题解析】 程序中有三个重载 fun函数,形参类型分别为: int类型, double类型和 char*类型, main函数中,调用 fun函数,实参为 0,编译器需要确定重载函数中的最佳匹配,虽然 0可以隐式转换为 double类型、 char*类型,但是 fun(0)可以和原型形参为 int类型的函数精确匹配,所以将会调用原型为 fun(int)的函数,输出 int i / ;答案为 B。 18 【正确答案】 C 【试题解析】 C+中,关键字 pub
11、lic、 protected、 private用来声明类的访问权限,答案为 C。 19 【正确答案】 C 【试题解析】 类定义中包括数据成员 和函数成员的声明,选项 A正确;类成员的默认访问权限是私有的,选项 B正确;成员函数可以在类定义体内定义,也可以在类定义体外定义,选项 D正确;类的数据成员可以声明为 public、 protected和 private,选项 C错误,答案为 C。 20 【正确答案】 C 【试题解析】 静态数据成员必须在类定义体的外部定义,和任意的类成员一样,在类定义体外部引用类的静态数据成员时,需要指定成员的所属类,并且 static关键字只能用于类定义体内部的声明中
12、,在外部定义时不能标示 static。因此,答案为 C。 21 【正确答案】 A 【试题解析】 指向对象的指针使用 delete删除时,该指针指向的对象会被撤销,编译器会自动调用析构函数来释放该对象占有的资源,答案为 A。 22 【正确答案】 D 【试题解析】 在公有继承的情况下,基类中的私有成员对派生类不可见,公有成员和保护成员都保持自己的访问级别,派生类都可以访问,答案为 D。 23 【正确答案】 A 【试题解析】 C+中,派生类构造函数的初始化列表只能初始化派生类的成员,不能直接初始化继承成员。所以派生类构造函数需要将基类构造函数包含在初始化列表中来间接初始化继承成员,选项 B错误; A
13、A中的成员 a是 private成员,对 BB不可见,选项 C,D错误;答案为 A。 24 【正确答案】 C 【试题解析】 继承的访问标识有: public、 protected、 private,答案为 C。 25 【正确答案】 A 【试题解析】 构造函数初始化列表为类的成员提供初始值,它并不指定初始化的执行次序,成员初始化根据成员在类定义中的声明次序执行;派生类构造函数初始化列表首先初始化基类,然后根据声明次序初始化派生类的成员,所以 Derived对象在创建 时,首先初始化 Base对象,然后初始化自己成员 q,在初始化 Base时,成员初始化次序为 m、 n;综上所述,结果为 m、 n
14、、 q;答案为 A。 26 【正确答案】 D 【试题解析】 函数 calc()声明的形参表后面有关键字 const,说明该函数是常成员函数,常成员函数改变了隐含的 this形参的类型,使得 this是指向 const对象的指针,因而该函数只能读取数据成员的值,不能修改数据成员,所以 D选项错误,答案为 D。 27 【正确答案】 A 【试题解析】 一旦函数在基类中声明为虚函数,它就一直是虚函数 ,派生类无法改变该函数为虚函数这一事实,所以派生类从基类中继承来的虚函数,不加virtual修饰,也是虚函数,选项 A正确;普通成员函数在派生类中也可以重新定义,重新定义后的成员函数会屏蔽对基类同名函数的
15、直接访问,选项 B错误;多态调用只能是通过基类对象的指针或引用调用虚函数来实现,基类对象调用虚函数不是多态调用,选项 C错误;构造函数不能声明为虚函数,因为构造函数是在对象完全构造之前运行的,在构造函数运行时,对象的动态类型还不完整,选项D错误;答案为 A。 28 【正确答案】 B 【试题解析】 派生类构 造函数在构造派生类过程中,首先初始化基类,然后根据声明次序初始化派生类的成员,最后执行函数体;析构函数在程序结束时负责撤销自己的成员,首先运行派生类析构函数,然后按继承层次依次向上调用各基类析构函数;在 main函数中,创建 Derived类对象 obj,此时调用 Derived的构造函数,
16、构造函数在进入函数体之前,又调用基类 Base的构造函数构造基类,由于Derived中没有数据成员,所以构造完基类,执行函数体,输出为: “BD“;撤销obj对象时,首先执行 Derived的析构函数,然后调用基类的析构函数,输出为“db“;答案为 B。 29 【正确答案】 C 【试题解析】 公有继承中,派生类不改变基类的成员访问权限 (private成员除外 ),即基类的 public成员在派生类中是 public成员,基类的 protected成员在派生类中是 protected成员;另外友元函数可以访问类的 private成员、 protected成员和 public成员,所以 f函数中
17、 d可以访问的数据成员有: n、 p、 k; m对派生类不可见;答案为 C。 30 【正确答案】 B 【试题解析】 main函数中,首先创建 AA类的对象 aa,使 用默认构造函数初始化 aa,输出 “1“;将 aa作为实参传入函数 f1,由于 f1形参是 a是局部对象,需要调用复制构造函数,用 aa初始化 a,输出 “2“;最后将 aa作为实参传入函数 f2,由于 f2形参是 AA类的引用 a, a将直接引用 aa,不需要调用构造函数,所以程序输出结果为: “12“;答案为 B。 31 【正确答案】 C 【试题解析】 程序定义了类 AA,成员函数 disp()为虚函数;类 BB公有继承AA,
18、重新定义了 disp()函数;类 CC公有继承 BB,同样重新定义了 disp()函数;类 BB中,虽然 disp()未用 virtual修饰,但是由虚函数性质可知, BB中的 disp()函数仍然是虚函数; main()函数中,创建 BB对象 bb, CC对象 cc,使用 cc初始化 BB类引用 rb,然后调用 plot函数; plot函数的形参是 AA类的引用,通过 AA类引用调用 disp函数,满足多态性条件,将根据引用所指对象的类型来决定调用哪个 disp函数;所以 plot(bb)调用类 BB中的 disp函数, plot(cc)调用 CC中的disp函数;输出分别为: “B“、 “
19、C“;另外由于 rb为 BB类引用,所指对象是cc,所以运行 rb.disp()时调用的 是 CC中的 disp()函数,输出 “C“,综上,程序输出为: “BCC“;答案为 C。 32 【正确答案】 D 【试题解析】 模板形参表中, class关键字修饰的是类型形参,代表在函数中使用的数据类型,而 return语句返回的应该是整型值,选项 D错误,答案为 D。 33 【正确答案】 C 【试题解析】 定义类模板时,模板形参表同样使用尖括号括起来,答案为 C。 34 【正确答案】 A 【试题解析】 C+的输入输出体系中,从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作 ,选项
20、B、 D错误; cin是一个预定义的输入流对象,选项 D错误,答案为 A。 35 【正确答案】 A 【试题解析】 选项 B中类型形参 T前需要有关键字 class或 typename修饰;选项 C中函数 ads需要返回值;选项 D中形参表不能为空;答案为 A。 36 【正确答案】 B 【试题解析】 setprecision设置实数的精度; setw设置字段宽度; setfill填充字符; showpoint强制输出浮点数的小数点和尾数 0;答案为 B。 37 【正确答案】 D 【试题解析】 在类模板声明中 ,每个模板类型形参前面都必须用关键字 class和typename来修饰;选项 D错误,答案为 D。 38 【正确答案】 A 【试题解析】 getline(istream &is, string &str)第一个参数 is是输入流对象,这个对象可以是键盘输入流对象,也可以是文件输入流等其他输入流的对象,选项 A错误,答案为 A。 39 【正确答案】 B 【试题解析】 setw(n)用来设置输入输出数据字段的宽度为 n位,答案为 B。 40 【正确答案】 C 【试题解析】 cin是 C+预定义的 标准输入流对象,答案为 C。