1、二级 C+笔试 52 及答案解析(总分:88.00,做题时间:90 分钟)一、B选择题/B(总题数:30,分数:60.00)1.若有以下程序: #include iostream using namespace std; class Base private: int a,b; public: Base(int x, int y) a=x; b=y; void show() couta“, “bend1; ; class Derive : public Base private: int c, d; public: Derive(int x,int y, int z,int m):Base(x
2、,y) c=z; d=m; void show() coutc“, “dend1; ; int main () Base b(50,50),*pb; Derive d(10,20,30, 40); pb= pb-show (); return 0; 招待程序后的输出结果是( )。(分数:2.00)A.10,20B.30,40C.20,30D.50,502.若有以下程序: #include iostream using namespace Std; class sample int i; publiC: sample() void setvalue(int m) i=m; void fun(in
3、t m) i+=m; void disp() coutiend1; ; int main() sample *ps; ps=new sample; ps-setvalue(20); ps-fun(5); ps-disp(); return 0; 程序运行后,输出的结果是( )。(分数:2.00)A.15B.20C.25D.303.下面各选项中,属于非法的 C+整型常量的是( )。(分数:2.00)A.01B.0x11C.081D.-327684.数据是指所有能输入到计算机之中并被计算机程序处理的( )。(分数:2.00)A.文字B.字母C.符号D.数字5.在一棵度为 3 的树中,度为 3 的节
4、点有 2 个,度为 2 的节点有 1 个,度为 1 的节点有 2 个,那么,该树的叶节点数目为( )。(分数:2.00)A.4B.5C.6D.76.若有以下程序: #include iostream using namespace std; class sample private: int x; public: sample() void setx(int i) x=i; friend int fun(sample B,int n) int m=O; for (int i=O; in; i+) if(Bi.xm) m=B i.x; return m; ; int main ( ) sampl
5、e A10; int arr=90,87,42,78,97,84,60,55,78,65; for (int i=O;i10;i+) Ai. setx (arri);coutfun(A, 10)end1; return 0; 该程序运行后的输出结果是( )。(分数:2.00)A.97B.84C.90D.787.若有以下程序: #include iostream using namespace std; class Base public: Base ( ) x=0; int x; ; class Derivedl : virtual public Base public: Derivedl (
6、) x=10; ; class Derived2 : virtual public Base public: Derived2 () x=20; ; class Derived : public Derivedl,protected Derived2 ; int main ( ) Derived obj; coutobj .xend1; return 0; 该程序运行后的输出结果是 ( )。(分数:2.00)A.20B.30C.10D.08.信息隐蔽的概念与下述哪一种概念直接相关( )。(分数:2.00)A.软件结构定义B.模块独立性C.模块类型划分D.模块耦合度9.下列关于软件工程概念的描述
7、中,错误的是( )。(分数:2.00)A.软件工程概念的出现源自软件危机B.软件工程就是试图用工程、科学和数学的原理与方法研制,维护计算机软件的有关技术及管理方法C.软件工程包括 3 个要素,即方法、工具和过程D.软件工程不重视在软件开发过程中应用工程化原则10.设有以下程序段: int a5=0,*p,*q; p=a; q=a; 则下列选项中,合法的运算是( )。(分数:2.00)A.p+qB.p-qC.p*qD.p%q11.若有以下程序: #include iostream using namespace Std; int main() int i ; int a3 3 = 1,2,3,4
8、,5,6,7,8,9; for(i=0;i3;i+) coutai 1“ “; coutend1; return 0; 执行后的输出结果是( )。(分数:2.00)A.50 53 56B.49 52 55C.2 5 8D.1 4 712.若有以下定义: int a =1,2,3,4,5,6,7; char c1=b,C2=2; 则数值不为 2 的表达式是( )。(分数:2.00)A.a1B.d-c1C.a3-c2D.c2-013.以下说法中,不正确的是( )。(分数:2.00)A.C+程序中必须有一个主函数 main(),而且是从 main()的第 1 条语句开始执行的B.非主函数都是在执行主
9、函数时,通过函数调用或嵌套调用而得以执行的C.主函数可以在任何地方出现D.主函数必须出现在固定位置。14.下列叙述中,不正确的是( )。(分数:2.00)A.一个数据结构中的元素在计算机存储空间中的位置关系与逻辑关系可能不同B.一个数据结构中的元素在计算机存储空间中的位置关系与逻辑关系一定不同C.数据的存储结构,也称数据的物理结构。D.数据的存储结构与数据的逻辑结构是不同的15.有以下程序: #include iostream using namespace Std; int a; int fun(); int main() extern int a; int b; a = 100; b =
10、fun(); coutbend1; return 0; int fun() extern int a; return (10*A); 其程序运行后的输出结果是( )。(分数:2.00)A.100B.10C.1000D.1000016.若有如下程序: #include iostream using namespaces std; int s=0; class sample, static int n; public: sample(int i) n=i; static void add() s+=n; ; int sample:s=0; int main() sample a(2),b(5);
11、sample:add(); coutsend1; return 0; 程序运行后的输出结果是( )。(分数:2.00)A.2B.5C.7D.317.下列打开文件的表达式中,错误的是( )。(分数:2.00)A.ofstream ofile; ofilopen(“C:/vc/abtxt“,ios: :binar;B.fstream iofile; iofilopen(“abtxt“,ios:at;C.ifstream ifile(“C:/vc/abtxt“);D.couopen(“C:/vc/abtxt“,ios: :binar;18.模板函数的真正代码是在( )时候产生。(分数:2.00)A.
12、源程序中声明函数时B.源程序中定义函数时C.源程序中调用函数时D.运行执行函数时19.有如下程序: #include iostream using namespace std; int b=3; int fun(int *k) int b=2; b=*(k+)*b; return(B) ; int main() int a ;11,12,13,14,15,16); b=fun( class data public: int x; data (int x) data: :x=x; ; class A private: data d1; public: A(int x) : d1 (x) void
13、 dispa() coutd1, x“, “; ; class B: public A private: data d2; public: B(int x) : A(x-1),d2(x) void dispb() coutd2.xend1; ; class C : public B public: C(int x) : B(x-1) void disp () dispa ( ); dispb (); ; int main ( ) C obj (5); obj.disp(); return 0; 程序执行后的输出结果是( )。(分数:2.00)A.5,5B.4,5C.3,4D.4,3二、B填空题
14、/B(总题数:14,分数:28.00)31.在一个有 n 个元素的顺序表的第 i 个元素(1in)之前插入一个新元素时,需要向后移动U 【1】 /U个元素(分数:2.00)填空项 1:_32.在面向对象方法中,类之间共享属性和操作的机制称为U 【2】 /U。(分数:2.00)填空项 1:_33.源程序文档化要求程序应加注释。注释一般分为序言性注释和U 【3】 /U。(分数:2.00)填空项 1:_34.强行排错法涉及的调试技术主要是U 【4】 /U和监视表达式。(分数:2.00)填空项 1:_35.数据库的设计通常可以分为这样 4 个步骤:需求分析、概念设计、U 【5】 /U和物理设计。(分数
15、:2.00)填空项 1:_36.若有以下程序: #include iostream using namespace std; int main() char a; a=H-A+0; coutaend1; return 0; 执行后输出的结果是U 【6】 /U。(分数:2.00)填空项 1:_37.若二维数组 b 有 m 列,则在 bij前的元素的个数为U 【7】 /U。(分数:2.00)填空项 1:_38.若有如下程序段: #include iostream using namespace std; int main() char *p=“abcdefgh“,*r; long *q; q=(l
16、ong *)p;q+; r=(char *)q; coutrend1; return 0; 该程序的输出结果是U 【8】 /U。(分数:2.00)填空项 1:_39.以下程序的输出结果是U 【9】 /U。 #include iostream using namespace std; void fun() static int a=0; a+=2; couta; int main() int CC; for(CC=1;cc4;CC+) fun(); coutend1; return 0; (分数:2.00)填空项 1:_40.假定用户没有给一个名为 MyClass 的类定义析构函数,则系统为其定
17、义的默认析构函数首部形式为U【10】 /U。(分数:2.00)填空项 1:_41.对虚函数的调用有两种方式:U 【11】 /U和U 【12】 /U。(分数:2.00)填空项 1:_42.U【13】 /U使一个函数可以定义成对许多不同数据类型完成同一个任务。(分数:2.00)填空项 1:_43.若有以下程序: #include iostream using namespace std; class Sample private: const int n; public: Sample(int i) :n(i) ) void print() cout“n=“nend1; ; int main()
18、sample a(10); a.print(); return 0; 上述程序运行后的输出结果是U 【14】 /U。(分数:2.00)填空项 1:_44.有以下程序: #include iostream #include fstream using namespace std; int main() ofstream ofile(“D:/test.txt“); if(!ofile) cout“test.txt cant open“end1; return 0; ofile“This book is C+“ “12345end1; ofile.close(); ifstream ifile(“D
19、:/test.txt“); if ( ! ifile) cout“test.txt cant open“end1; return 0; char str80; ifilestr; ifile.close(); coutstrend1; return 1; 程序执行后的输出结果是U 【15】 /U。(分数:2.00)填空项 1:_二级 C+笔试 52 答案解析(总分:88.00,做题时间:90 分钟)一、B选择题/B(总题数:30,分数:60.00)1.若有以下程序: #include iostream using namespace std; class Base private: int a
20、,b; public: Base(int x, int y) a=x; b=y; void show() couta“, “bend1; ; class Derive : public Base private: int c, d; public: Derive(int x,int y, int z,int m):Base(x,y) c=z; d=m; void show() coutc“, “dend1; ; int main () Base b(50,50),*pb; Derive d(10,20,30, 40); pb= pb-show (); return 0; 招待程序后的输出结果是
21、( )。(分数:2.00)A.10,20 B.30,40C.20,30D.50,50解析:解析 本题考核基类指针的使用。本题首先定义了一个基类 Base 和一个由 Base 派生出来的派生类 Derive。在主函数中,定义了一个基类 Base 指针 pb 和基类对象 b,还定义了派生类 Derive 的对象d。然后将派生类对象 d 的地址赋值给指向基类 Base 的指针 pb。由于 Derive 是 Base 的子类型,因此允许上述赋值。但这时指针 pb 只能使用从基类 Base 继承的成员,即当 pb 指向 d 对象时,pb-shaw 还是调用基类 Base 的成员函数 show()。所以程
22、序最后输出的对象 d 中对基类成员的初始化值,即 10,20。2.若有以下程序: #include iostream using namespace Std; class sample int i; publiC: sample() void setvalue(int m) i=m; void fun(int m) i+=m; void disp() coutiend1; ; int main() sample *ps; ps=new sample; ps-setvalue(20); ps-fun(5); ps-disp(); return 0; 程序运行后,输出的结果是( )。(分数:2.0
23、0)A.15B.20C.25 D.30解析:解析 本题考核对象指针的应用。程序首先定义了一个类 sample,其中包含一个私有成员 i 和 3个公有成员函数。函数 setvalue()的功能是给私有成员 i 赋值,函数 fun()的功能是将私有成员 i 的值增加 5,函数 disp()的功能是输出变量 i 的值。在主函数中,先定义了类 sample 的一个对象指针 ps,并申请了一块内存空间。执行语句 ps-setvalue(20);后,类中 i 的值为 20,执行语句 ps-fun(5);后,类中 i 的值为 25。所以程序最后输出 25。3.下面各选项中,属于非法的 C+整型常量的是( )
24、。(分数:2.00)A.01B.0x11C.081 D.-32768解析:解析 C+语言的整型常量可以有三种表示形式: 十进制形式:与日常所用的十进制数形式相同,不能以 0 开始。 八进制形式:以数字 0 开头,由 07 组成。 十六进制形式:以数字 0x(或 OX)开头,由 09 及 AF(或 af)组成。 根据以上知识考查所给出的 4 个选项:选项 A 是一个八进制数;选项 B 是一个十六进制数;选项 D 是一个十进制数;选项 C 以 0 开始没有跟字母 x(X),但后面的数字 8并不是八进制中使用的数字,故它不是 C+语言的整型常量。4.数据是指所有能输入到计算机之中并被计算机程序处理的
25、( )。(分数:2.00)A.文字B.字母C.符号 D.数字解析:解析 数据不是指某一种文字、字母或数字,实际上就是描述事物的符号记录,是抽象的概念。5.在一棵度为 3 的树中,度为 3 的节点有 2 个,度为 2 的节点有 1 个,度为 1 的节点有 2 个,那么,该树的叶节点数目为( )。(分数:2.00)A.4B.5 C.6D.7解析:解析 假设根节点度为零时,叶节点数为 1;若树中每出现一个度为 1 的节点,则叶子数增加 0个;每出现 1 个度为 2 的节点,叶子数增加 1 个;每出现 1 个度为 3 的节点,则叶子数增加 2 个依此类推,每个度为 m 的节点,可增加 m-1 个叶子数
26、。6.若有以下程序: #include iostream using namespace std; class sample private: int x; public: sample() void setx(int i) x=i; friend int fun(sample B,int n) int m=O; for (int i=O; in; i+) if(Bi.xm) m=B i.x; return m; ; int main ( ) sample A10; int arr=90,87,42,78,97,84,60,55,78,65; for (int i=O;i10;i+) Ai.
27、setx (arri);coutfun(A, 10)end1; return 0; 该程序运行后的输出结果是( )。(分数:2.00)A.97 B.84C.90D.78解析:解析 程序中定义了一个类 sample,以及类 sample 的友元函数 fun()。在主函数中,通过 for 循环调用各数组对象中的 setx 成员函数给各个对象的私有数据成员赋值。而函数 fun()的功能是返回各个数组对象中的最大私有成员数据的值。7.若有以下程序: #include iostream using namespace std; class Base public: Base ( ) x=0; int x
28、; ; class Derivedl : virtual public Base public: Derivedl () x=10; ; class Derived2 : virtual public Base public: Derived2 () x=20; ; class Derived : public Derivedl,protected Derived2 ; int main ( ) Derived obj; coutobj .xend1; return 0; 该程序运行后的输出结果是 ( )。(分数:2.00)A.20 B.30C.10D.0解析:解析 本题中,虽然 Derive
29、dl 和 Derived2 都是由共同的基类 x 派生而来的,但由于引入了虚基类,使得它们分别对应基类的不同副本。这时数据成员 x 只存在一份拷贝,不论在类 Derived1 修改,还是在类 Derived2 中修改,都是直接对这惟一拷贝进行操作。本题程序执行语句“Derived obj”时,就会先调用虚基类 Base 的构造函数,使得 x=0,然后执行类 Derived1 的构造函数,使得 x=10,再执行类Derived2 的构造函数,使得 x=20。最后输出 x 的值为 20。8.信息隐蔽的概念与下述哪一种概念直接相关( )。(分数:2.00)A.软件结构定义B.模块独立性 C.模块类型
30、划分D.模块耦合度解析:解析 在面向对象方法中,信息隐蔽是通过对象的封装性来实现的,因此信息隐蔽的概念与模块独立性直接相关,模块独立性越好,则信息隐蔽性越好。9.下列关于软件工程概念的描述中,错误的是( )。(分数:2.00)A.软件工程概念的出现源自软件危机B.软件工程就是试图用工程、科学和数学的原理与方法研制,维护计算机软件的有关技术及管理方法C.软件工程包括 3 个要素,即方法、工具和过程D.软件工程不重视在软件开发过程中应用工程化原则 解析:解析软件工程是个重要概念,考生应在理解的基础上掌握。选项 A、B、C 都是正确的。软件工程强调在软件开发过程中应用工程化原则,选项 D 是错误的。
31、10.设有以下程序段: int a5=0,*p,*q; p=a; q=a; 则下列选项中,合法的运算是( )。(分数:2.00)A.p+qB.p-q C.p*qD.p%q解析:解析本题考核指针的运算。C+语言中,指向同一字符串的指针之间能且只能进行减运算,减运算后返回的是一整型数,表示指针之间的地址偏移量。11.若有以下程序: #include iostream using namespace Std; int main() int i ; int a3 3 = 1,2,3,4,5,6,7,8,9; for(i=0;i3;i+) coutai 1“ “; coutend1; return 0;
32、 执行后的输出结果是( )。(分数:2.00)A.50 53 56 B.49 52 55C.2 5 8D.1 4 7解析:解析 本题考核对二维数组的定义和引用的熟悉程度。解此题时,应该注意以下几点: 要注意给多维数组 a 赋的初值是字符形式的1-9,而不是数值 19。数字 19 与字符19是不相等的。字符19所对应的 ASCII 码值为 4957。 在 C+语言中,字符型数据的 ASCII 码值拿来作为整型数据。所以整型数组 a 的 9 个元素的初值应分别为:49,50,57(字符19的 ASCII 码值)。 for 语句中要求输出 ai1的值,也就是要输出 a01,a11,a213 个值。
33、在 C+语言中的多维数组是按一维数组形式存储的,这 3 个元素的值分别是 50, 53, 56。12.若有以下定义: int a =1,2,3,4,5,6,7; char c1=b,C2=2; 则数值不为 2 的表达式是( )。(分数:2.00)A.a1B.d-c1C.a3-c2D.c2-0 解析:解析 本题考查数组的定义、初始化及其引用,以及对字符 ASCII 码值的熟悉程度。解本题的关键在于熟悉字符的 ASCII 码值。字符在进行数学运算时取其 ASCII 码值,其中b的 ASCII 码值为98,d的 ASCII 码值为 100,字符2的 ASCII 码值为 50。根据以上知识,可知选项
34、D 中表达式“c2-0”的值为 50。13.以下说法中,不正确的是( )。(分数:2.00)A.C+程序中必须有一个主函数 main(),而且是从 main()的第 1 条语句开始执行的B.非主函数都是在执行主函数时,通过函数调用或嵌套调用而得以执行的C.主函数可以在任何地方出现D.主函数必须出现在固定位置。 解析:解析 本题考核的知识点是主函数的位置和作用。一个完整的 C+程序有且仅有一个主函数。程序总是从主函数的第 1 条语句开始执行,到主函数的最后一条语句结束。其他函数都是在执行主函数时,通过函数调用或嵌套调用而得以执行的。 C+规定,主函数可以出现在程序的任何地方。14.下列叙述中,不
35、正确的是( )。(分数:2.00)A.一个数据结构中的元素在计算机存储空间中的位置关系与逻辑关系可能不同 B.一个数据结构中的元素在计算机存储空间中的位置关系与逻辑关系一定不同C.数据的存储结构,也称数据的物理结构。D.数据的存储结构与数据的逻辑结构是不同的解析:解析 一个数据结构中的元素在计算机存储空间中的位置关系与逻辑关系不一定相同,例如在家庭成员的数据结构中,“儿子”和“女儿”都是“父亲”的后件,但在计算机存储空间中,根本不能将“儿子”和“女儿”这两个数据元素的信息都紧邻存放在“父亲”这个数据元素后边。但在一年四季的数据结构中,“春”是“夏”的前件,在计算机存储空间中,就可以把“春”存储
36、在“夏”的前面。数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构,也称数据的物理结构。15.有以下程序: #include iostream using namespace Std; int a; int fun(); int main() extern int a; int b; a = 100; b = fun(); coutbend1; return 0; int fun() extern int a; return (10*A); 其程序运行后的输出结果是( )。(分数:2.00)A.100B.10C.1000 D.10000解析:解析 本题考核外部变量的使用。先来了解外部
37、变量:外部变量用关键词 extern 表示。由于外部变量可以被程序中的所有函数共同访问,其作用域为全局,因此也称为全局变量。 对于外部变量而言,“定义变量”和“说明变量”是两个不同的概念。定义 a 为外部变量是告诉编译程序,a 是一个外部变量,并要求系统为 a 分配一个固定的永久存储空间。a 的值在整个程序的运行期间都存在,只有当定义它的程序运行结束时,它的存储空间才释放。 外部变量定义后,当程序中的函数要引用外部变量时,应在函数中作引用说明。在此程序中,在第二行定义了一个外部变量 a,主函数给外部变量赋的初始值为 100,当调用函数 fun()时,外部变量 a 的值传到函数 fun()中,因
38、此函数所返回的值为 100*10=1000。16.若有如下程序: #include iostream using namespaces std; int s=0; class sample, static int n; public: sample(int i) n=i; static void add() s+=n; ; int sample:s=0; int main() sample a(2),b(5); sample:add(); coutsend1; return 0; 程序运行后的输出结果是( )。(分数:2.00)A.2B.5 C.7D.3解析:解析 本题考核静态数据成员和静态成
39、员函数的应用。程序中定义一个类 sample,它包括一个静态数据成员 n 和一个静态成员函数 add(),并在类的构造函数中给类私有静态数据成员 n 赋值。 在主函数中,定义对象 a(2)时,通过构造函数使静态数据成员 n 的值变为 2,在定义对象 b(5)时,通过构造函数使静态数据成员 n=5(覆盖了前面的 n=2),再执行“sample:add();”使全局变量 s=5。17.下列打开文件的表达式中,错误的是( )。(分数:2.00)A.ofstream ofile; ofilopen(“C:/vc/abtxt“,ios: :binar;B.fstream iofile; iofilope
40、n(“abtxt“,ios:at;C.ifstream ifile(“C:/vc/abtxt“);D.couopen(“C:/vc/abtxt“,ios: :binar; 解析:解析 本题考核文件的打开与关闭。 流可以分为 3 类:输入流、输出流以及输入/输出流,相应地必须将流说明为 ifstream、ofstream 以及 fstream 类的对象。如,说明一个输入流对象“ifstream ifile;”。 说明了流对象后,可使用函数 open()打开文件。文件的打开即是在流与文件之间建立一个连接。open()的函数原型为: void open(const char *filename,in
41、t mode,int port=filebuf:openprot); 其中,filename 是文件名字,它可包含路径说明。mode 说明文件的打开模式。 除了 open()成员函数外,ifstream、ofstream 以及 fstream 3 类流的构造函数也可以打开文件,其参数同 open()函数。例如:“ifstream ifile(“c:/vc/abctxt“);”。 打开的文件使用完毕后,必须使用 close()函数将其关闭。close()函数也是流类的成员函数,它没有参数与返回值,其作用是将缓冲区的内容刷新并撤销流与文件之间的连接。当流对象的生存周期后,相应的析构函数也会将文件关
42、闭。 由此可知,选项 A、B 和 C 的表达式都是正确的。对于选项 D,由于 open 函数并不是 cout 对象中的成员函数,所以对 open()的调用是非法的。18.模板函数的真正代码是在( )时候产生。(分数:2.00)A.源程序中声明函数时B.源程序中定义函数时C.源程序中调用函数时 D.运行执行函数时解析:解析 本题考核模板函数的使用。在说明一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中对象的形参,然后生成一个重载函数。由此可知模板函数的真正代码是在函数调用时产生的。19.有如下程序: #include iostream using
43、namespace std; int b=3; int fun(int *k) int b=2; b=*(k+)*b; return(B) ; int main() int a ;11,12,13,14,15,16); b=fun( class data public: int x; data (int x) data: :x=x; ; class A private: data d1; public: A(int x) : d1 (x) void dispa() coutd1, x“, “; ; class B: public A private: data d2; public: B(in
44、t x) : A(x-1),d2(x) void dispb() coutd2.xend1; ; class C : public B public: C(int x) : B(x-1) void disp () dispa ( ); dispb (); ; int main ( ) C obj (5); obj.disp(); return 0; 程序执行后的输出结果是( )。(分数:2.00)A.5,5B.4,5C.3,4 D.4,3解析:解析 本题考核派生类的定义和访问权限。本题涉及多层次的继承关系。类 B 是类 A 的派生类,类 C 又是类 B 的派生类。类 C 中的构造函数调用了类
45、B 的构造函数来初始化类 B 的私有数据成员,而类 B的构造函数又调用了类 A 的构造函数来初始化类 A 的私有数据成员。由此可知,程序最后的输出为 3,4。二、B填空题/B(总题数:14,分数:28.00)31.在一个有 n 个元素的顺序表的第 i 个元素(1in)之前插入一个新元素时,需要向后移动U 【1】 /U个元素(分数:2.00)填空项 1:_ (正确答案:n-i+1)解析:解析 在一般情况下,要在第 i 个元素之前插入一个新元素时,首先是从最后一个元素开始,直到第 i 个元素之间共 n-i+1 个元素依次向后移动一个位置。32.在面向对象方法中,类之间共享属性和操作的机制称为U 【2】 /U。(分数:2.00)填空项 1:_ (正确答案:继承)解析:解析 继承是面向对象方法的一个重要特征。在面向对象方法中,类之间通过继承关系使得子类共享父类的属性和操作,同时子类还可以有自己的特殊属性和操作。33.源程序文档化要求程序应加注释。注释一般分为序言性注释和U 【3】