1、国家二级( C+)笔试模拟试卷 237及答案与解析 1 有下列二叉树,对此二叉树前序遍历的结果为 ( )。 ( A) ACFXDBEYZ ( B) ABEFXYZCD ( C) ABCDEFXYZ ( D) ABDYECFXZ 2 3 用链表表示线性表的优点是 ( A)便于随机存取 ( B)花费的存储空间较顺序存储少 ( C)便于插入和删除操作 ( D)数据元素的物理顺序与逻辑顺序相同 4 一些重要的程序语言 (如 C语言和 Pascal语言 ) 允许过程的递归调用。而实现递归调用中的存储分配通常用 ( A) 栈 ( B)堆 ( C)数组 ( D)链表 5 有如下类定义: class Poin
2、t private: static int how_many; ; _how_many=0; 要初始化 Point类的静态成员 how_many,在下画线处应填入的内容是 ( A) int ( B) static int ( C) int Point: ( D) static int Point: 6 下列有关抽象类和纯虚函数的叙述中,错误的是 ( A)拥有纯虚函数的类是抽象 类,不能用来定义对象 ( B)抽象类的派生类若不实现纯虚函数,它也是抽象类 ( C)纯虚函数的声明以 “=0; ”结束 ( D)纯虚函数都不能有函数体 7 以下关于栈的描述中错误的是 ( )。 ( A)栈是先进后出的线性
3、表 ( B)栈只能顺序存储 ( C)栈具有记忆作用 ( D)对栈的插入与删除操作中,不需要改变栈底指针 8 执行如下程序将输出 ( ): #include iostream using namespace std; class Base public: Base()cout “BB“;fun(); void fun ()tout “Brim“; ; class Derived:public Base public: Derived()cout “DD“; void fun ()cout “Dfun“; ; int main()Derived d;return 0; ( A) DD ( B) B
4、BDfunDDDfun ( C) BBBfunDD ( D) DDBBBfun 9 有以下程序: #include iostream using namespace std; public: TestClass(int r1,int r2) R1=r1; R2=r2; void print(); void print() const; private; int R1,R2; ; void TestClass:print() cout R1 “,“ R2end1; void Testclass:print() const cout R1 using namespace std; class Te
5、stClass public: void fun()coutfun(); 19 下面程序的结果是 #include class A int a; public: A():a (1) void showa()cout a; ; class B int a; public: B():a (2) void showa()cout a; ; class C:public A, public B int a; public: C():a (3) void showa()cout a; ; void main() C c; c.showa(); ( A) 1 ( B) 2 ( C) 3 ( D)程序有错误
6、 20 下面程序的运算结果为 ( )。 #include iostream using namespace td; int i; int fun( ) static int i = 10; return + + i; void main ( ) fun( ); cout fun() “ ,“ i; ( A) 10,100 ( B) 12,100 ( C) 12,12 ( D) 11,100 21 下面程序的输出结果是 ( )。 #include iostream using namespace std; template class T T max(T x,T y) return(x =y ?
7、 x:y); void main() cout max(5,8) endl; cout max(“zhangsan“,“lisi“); ( A) 8 zhangsan ( B) 8 lisi ( C) 5 zhangsan ( D) 5 lisi 22 假定 MyClass为一个类,则该类的拷贝初始化构造函数的声明语句为 ( )。 ( A) MyClass class sample private: iht n; public: sample() sample(int m) n=m; void addvalue(int m) sample s; s.n=n+m; *this=s; void d
8、isp() cout “n=“ n end1; ; int main() sample s(10); s.addvalue(5); s.disp(); return 0; 程序运行后的输出结果是 ( A) n=10 ( B) n=5 ( C) n=15 ( D) n=20 30 有以下程序: #include iostream using namespace std; class R public: R(int r1,int r2) R1=rl; R2=r2; void print(); void print()const; private: int R1, R2; ; void R:prin
9、t() coutR1 “,“ R2 end1; void R:print() const cot R1 “,“R2 end1; int main() Ra(5, 4); const R b(20,52); b.print(); return 0; 执行后的输出结果是 ( A) 5,4 ( B) 20,52 ( C) 0,0 ( D) 4,5 31 下列各循环语句中,不是死循环的是 ( )。 ( A) int i=100; while(1) i=i%100+1; if(i=20) break; ( B) int i,sum=0; for(i=1; i+) sum=sum+1; ( C) int
10、k=0; do +k; while(k=0); ( D) int s=3379; while(s+%2+3%2) s+; 32 以下选项中, ( )是合法的字符常量。 ( A) N ( B) 010 ( C) 68 ( D) D 33 C+语言中类的定义的 结束声明的符号是 ( A) ( B), ( C); ( D) 34 对于以下带参数的 main()函数的第二形参, void main(int argc, _),不可能的形式是 ( A) char * argv ( B) char argv ( C) char * *a ( D) char * m 35 以下不能正确创建输出文件对象并使其与
11、磁盘文件相关联的语句是 ( A) ofstream myfile: myfile, open(“d: ofile txt“); ( B) ofstream *myfile=new ofstream; myfile- open(“d; ofile.txt“); ( C) ofstream myfile(“d: ofile.txt“); ( D) ofstream *myfile new (“d: ofile.txt“); 36 结构化设计主要分为系统设计和模块设计,【 】的任务是决定系统的模块结构。 37 如果把类 FriendClass定义为类 TestClass的友元类,则应该在类 Test
12、Class的定义中加入语句 _。 38 39 一个类 可以直接或间接的祖先中继承所有的属性和方法。采用这个方法可以提高了软件的【 】。 40 在长度为 n的有序线性表中进行二分查找。最坏的情况下,需要的比较次数为【 】。 41 如果表达式 x=y*z 中的 “*”是作为成员函数重的运算符,采用运算符函数调用格式,该表达式还可以表示为 _。 42 以下程序的输出结果是 _。 #include iostream.h class object private: int val; public: object( ) ; object(int i) ; object( ) ; object: :obje
13、ct( ) val 0; cout “Default constructor for object“ endl; object: :object(int i) val i; cout “Constructor for object“ val endl; object: : object( ) cout “Destructor for object“ val endl; class container private: object one; object two; int data; public: container( ) ; container(int i,int j,int k) ; c
14、ontainer( ) ; container: :container( ) data 0; cout “Default constructor for container“ endl; container: :container(int i,int j,int k) :two(i) ,one(j) data k; cout “Constructor for container“ endl; container: : container( ) cout “Destructor for container“ endl; void main( ) container anObj(5,6,10) ;
15、 43 执行下列语句后,输出的结果为 _。 void fun() static im x=3: x+: coutx“”; int main() for(int i=0; i2; i+) fun(); return D; 44 如果类中的一个成员函数的定义实现在类内,则该函数系统自动默认为该类的【 】函数。 45 假设血 int a=1,b=2;,则表达式 (+a/b)*b-的值为【 】。 46 以下程序的输出结果是【 】。 #include iostream h unsigned frn(ullsigned num) unsi9ned k=1; dok*=num%10; num/=10; wh
16、ile(num); return k; void main() unsigned n=26; cout fun(n) endl; 47 多态性分为两类:编译时的多态性和【 】。 48 下列程序从保存整数的文本文件 “c:Sample. dat“中依次 取出每个数据并显示出来,同时统计并显示出所有数据的个数。程序划线处的表达式为【 】。 #include stream, h #include stdlib, h void main( ) ifstream fin (“c: Sample. dat“ , ios: :nocreate); if( ! fin) cerr “文件无法打开 !“ end
17、1; exit(1); int x,i=0; while(_) cout x “; i+; fin. close( ); cout endl “文件中所有整数个数 :“ i end1; 49 在任何类中都有三种访问权限的数据成员,这三种权限是 public、 private和【 】。 50 有如下程序: #include iostream using namespace std; int fun1(int x) return+x; int fun2(int int main() int x=1, y=2; y=fun 1(fun2(x); cout X , y; return 0: 程序的输出
18、结果是 _。 国家二级( C+)笔试模拟试卷 237答案与解析 1 【正确答案】 D 【试题解析】 对二叉树的前序遍历是指先访问根结点,然后访问左子树,最后访问右子树。并且在访问左、右子树时,先访问根结点,再依次访问其左、右子树。记住 3种遍历的顺序: 前序,访问根 按前序遍历左子树 按前序遍历右子树: 中序,按中序遍历左子树 访问根 按中序遍历右子树; 后序,按后序遍历左子树 按后序遍历右子树 访问根。 2 【正确答案】 A 【试题解析】 就软件测试而言,它的目的是发现软件中的错误。但是,发现错误并不是最终目的,最终 目的是通过测试发现错误之后还必须诊断并改正错误,这才是测试的目的。由于测试
19、的目标是暴露程序中的错误,所以从心理学角度看,由程序的编写者自己进行测试是不恰当的。因此,在软件测试阶段通常由其他人员组成测试小组来完成测试工作。经过上述分析可知,选项 A的说法是正确的,而选项 B、 C、 D的说法是错误的。 3 【正确答案】 C 【试题解析】 链式存储结构克服了顺序存储结构的缺点 :它的节点空间可以动态申请和释放 ;它的数据元素的逻辑次序靠节点的指针来指示,不需要移动数据元素。故链式存储结构下的线性表便于插入和删除操 作。 4 【正确答案】 A 【试题解析】 一些较流行的程序语言允许过程的递归调用。递归调用就是过程调用本身。递归实现的是 :当过程每一次执行后,都能返回到最近
20、一次调用它的过程中。这样各调用点之间形成一种后进先出的关系,而栈结构正适合来存储这些调用点。 5 【正确答案】 C 6 【正确答案】 D 【试题解析】 纯虚函数的声明格式为: virtual 函数类型函数名 (参数表 )=0 拥有纯虚函数的类就叫抽象类,如果在派生类中不实现纯虚函数,则派生类也是抽象类。纯虚函数在派生类可 以被重新定义,即可以拥有函数体。 7 【正确答案】 B 【试题解析】 栈是限定只能在表的一端进行插入和删除操作的线性表,入栈和出栈都是在栈顶进行,它们的操作特点是先进后出,因此具有记忆作用。栈可以采用顺序存储,也可以采用链式存储。 8 【正确答案】 C 【试题解析】 C+中创
21、建一个类的实例时,如果该类存在基类,将首先执行基类的构造函数,然后执行该类本身的构造函数。本题中首先执行类 Base的构造函数,所以将先输出 “BB”,然后调用基类成员函数 fun(),输出 “Bfun”,最后调用子类 Derived的构造函数输出 “DD”。 9 【正确答案】 B 10 【正确答案】 B 【试题解析】 链表采用的是链式存储结构,它克服了顺序存储结构的缺点:它的结点空间可以动态申请和释放;它的数据元素的逻辑次序靠结点的指针来指示,不需要移动数据元素。但是链式存储结构也有不足之处: 每个结点中的指针域需额外占用存储空间; 链式存储结构是一种非随机存储结构。 11 【正确答案】 C
22、 【试题解析】 所谓函数重载,是指同一个函数名可以对应多个函数的实现。进行函数重载时,要求同名函数在参数个数上不 同,或者参数类型上不同。即重载函数具有不同的形参列表。 12 【正确答案】 C 【试题解析】 静态数成员是一种特殊的数据成员。静态数据成员不属于某一个对象,在为对象所分配的空间中不包括静态数据成员所占的空间。所有对象共享这些静态数据成员,都可以引用它。 13 【正确答案】 A 14 【正确答案】 C 15 【正确答案】 D 16 【正确答案】 B 【试题解析】 本题考察的是后置自增运算符的知识,题中 if语句可以拆解为:if(n 10)n+=1, cout n endl;。 17
23、【正确答案】 D 【试题解析】 本题主要考查的是 switch 语句的使用,在第一个 case处,因为满足条件所以输出字符 3,但这个分支没有 break 语句终止,所以会继续执行下面的分支语句,即输出字符 2,这时出现 break 语句,结束整个语句,即输出 32。 18 【正确答案】 C 【试题解析】 程序中的 TestClass1为 TestClass 的派生类, TestClass1 公有继承TestClass,所以可以调用其中的公有成员 fun函数,如果要显示调用它,那么使用域符号 “: ”,这样 就实现了对函数的显示调用,即选择 C)。 19 【正确答案】 C 【试题解析】 类 A
24、,类 B,中都有 showa()函数,类 C继承后再次重写 showa()函数就解决了继承的二义性,这时 c.showa()函数显示的就是类 C中的 showa()的值。 20 【正确答案】 B 【试题解析】 fun()中的 i为静态变量只在函数中可见,执行两次变为 12;主函数中的 i为全局变量, fun()对 i的修改不影响。 21 【正确答案】 A 【试题解析】 当运行 max(“zhangsan“,“lisi“); 时实例化为 char *max(char *x,char *y),返回的是 zhangsan 的地址,从而打印出 zhangsan 的结果。 22 【正确答案】 C 23
25、【正确答案】 B 24 【正确答案】 D 25 【正确答案】 C 【试题解析】 由算术运算符组成的表达式中,若含有不同类型的操作数,则系统隐含地将低类型转化为高类型,由低至高的顺序为 int - float- double。 26 【正确答案】 D 27 【正确答案】 B 【试题解析】 do-while语句的一般格 式为 do循环体语句 while(表达式 );先执行循环体语句一次,再判断表达式的值,若为真则继续执行循环,否则终止循环。本题中,先执行 x=x-2,即为 1。判断表达式的值, !(-x)为真, x=0,继续循环。再次执行循环体语句后, x=-2,此时表达式的值为 0,结束循环。
26、28 【正确答案】 A 【试题解析】 C+语言中规定在类体中不允许对所定义的数据成员进行初始化。 29 【正确答案】 C 【试题解析】 本题考核 this 指针的应用。上述程序中 sample类定义了一个addvalue非静态成员 函数。 addvalue 函数的原型是: void addvalue(sample*this,int m);,该函数的第一个参数是执行该类对象的一个指针即 this 指针。由于这个参数是系统隐含的,所以我们在定义该成员函数时并没有看到这样一个参数。在成员函数的定义体中,可以通过 this 访问这一参数。上述程序的最后输出结果是 15。 30 【正确答案】 B 【试题
27、解析】 使用 const关键字修饰的对象成为常对象,题中对象 b 被声明为类R的常对象。使用 const关键字说明的成员函数称为常成员函数,类 R中用 const重载了函数 print()。在使用常对象和常成员函数时应注意的是: const是函数类型的一个组成部分,因此在部分也要带 const关键字:常成员函数不能更新对象的数据成员,也不能调用该类中没有用 const修饰的成员函数;如果将一个对象说明为常对象,则通过该常对象只能调用它的常成员函数,不能调用其他的成员函数;const关键字可以参与区分重载函数。本题中, b 为类 R的常对象,通过 b只能调用类 R的常成员函数 print()输出
28、 20,52。 31 【正确答案】 A 【试题解析】 分析各个选项。选项 A中,当变量 i的值等于 20时,会执行break;语句,即退出整个 while循环体。所以选项 A的循环语句不是死循环。其他各个选项的循环语句中,没有循环退出点,所以都是死循环。 32 【正确答案】 B 【试题解析】 本题考核字符型常量的表示。选项 A中是字符串的表示方法。选项 B 所表示的是一个转义字符,是特殊的字符常量。选项 C中所表示的是整型常量。选项 D中不是常量的表示。 33 【正确答案】 C 【试题解析】 C+语言中类定义的结束符号是分号。注意:函数的定义不需要分号。 34 【正确答案】 B 【试题解析】
29、本题要考查的实际是字符数组,用于向函数传递参数,属于指针或引用传递方式。要注意的是考生不要被名称所迷惑,即根据 A和 D是相同类别的,故可以排除。对 C来说,也属于指针传递方式,而 B不仅不属于指针传递,而且还没有限定数组大小,编译器在编译时就会产生错误。 35 【正确答案】 D 【试题解析】 本题考查文件对象的创建方法。可以直接定义文件对象,也可以用new 来动态生成。很明显,选项 D中使用 new 的方式是错误的。 36 【正确答案】 系统设计 【试题解析】 结构化设计主要分为系统 设计和模块设计。系统设计的任务是决定系统的模块结构;模块设计的任务是具体考虑每一个模块内部采用什么算法,模块
30、的输入、输出以及该模块的功能。 37 【正确答案】 friend class FiendClass 38 【正确答案】 数据库系统 39 【正确答案】 可重用性 40 【正确答案】 log2n 【试题解析】 对于长度为 n的有序线性表,在最坏情况下,二分查找只需要比较log2n次,而顺序查找需要比较 n次。 41 【正确答案】 x=y.operator*(z)或 x=y.operator*(z) 【试题解析】 运算符函数有两种调用形式,第一种是像一般函数那样用函数名调用,即 y.operator*(z)或者 operator*(y, z):另一种是通过运算符构成表达式,即 y*z。 42 【正
31、确答案】 Constructor for object6 Constructor for object5 Constructor for container Destructor for container Destructor for object5 Destructor for object6 【试题解析】 C语言中的构造函数和析构函数分别是在声明对象时和对象调用完毕后调用,本题中的调用就是这样成对出现的。 43 【正确答案】 4, 5 【试题解析】 本题考查了静态变量的用法。当函数执行完毕后,返回调用点时,静态变量并不撤销,其值将继续保留,若下次进入该函数,其值仍然存在。所以本题输出 4
32、, 5。 44 【正确答案】 内联 45 【正确答案】 2 46 【正确答案】 12 【试题解析】 函数有一个形参 num,循环前变量 k置 1,循环中,表达式nora%10是取 num的个位,将 num的个位值累乘于 k中,然后 num除以 10。循环直至 num为 0结束,这是逐一求出 num十进制表示的各位数字,并累乘于变量k 的循环。函数最后返回 k。函数 fun 的功能是求整数的各位十进数字积。 47 【正确答案】 运行时的多态性 【试题解析】 本题考核 C的多态性。在 C语言中,多态性可分为两类:编译时的多态性和运行时的多态性。 48 【正确答案】 fin x 【试题解析】 whi
33、le语句用于完成题目指定的功能,则 while的条件判 断部分应完成从文件读取字符的功能,并能够判断出读入字符失败后的情况。 49 【正确答案】 protected 【试题解析】 本题考察类的访问权限,属于基本知识,考生应熟练掌握。 50 【正确答案】 2,3 【试题解析】 此题考查的是函数传值。 int fun1(int x) retum+x;函数中参数为传值,所以对于函数的操作不会改变实参的值,而函数 int fun2(int 中的参数为引用,对于形参的操作会改变实参的值。在主函数中调用 fun2(x)后,变量 x的值修改为 2,所以在调用 fun1函数时其形参值为 2,即运算后 y的值被赋值为 3,所以输出为 2,3。