1、国家二级( C+)笔试模拟试卷 171及答案与解析 1 最简单的交换排序方法是 ( A)快速排序 ( B)选择排序 ( C)堆排序 ( D)冒泡排序 2 栈通常采用的两种存储结构是 ( A)线性存储结构和链表存储结构 ( B)散列方式和索引方式 ( C)链表存储结构和数组 ( D)线性存储结构和非线性存储结构 3 线性表的顺序存储结构和线性表的链式存储结构分别是 ( A)顺序存取的存储结构、顺序存取的存储结构 ( B)随机存取的存储结 构、顺序存取的存储结构 ( C)随机存取的存储结构、随机存取的存储结构 ( D)任意存取的存储结构、任意存取的存储结构 4 完全不考虑程序的内部结构和内部特征,
2、而只是根据程序功能导出测试用例的测试方法是 ( A)黑箱测试法 ( B)白箱测试法 ( C)错误推测法 ( D)安装测试法 5 在结构化设计方法中,生成的结构图 (SC)中,带有箭头的连线表示 ( A)模块之间的调用关系 ( B)程序的组成成分 ( C)控制程序的执行顺序 ( D)数据的流 向 6 下列选项中,不属于模块间耦合的是 ( A)数据耦合 ( B)同构耦合 ( C)异构耦合 ( D)公用耦合 7 一个关系中属性个数为 1时,称此关系为 ( A)对应关系 ( B)单一关系 ( C)一元关系 ( D)二元关系 8 为用户与数据库系统提供接口的语言是 ( A)高级语言 ( B)数据描述语言
3、 (DDL) ( C)数据操纵语言 (DML) ( D)汇编语言 9 相对于数据库系统,文件系统的主要缺陷有数 据关联性差、数据不一致性和 ( A)可重用性差 ( B)安全性差 ( C)非持久性 ( D)冗余性 10 需求分析阶段的任务是确定 ( A)软件开发方法 ( B)软件开发工具 ( C)软件开发费用 ( D)软件系统功能 11 下列符号中可以用作 C+标识符的是 ( )。 ( A) _radius ( B) foo bar ( C) else ( D) 3room 12 下列关于 C+流的说明中,正确的是 ( )。 ( A)与键盘、屏幕、打印机和通信端口的交互都可以通过流类来实现 (
4、B)从流中获取数据的操作称为插入操作,向流中添加数据的操作称为提取操作 ( C) cin是一个预定义的输出流类 ( D)输出流有一个名为 open的成员函数,其作用是生成一个新的流对象 13 若执行语句: cout setfill(*) setw(10) 123 “OK“ endl后将输出 ( )。 ( A) *1230K ( B) 123*OK ( C) *123*OK ( D) 123*OK* 14 类模板的使用实际上是将类模板实例化成一个具体的 ( )。 ( A)类 ( B)对象 ( C)函数 ( D)模板类 15 有如下函数模板定义: template class T T func(T
5、 x,T y)return x*x+y*y; 在下列对 func的调用中,错误的是 ( )。 ( A) fimc(3,5); ( B) func(3.0,5.5); ( C) func(3,5.5); ( D) func int (3,5.5); 16 假定要对类 AB定义加号操作符重载成员函数,实现两个 AB类对象的加法,并返回相加结果,则该成员数的声明语句为 ( )。 ( A) AB operator+(AB class TestClass public: virtual void fun1() cout “fun1TestClass“; virtual void fun2() cout
6、“fun2TestClass“; ; class TeSt ( A) fun1TeStClass1 fun2TeStClass ( B) fun1TestClass1 fun2TestClass1 ( C) fun1TeStClass fun2TeStClass ( D) fun1TestClaSSfun2TestClaSS1 20 有下列程序: #inClude iostream using namespace std; c1ass A pubic: virmal void func1()cout “A1“; void func2()cout“A2“; ; c1ass B:public A
7、publIc: void func1()cout “B1“; void func2()cout “B2“ ( A) B182 ( B) A1A2 ( C) B1A2 ( D) A182 21 有如下类声明: c1ass TeStClass int i; private:int j; protected:int k; public:int m,n; ; 其中,私有成员的数量为 ( )。 ( A) 0 ( B) 1 ( C) 2 ( D) 3 22 有下列程序: #include iostream using namespace std; c1ass TestClass private; char
8、 c; public: TestClass(char n):c(n) TeStClass() cout c ; class TestClass1:public TestClass ( A) xy ( B) yx ( C) x ( D) y 23 阅读下列程序: #include iostream.h void main() int i,row=0,column=0,min; static int a33=100,28,72,-30,2,100; min=a00; for(i=0;i 3;i+) for(j=0;j 3;j+) if(aij min) min=aij; ( A) -100,2,3
9、 ( B) -100,1, 2 ( C) 100,1,1 ( D) 100,0,0 24 重载输入流运算符必须使用的原型为 ( )。 ( A) istream ( B) istream ( C) istream operator (istream,类名 ( D)类名 operator (istream 25 关于调用模板函数时模板实参的使用,下列表述中正确的是 ( )。 ( A)对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略 ( B)对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略 ( C)对于虚拟类型参数所 对应的模
10、板实参,若能够省略则必须省略 ( D)对于常规参数所对应的模板实参,任何情况下都不能省略 26 在进行了任何 C+流的操作后,都可以用 C+流的有关成员函数检测流的状态,其中只能用于检测刚进的操作是否失败的函数名是 ( )。 ( A) fail ( B) eof ( C) bad ( D) good 27 已知 n是一个 int型变量,下列语句中错误的是 ( )。 ( A) long*p=new longn; ( B) long pn; ( C) long*p=newl ong(n); ( D) long p10; 28 有下列程序: #include iostream.h using nam
11、espace std; classBase protected: int i; public: int j; ; classDerived:public Base int m; public: intn; ; int ( A) 1和 2 ( B) 1)和 3 ( C) 2和 3 ( D) 2和 4 29 有如下语句序列: int k=0: dok+=5;cout $; while(k 19); while(k- 0)cout * 执行上面的语句序列输出字符 “$”和 “*”的个数分别是( )。 ( A) 4和 20 ( B) 5和 20 ( C) 4和 21 ( D) 5和 21 30 下列关
12、于虚函数的描述中,正确的是 ( )。 ( A)虚函数是一个 static类型的成员函数 ( B)虚函数是一个非成员函数 ( C)基类中采用 virtual 说明一个虚函数后,派生类中定义相同原型的函数时可不必加 virtual 说明 ( D)派生类中的虚函数与基类中相同原型的虚函数具有不同的参数个数或类型 31 有下列程序: #include iosteram.h using namespace std; class Base public: Base()cout “BB“; f(); void f()cout “Bf“; ; class Derived:public Base public:
13、 Derived()cout “D ( A) BBBfDD ( B) BBDfDDDf ( C) DD ( D) DDBBBf 32 有下列程序: #include iosteram.h using namespace std; class Stack public: Stack(unsignedn=10):size(n)rep_=new int size;top=O; Stack(Stack fo ( A) 4,3,2,1, ( B) 4,3,6,7,2,1, ( C) 4,3,6,2,1, ( D) 1,2,3,4, 33 已知枚举类型定义语句为: enum TokenNAME,NUMBE
14、R,PLUS=5,MINUS,PRINT=10; 则下列叙述中错误的是( )。 ( A)枚举常量 NAME的值为 1 ( B)枚举常量 NUMBER的值为 1 ( C)枚举常量 MINUS的值为 6 ( D)枚举常量 PRINT的值为 10 34 要定义一个具有 5个元素的一维数组 vect,并使其各元素的初值依次是 30,50, -88, 0和 0,则下列定义语句中错误的是 ( )。 ( A) int vect=30,50,-88; ( B) int vect=30,50,-88,0,0; ( C) int vect5=30,50,-88; ( D) int vect5=30,50,-88,
15、0,0; 35 有下列程序: #include iostream using namespace Std; class Test public: Test() n+=2; Test() n-=3; static int getNum()return n; private: static int n; ; int Test n=1; int main() ( A) n=0 ( B) n=l ( C) n=2 ( D) n=3 36 在程序设计阶段应该采取 _和逐步求精的方法,把一个模块的功能逐步分解,细化为一系列具体的步骤,继而用某种程序设计语言写成程序。 37 注释一般分为序言性注释和 _注释
16、。 38 在面向对象方法中,类的实例称为 _。 39 某二叉树中度为 2的结点有 18个,则该二叉树中有 _个叶子结点。 40 数据流图的类型有 _和事务型。 41 表达式 x=operator-(y,z)可以表示为 _。 42 以下函数模板 max()的功能是返回数组 a中最大 元素的值。请将横线处缺失部分补充完整。 template typename T T max(T a,int n) T m=a0; for(int i=l;i n;i+) if(ai m)_; return m; 43 重载的关系运算符和逻辑运算符的返回类型应当是 _。 44 如果不使用多态机制,那么通过基类的指针虽然
17、可以指向派生类对象,但是只能访问从基类继承的成员。下列程序没有使用多态机制,其输出结果是 _。 #include iostream using namespace std; class Base public: void print() cout B; class Derived:public Base public: 45 对于派生类的构造函数,在定义对象时构造函数的执行顺序:先执行调用_的构造函数,再执行调用子对象类的构造函数,最后执行派生类的构造函数体中的内容。 46 执行下列程序的输出结果是 _: #include iostream using namespacestd; class
18、TestClassl public: void funl()cout “TestClassln“; virtual void fun2() cout “TestClassln“; ; class TestClass2:public TestClass1 public: 47 请定义一个函数名为 fun,返回值为 int,没有参数的纯虚函数的定义是_。 48 重新定义标识符的作用域规定是外层变量被隐藏, _变量是可见的。 49 如果表达式 x=y*z中的 “*”是作为成员函数重的运算符,采用运算符函数调用格式,该表达式还可以表示为 _。 50 有下列程序: #include iostream u
19、sing namespace std; class Con char ID; public: Con():ID(A)cout 1; Con(char ID) :D(ID) cout 2; Con(Con char getID()constr 国家二级( C+)笔试模拟试卷 171答案与解析 1 【听力原文】 冒泡排序是一种最简单的交换类排序方法,它是通过相邻数据元素的交换逐步将线性表变成有序。 1 【正确答案】 D 2 【正确答案】 A 3 【正确答案】 B 4 【正确答案】 A 5 【正确答案】 A 6 【正确答案】 C 7 【正确答案】 C 8 【正确答案】 C 9 【正确答案】 D 10
20、 【正确答案】 D 11 【正确答案】 A 【试题解析】 此题考查的是标识符。标识符是由数字、字母以及下划线构成 ,其第一个字符必须是字母或下划线,中间不能有空格;标识符的长度是任意的,但由于编译系统的限制一般不超过 31个字符;标识符中的大小写字母是不同的;定义标识符时不能采用系统的保留字。符合这些要求的只有 A)。 12 【正确答案】 A 【试题解析】 选项 B)中,从流中获取数据的操作称提取操作,向流中添加数据的操作称为插入操作:选项 C)中, cin是一个预定义的输入流对象:选项 D)中,open的成员函数只能打开文件;故只有选项 A)的叙述是正确的。 13 【正确答案】 A 【试题解
21、析】 cout.fill()用于设置或返回输出的填充字符,默认是空格, fill()函数的设置一直有效,直到下一个 fill()函数改变该值为止。 setw(int n)作用是设置输入输出的宽度,此设置只对一次输入或输出效,在完成一次数据的输入或输出后,宽度设置自动恢复为 0。注意:默认为输出数据在指定宽度内右对齐。 14 【正确答案】 A 【试题解析】 类模板就是把类中的数据分离出来,作为一个类的描述。 C+编译器根据类模板和特定的数据类型来产生一个类,类模板就是一个抽象的类。 15 【正确答案】 C 【试 题解析】 选项 C)中两个实参的实际类型不同而未进行转换,会出现错误。 16 【正确
22、答案】 B 【试题解析】 因为题目的要求是对类 AB定义加号操作符重载成员函数,所以首先应该对范围加以限定,参数是对类对象的引用。 17 【正确答案】 D 【试题解析】 运算符重载为成员函数的形式:函数类型 operator运算符 (形参表 )函数体; ;运算符重载为友元函数的形式: friend函数类型 operator运算符(形参表 )函数体; 。一般来讲,单目运算符最好重为成员函数,双目运算符最好重载为友 元函数。 =、 、 ()、 -以及所有的类型转换运算符只能作为成员函数重载。 18 【正确答案】 B 【试题解析】 纯虚函数是在声明虚函数时被 “初始化 ”为 0的虚函数。纯虚函数没有
23、函数体,所以选项 A)和选项 C)不正确。纯虚函数的作用是在基类中为其派生类保留一个函数名字。所以选项 D)错误。 19 【正确答案】 A 【试题解析】 TestClass为基类, TestClass1是 TestClass的派生类。基类中的fun1和 fun2被定义为虚函数, C+规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数,所以派生类中的 fun1和 fun2也是虚函数。本题从 main主函数入手,首先定义了 TestClass类型的对象 ob1和指针 p,然后又定义了 TestClass1的对象 obj2。指针指向对象 obj2,然后调用其成员函数fun1(
24、),即输出 “fun1TesClass1”。 20 【正确答案】 C 【试题解析】 程序中 B为 A的派生类,由主函数入手,主函数中定义了类 A的指针 p指向类 B。根据基类中的 “virtual void func1()”知道 A中的 func1为虚函数,执 行 “p- func1(); ”语句,通过指针变量调用此虚函数,此时调用的就是指针变量指向的同名函数,即派生类的 func1函数,输出 B1。而 fun2不是虚函数,所以执行 “p- func2(); ”输出为 A2。 21 【正确答案】 C 【试题解析】 首先声明为 private的 “private: intj; ”,中 j为私有成
25、员。然后在类中没有指定,系统默认为私有。即 “int i; ”中的 i也是私有成员。所以本题中的私有成员数量为 2。 22 【正确答案】 A 【试题解析】 题目中程序 TestClass为基类, TestClass1为派生类。在主函数中定义 TestClass1对象 obj(x), “TestClass1(char n): TestClass(n+1), c(n)”,所以先输出 x,然后调用基类构造函数, x+=y,所以输出 y,即答案为 xy。 23 【正确答案】 B 【试题解析】 该程序是找到数组 a中的最小值,然后输出其数值及行、列。首先将 min的值赋值为 a中的第一行第一列的数值。然
26、后在 for两层循环中利用 if语句进行大小比较,求出数组最小值,即 -100。它的位置为第二行,第三 列。标识由 0开始计数,所以是 1, 2。 24 【正确答案】 A 【试题解析】 C+流的输入运算符 “ ”和输出运算符 “ ”只能作为非成员函数重载。重载输入流运算符 “ ”须使用以下原型: istream&operator(istream&,类名 );。 25 【正确答案】 D 【试题解析】 以下情况模板实参不能省略:从模板函数实参表获得的信息有矛盾:需要获得特定类型的返回值,而不管返回值类型如何:虚拟类型的参数没有出现在模板形参表中;函数模板含有常规形参。 26 【正确答 案】 A 【
27、试题解析】 可以用文件流对象的成员函数来判别文件流当前的状态: fail,刚进行的操作失败时返回 true,否则返回 false: eof,进行输入操作时,若文件到达文件尾返回 true,否则返回 false; bad,如果进行了非法操作返回 true,否则返回false; good,刚进行的操作成功时返回 true,否则返回 false。 27 【正确答案】 B 【试题解析】 此题考查的是数组、指针及关键字 new。说明一维数组的一般形式是:数组类型数组名 数度 ;其中数组长度必须是整型常量或常量 表达式。选项B)中, n是一个变量,不能做数组的长度,故选项 B)错误;其他选项均正确。 28
28、 【正确答案】 B 【试题解析】 此题考查的是类和派生类的访问权限。类 Derived公有继承类Base,所以 d对基类 Base成员的访问权限不变。因数据成员 i为保护,故不能通过对象访问:派生类 Derived中 m变量为私有,同样不能通过对象访问,所以1、 3错误。 29 【正确答案】 A 【试题解析】 此题首先执行语句 dok+=5; cout $; while(k 19);,循环执行 4次,输出 4个 “$”K的值变为 20;然后执行语句 while(k- 0)cout*;,因为其中的 k是后缀自减,所以会输出 20个 “*”。 30 【正确答案】 C 【试题解析】 虚函数是允许在派
29、生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。在基类中用 virtual声明成员函数为虚函数,在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同。 31 【正确答案】 A 【试题解析】 此题考查的是类的继承和派 生。派生类执行构造函数的一般次序:首先调用基类构造函数;然后调用成员对象的构造函数;最后是派生类构造函数中的内容。题目中定义派生类对象 d时,先调用基类 Base的构造函数,输出BBBf,然后调用派生类 Derived的构造函数,输出 DD。 32 【正确答案】 C 【试题解析】 此题综合考查了类与对象、
30、循环语句、指针等知识点。在主函数main中,先定义了类 Stack的对象 s1,通过循环将 1、 2、 3、 4压入堆栈内;然后定义对象 s2,并用对象 s1来初始化,所以 s2的大小也是 10。第二个循环将 4、 3弹出并输 出,然后将 6压入 s2的堆栈,然后将 s2中剩下的值全部弹出,即 6、2、 1。 33 【正确答案】 A 【试题解析】 此题考查的是 C+语言的数据类型。第一个枚举常量的值为 0;允许程序显示的定义中指定部分或全部枚举常量的值,枚举常量默认时,在前一枚举常量值的基础上以此增 1。 34 【正确答案】 A 【试题解析】 此题考查的是一维数组定义时的初始化。当数组声明时没
31、有给出数组的大小,但是有初始化列表时,数组的大小就由列表中元素的个数来确定。所以选项 A)中数组只定义 3个元素,不符合题目。 35 【正确答案】 A 【试题解析】 此题考查的是静态数据成员和静态成员函数。静态数据成员是类中所有对象共享的成员,而不是某个对象的成员。题目中的静态数据成员 n的运算具有叠加性,执行 “n+=2”和 “n-=3”后 n的值为 0。 36 【正确答案】 自顶向下 【试题解析】 程序设计时,应先考虑总体,后考虑细节,逐步使问题具体化,对复杂的问题,应该设计一些目标作为过渡。上述方法概括为自顶向下,逐步求精。 37 【正确答案】 功能性 【试题解析】 注释一般分为序言性注
32、释和功能性注释。序言 性注释通常位于每个程序的开头部分,给出程序的整体说明;功能性注释的位置一般嵌在源程序体之中,主要描述其后的语句或程序做什么。 38 【正确答案】 对象 【试题解析】 在面向对象的程序设计方法中,类是具有相同属性或方法的对象的抽象,对象是类的实例。 39 【正确答案】 19 【试题解析】 在任意一棵二叉树中,度数为 0的结点 (即叶子结点 )总比度为 2的结点多一个,因此该二叉树中叶子结点为 18+1=19。 40 【正确答案】 变换型 【试题解析】 典型的数据流类型有两种:变换型和 事务型。 41 【正确答案】 x=y-z 【试题解析】 运算符函数有两种调用形式,第一种是
33、像一般函数那样用函数名调用,即 y.operator-(z)或者 operator-(y, z);另一种是通过运算符构成表达式,即 y-z。 42 【正确答案】 m=ai 【试题解析】 此题考查的是函数模板、 if语句、 for循环等知识点。函数模板max()的功能是返回数组 a中最大元素的值,所以当 ai是最大值时,应将 ai的值赋给 m。 43 【正确答案】 bool 【试题解析】 关系 运算符和逻辑运算符重载后只能是 true或者 false,即返回值为 bool型。 44 【正确答案】 BD 【试题解析】 因为本题中的 print()函数不是虚函数,所以通过基类指针 pb调用的 pri
34、nt()函数是基类中的版本,而通过派生类指针 pb调用的 print()函数是派生类中的版本。因此,程序运行时会先输出一个字符 B,然后输出字符 D。 45 【正确答案】 基类 【试题解析】 对于派生类的构造函数,在定义对象时构造函数的执行顺序:先执行调用基类的构造函数,再执行调用子对象类的构造 函数,最后执行派生类的构造函数体中的内容。所以本题填:基类。 46 【正确答案】 TestClass1 TestClass2 【试题解析】 主函数中首先定义 TestClass2对象 obj,然后执行 “f(obj); ”。在“void f(TestClass1&b)b.fun1(); b.fun2(
35、); ”语句中, fun中参数为 TestClass1类型的对象 b,其中调用 fun1()和 fun2()。基类 TestClass1中的 fun2()为虚函数,所以派生类中的 fun2也是虚函数,因此输出为调用 TestClass1中的 fun1,TestClass2中的 fun2。即结果为 TestClass1和 TestClass2。 47 【正确答案】 virtual int fun()=0; 【试题解析】 纯虚函数是在声明虚函数时被 “初始化 ”为 0的函数。定义的一般形式: virtual函数类型函数名 (参数列表 )=0。所以,根据题目要求,答案应为“virtual int f
36、un()=0; ”。 48 【正确答案】 内层 【试题解析】 重新定义标识符的作用域规定是外层变量被隐藏,内层变量可见。 49 【 正确答案】 x=y.operator*(z)或 x=y.operator*(z) 【试题解析】 运算符函数有两种调用形式,第一种是像一般函数那样用函数名调用,即 y.operator*(z)或者 operator*(y, z):另一种是通过运算符构成表达式,即 y*z。 50 【正确答案】 13A23B 【试题解析】 此题考查的是类的构造函数。一个类如果有两个构造函数,一个是默认构造函数,它没有任何形参;一个是复制构造函数,它的形参是一个自身类型的引用,这种情况下,当建立对象不传入任何构造参数时会 调用默认构造函数,而用一个已创建的对象作为构造参数来创建一个新对象时会调用复制构造函数。本题中,构造函数声明对象 c1,此时输出 “1”;然后调用 show()函数,会发生复制构造,输出 “3”, show()函数输出 “A”:接着通过字符 B构造对象 c2,此时调用第二个构造函数,输出 “2”;然后又调用 show0函数,输出 “3”,在 s