1、二级 C+笔试 357 及答案解析(总分:100.00,做题时间:90 分钟)一、B选择题/B(总题数:35,分数:70.00)1.以下不能作为输出流对象的是(分数:2.00)A.文件B.内存C.键盘D.显示器2.以下的 for 循环 for(x0,y=0,(y! =123)x+);(分数:2.00)A.是无限循环B.循环次数不定C.最多执行 4 次D.最多执行 3 次3.以下不能够读入空格字符的语句是(分数:2.00)A.char line; lineciget()B.char line; ci get(lin;C.char line; cinline;D.char line2; ci ge
2、tline(line,2);4.在结构化分析方法中,数据字典的作用是(分数:2.00)A.存放所有需要处理的原始数据B.存放所有处理的结果C.存放所有的程序文件D.描述系统中所用到的全部数据和文件的有关信息5.对于常数据成员,下面描述正确的是(分数:2.00)A.常数据成员可以不初始化,并且不能更新B.常数据成员必须被初始化,并且不能更新C.常数据成员可以不初始化,并且可以被更新D.常数据成员必须被初始化,并且可以被更新6.下述说法错误的是(分数:2.00)A.对象之间不可以相互赋值B.对象可以用作函数参数C.对象可以用作数组的元素D.对象可以用作另一对象的成员7.关于 const 修饰符的说
3、法中,错误的是(分数:2.00)A.const 既可以修饰成员函数,也可以修饰数据成员,还可以修饰对象B.若 const 修饰了一个对象,则该对象中的所有数据成员都无法被更新C.常对象无法调用一般成员函数D.常成员函数只能被常对象调用,不能被一般对象调用8.当使用 fstram 流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为(分数:2.00)A.ios:inB.ios:outC.ios:int | ios:outD.没有9.以下有关类与结构体关系的叙述不正确的是(分数:2.00)A.结构体中只包含数据;类中封装了数据和操作B.结构体的成员对外界通常是开放的;类的成员可以被隐蔽C.
4、用 struct 不能声明一个类型名;而 class 可以声明一个类名D.结构体成员默认为 Public;类成员默认为 private10.假定 a 为一个整型数组名,则元素 a4的字节地址为(分数:2.00)A.a+4B.a+8C.a+16D.a+3211.在多继承中,公用派生和私有派生对于基类成员在派生类中的可访问性与单继承规则(分数:2.00)A.完全相同B.完全不同C.部分相同,部分不同D.以上都不对12.以下不属于构造函数特征的是。(分数:2.00)A.构造函数名与类名相同B.构造函数可以重载C.构造函数可以设置默认参数D.构造函数必须指定函数类型13.设有定义 char str80
5、;以下不能将输入数据 first/nsecond/nCR读取到数组 str 中的语句是(分数:2.00)A.ciget(str, strlen(st);B.cigetline(str,strlen(st);C.cinstr;D.ciread(str, strlen(st);14.以下叙述正确的是(分数:2.00)A.派生类中不可以定义与基类中同名的成员变量B.派生类中不可以重载成员函数C.派生类中不能调用基类中的同名函数D.以上三项均不正确15.设 A 为 test 类的对象且赋有初值,赋值符号已经重载,则语句 test B=A;表示(分数:2.00)A.语法错B.为对象 A 定义一个别名C.
6、将对象 A 复制给对象 BD.仅说明 B 和 A 属于同一个类16.对下列二叉树进行后序遍历的结果是 (分数:2.00)A.ZBTYCPXAB.ATBZXCYPC.ZBTACYXPD.ATBZXCPY17.已知语句 int m10;则下列引用的表示中正确的是(分数:2.00)A.int B.int C.int D.float 18.如果一个类含有一个以上的纯虚函数,则称该类为(分数:2.00)A.虚基类B.抽象类C.派生类D.以上都不对19.设有如下关系表: (分数:2.00)A.T=RSB.T=RSC.TRSD.tR/S20.下列数据结构中具有记忆作用的是(分数:2.00)A.栈B.队列C.
7、有序表D.二又树21.重载函数在调用时选择的依据中,错误的是(分数:2.00)A.函数的参数名称B.参数的类型C.函数的名字D.函数的类型22.设有以下类的定义: class Ex int x; public: void setx(int t=0); ; 若在类外定义成员函数setx(),以下定义形式中正确的是(分数:2.00)A.void setx(int .B.void Ex: :setx(int .C.Ex: :void setx(int .D.void Ex: :setx().23.在长度为 n 的有序线性表中进行二分查找,需要的比较次数为(分数:2.00)A.log2nB.nlog2
8、nC.n/2D.(n+1)/224.下列各类函数中,不是类的成员函数的是(分数:2.00)A.构造函数B.析构函数C.友元函数D.拷贝构造函数25.下列能对对象进行初始化的是(分数:2.00)A.构造函数B.析构函数C.友元函数D.静态成员函数26.语句 cout(a=2) (分数:2.00)A.49.5B.9.5C.22.0D.45.031.程序设计方法要求在程序设计过程中(分数:2.00)A.先编制出程序,经调试使程序运行结果正确后再画出程序的流程图B.先编制出程序,经调试使程序运行结果正确后再在程序中的适当位置处加注释C.先画出流程图,再根据流程图编制出程序,最后经调试使程序运行结果正确
9、后再在程序中的适当位置处加注释D.以上三种说法都不对32.已知类 A 有公用数据成员 a,并重载了=运算符,且有 A obj2;const A * ptr= new A;则下列语句错误的是(分数:2.00)A.ptr-a=100;B.ptrC.ptr+;D.obj2=*ptr;33.在下列数据管理的各阶段中,数据独立性最高的阶段是(分数:2.00)A.手工管理B.文件系统C.数据项管理D.数据库系统34.已知 int a, b;用语句 scanf(“%d%d“, “语句后得到的输出结果为U 【6】 /U。(分数:2.00)填空项 1:_42.下列函数的功能是U 【7】 /U。 #include
10、iostream. h int Func(int a,int b) if (ab) return 1; else if(a=b) return 0; else return -1; (分数:2.00)填空项 1:_43.根据三角形的基本定理完成填空,则表达式为U 【8】 /U。 #includeiostream. h #includemath. h void main() double a,b,c,s,area; cout“请输入三角形三边a,b,c:“end1; cinabc; if(_) s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)* (s-c), cout“三
11、角形的面积为:“area; else cout“不能构成三角形!“end1; (分数:2.00)填空项 1:_44.下列程序的运行结果为U 【9】 /U。 #includeiostream, h void main( ) int i; for(i=1; i6;i+)if(i=3) break: com“i=“iend1; (分数:2.00)填空项 1:_45.下列程序编译错误,因为 add 函数返回值是一个引用,故对 return 后返回值的要求是U 【10】 /U。 #includeiostream. h int void main( ) int i=3,j=19; cout(add(i,j
12、)+ =20)end1; (分数:2.00)填空项 1:_46.在下面的类定义中,this 指针的用途是U 【11】 /U。 #include iostream. h class Sample int x,y; public: Sample(int i,int j)x=i;y=j; void asstgn(Sample sa): ; void Sample: :assign(Sample p) if (this! = y=p.y; (分数:2.00)填空项 1:_47.参照函数模板的写法,完成非模板函数的定义,语句为U 【12】 /U。 #includeiostream, h #include
13、string. h templateclass T T min(T a, T b) return(ab? a:b); char * min(char * a, char * b) _ void main() double a=1.23,b=3.45; char s1=“abcd“,s2=“erg“; coutmin(a, b)min(s1,s2)end1: (分数:2.00)填空项 1:_48.下列程序中的 this 指针的作用是U 【13】 /U。 #include iostream. h class Sample int n; static int st; public, Sample()
14、 Sample(int m) n=m; st=m+10; void Change(int k) st=st+k; void AddValue(int m) Sample s, s. n=n+m; *this=s; void disp( ) cout“n=“n“;st=“stend1; ; int Sample: :st=0 void main() Sample s1(10),s2(10) s1. disp() s1. AddValue(5), s2. Change(100); s1. disp(); s2. disp() (分数:2.00)填空项 1:_49.下列程序的运行结果为U 【14】
15、/U。 #include iostream. h class myclass private: int a, b, c; public: void fun() int a; a=10; this-,a=5; b=6; this-c=7; cout“a=“a“,this-a=“this-aendl; ; void main() myclass obj1; obj1.fun() (分数:2.00)填空项 1:_50.下列程序的运行结果是U 【15】 /U。 #includeiostream, h class Sample int a; public: Sample(int aa=0) a=aa;
16、Sample() cout“Sample=“a; class Derived: public Sample int b; public: Derived(int aa=0, int bb=0): Sample(aa) b=bb; De rived() cout “Derived=“b; void main() Derived dl (9) (分数:2.00)填空项 1:_二级 C+笔试 357 答案解析(总分:100.00,做题时间:90 分钟)一、B选择题/B(总题数:35,分数:70.00)1.以下不能作为输出流对象的是(分数:2.00)A.文件B.内存C.键盘 D.显示器解析:解析 输出
17、流对象包括基本的输出设备,如显示器,内存和文件,而输入流对象则包括键盘,文件以及其他输入设备。2.以下的 for 循环 for(x0,y=0,(y! =123)x+);(分数:2.00)A.是无限循环B.循环次数不定C.最多执行 4 次 D.最多执行 3 次解析:解析 本题考察 for 循环的三个表达式的用法及其执行顺序,本题中 for 循环的第三个表达式完成变量自增,以控制 for 循环的执行次数。3.以下不能够读入空格字符的语句是(分数:2.00)A.char line; lineciget()B.char line; ci get(lin;C.char line; cinline; D.
18、char line2; ci getline(line,2);解析:解析 本题考察 cin 流对象的几种成员函数 get,getline 的使用规则。流提取符在提取字符时,遇到 C+规定的分隔符如空格,回车和 Tab 键时自动分割,故本题正确答案为 C。4.在结构化分析方法中,数据字典的作用是(分数:2.00)A.存放所有需要处理的原始数据B.存放所有处理的结果C.存放所有的程序文件D.描述系统中所用到的全部数据和文件的有关信息 解析:解析 在结构化分析方法中,数据字典的作用是描述系统中所用到的全部数据和文件的有关信息。5.对于常数据成员,下面描述正确的是(分数:2.00)A.常数据成员可以不
19、初始化,并且不能更新B.常数据成员必须被初始化,并且不能更新 C.常数据成员可以不初始化,并且可以被更新D.常数据成员必须被初始化,并且可以被更新解析:解析 常数据成员不能背更新,因此可以排除选项 C 和 D。常数据成员所包含的值不能被更新,所以必须被初始化,如果初始化则常数据成员里的随机值是没有实际意义的6.下述说法错误的是(分数:2.00)A.对象之间不可以相互赋值 B.对象可以用作函数参数C.对象可以用作数组的元素D.对象可以用作另一对象的成员解析:解析 如果重载了赋值运算符后,对象之间是可以赋值的,对象如 C+中其他内置的数据类型一样,可以作为函数参数、数组元素,其他对象的成员存在。7
20、.关于 const 修饰符的说法中,错误的是(分数:2.00)A.const 既可以修饰成员函数,也可以修饰数据成员,还可以修饰对象B.若 const 修饰了一个对象,则该对象中的所有数据成员都无法被更新C.常对象无法调用一般成员函数D.常成员函数只能被常对象调用,不能被一般对象调用 解析:解析 本题考察 const 修饰符的含义及其修饰不同对象的规则。常对象既能被常对象调用,也能被一般对象调用,一旦 const 修饰了一个对象,则对象的所有数据成员都无法更新。8.当使用 fstram 流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为(分数:2.00)A.ios:inB.ios:o
21、utC.ios:int | ios:outD.没有 解析:解析 C+中没在规定文件打开时的隐含打开方式,因此考生在写程序是必须指定打开方式,否则将出现错误。9.以下有关类与结构体关系的叙述不正确的是(分数:2.00)A.结构体中只包含数据;类中封装了数据和操作B.结构体的成员对外界通常是开放的;类的成员可以被隐蔽C.用 struct 不能声明一个类型名;而 class 可以声明一个类名 D.结构体成员默认为 Public;类成员默认为 private解析:解析 可以说类来源于结构体,两者有相似之处。但类的功能更强大一些,不仅增加了操作,还能够隐藏和包含其成员变量或成员函数。10.假定 a 为一
22、个整型数组名,则元素 a4的字节地址为(分数:2.00)A.a+4B.a+8C.a+16 D.a+32解析:解析 注意:VC 编译器分配给整数的内存是 4 字节。11.在多继承中,公用派生和私有派生对于基类成员在派生类中的可访问性与单继承规则(分数:2.00)A.完全相同 B.完全不同C.部分相同,部分不同D.以上都不对解析:解析 C+语言中为了简化继承关系,规定多重继承中可访问性规则同单继承规则。12.以下不属于构造函数特征的是。(分数:2.00)A.构造函数名与类名相同B.构造函数可以重载C.构造函数可以设置默认参数D.构造函数必须指定函数类型 解析:解析 构造函数和析构函数一样,是类的特
23、殊的成员函数。其特殊之处在于,构造函数可以有多个版本以实现不同的初始化方式,不能指定形参和函数类型,这些都是系统默认完成。13.设有定义 char str80;以下不能将输入数据 first/nsecond/nCR读取到数组 str 中的语句是(分数:2.00)A.ciget(str, strlen(st);B.cigetline(str,strlen(st);C.cinstr;D.ciread(str, strlen(st); 解析:解析 本题考察 cin 流对象的几种成员函数 get,getline,read 及流提取符的使用规则。14.以下叙述正确的是(分数:2.00)A.派生类中不可以
24、定义与基类中同名的成员变量B.派生类中不可以重载成员函数C.派生类中不能调用基类中的同名函数D.以上三项均不正确 解析:解析 派生类和基类之间的关系比较重要,派生类不仅可以定义同名的成员变量,还可以调用或重载基类的同名函数,这是类的多态性的基础。15.设 A 为 test 类的对象且赋有初值,赋值符号已经重载,则语句 test B=A;表示(分数:2.00)A.语法错B.为对象 A 定义一个别名C.将对象 A 复制给对象 B D.仅说明 B 和 A 属于同一个类解析:解析 同上题。16.对下列二叉树进行后序遍历的结果是 (分数:2.00)A.ZBTYCPXA B.ATBZXCYPC.ZBTAC
25、YXPD.ATBZXCPY解析:解析 按照二叉树后序遍历的方法:在访问根结点;遍历左子树与遍历右于树这三者中,首先遍历左子树,然后遍历右于树,最后访问根结点;并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点对本题中的二叉树进行后序遍历的结果应是 ZBTYCPXA。17.已知语句 int m10;则下列引用的表示中正确的是(分数:2.00)A.int B.int C.int D.float 解析:解析 本题考察引用的定义既使用。引用是 C+中新引入的概念,其使用方法同变量,而其本质同指针,具有指针的灵活性。引用必须用变量进行赋值,不能用常量或常数。18.如果一个类含有一
26、个以上的纯虚函数,则称该类为(分数:2.00)A.虚基类B.抽象类 C.派生类D.以上都不对解析:解析 纯虚函数一般提供派生类进行继承的参考,是多态性的重要保证,一个具有纯虚函数的类称为抽象类,抽象类可以具有其他类的特点,但不能实例化,其主要目的是作为派生类的基类存在,处于类层次的高层。19.设有如下关系表: (分数:2.00)A.T=RSB.T=RS C.TRSD.tR/S解析:解析 显然,关系表 T 是关系表 R 与 S 的并,即 T=RS。20.下列数据结构中具有记忆作用的是(分数:2.00)A.栈 B.队列C.有序表D.二又树解析:解析 栈是按照“先进后出”(FILO-First In
27、 Last Out)或“后进先出”(LIFO-Last In First Out)的原则组织数据的,因此,栈也被称为“先进后出”表或“后进先出”表。因此,栈具有记忆作用。21.重载函数在调用时选择的依据中,错误的是(分数:2.00)A.函数的参数名称 B.参数的类型C.函数的名字D.函数的类型解析:解析 是否是重载函数,需要给编译器提供足够的信息判断。其主要的依据是函数韵名字,参数的类型,函数的返回值类型。22.设有以下类的定义: class Ex int x; public: void setx(int t=0); ; 若在类外定义成员函数setx(),以下定义形式中正确的是(分数:2.00
28、)A.void setx(int .B.void Ex: :setx(int . C.Ex: :void setx(int .D.void Ex: :setx().解析:解析 选项 A 可以排除,原因是类的成员函数的定义必须用域作用符:进行限定,选项 C 的限定位置不对,函数的类型应在最前面。根据上下文可以指导,setx 为单参成员函数,在定义时也必须指定参数,因此选项 D 也可以排除,正确答案为 B。23.在长度为 n 的有序线性表中进行二分查找,需要的比较次数为(分数:2.00)A.log2n B.nlog2nC.n/2D.(n+1)/2解析:解析 在长度为 n 的有序线性表中进行二分查找
29、,需要的比较次数为 log2n。24.下列各类函数中,不是类的成员函数的是(分数:2.00)A.构造函数B.析构函数C.友元函数 D.拷贝构造函数解析:解析 构造函数包括默认构造函数和拷贝构造函数等,析构函数和构造函数一样属于类的特殊的成员函数而友元函数则是为了增加类的访问灵活行而允许其他类的成员函数或全局函数访问类的内部变量或成员函数的一种机制,其缺点是破坏了类的封装性。25.下列能对对象进行初始化的是(分数:2.00)A.构造函数 B.析构函数C.友元函数D.静态成员函数解析:解析 类的构造函数的作用就是在类实例化对象时,即对象还没有生成时完成一些初始化的工作。此时,析构函数和静态成员函数
30、都还没有建立,而友元函数是类外部的函数根本无法完成类的实例化工作。26.语句 cout(a=2) (分数:2.00)A.49.5B.9.5 C.22.0D.45.0解析:解析 本题考察宏定义的使用,宏在使用是如同函数一样,但却是在编译时展开,而函数却是在运行时进行计算的。31.程序设计方法要求在程序设计过程中(分数:2.00)A.先编制出程序,经调试使程序运行结果正确后再画出程序的流程图B.先编制出程序,经调试使程序运行结果正确后再在程序中的适当位置处加注释C.先画出流程图,再根据流程图编制出程序,最后经调试使程序运行结果正确后再在程序中的适当位置处加注释D.以上三种说法都不对 解析:解析 在
31、程序设计过程中,一个很重要的环节是首先确定实现各种功能的算法,并且用某种工具将它精确地表达出来。流程图是其中的工具之一。因此,程序设计的过程应是先画出流程图,然后根据流程图编制出程序。因此,选项 A 中的说法是错误的。 程序中的注释是为了提高程序的可读性,使程序易于理解、易于维护,注释必须在编制程序的同时加入。因此,选项 B 和 C 中的说法也都是错误的。32.已知类 A 有公用数据成员 a,并重载了=运算符,且有 A obj2;const A * ptr= new A;则下列语句错误的是(分数:2.00)A.ptr-a=100; B.ptrC.ptr+;D.obj2=*ptr;解析:解析 本
32、题考察 const 修饰符的作用。注意;const 位置不同,其修饰的部分也是不同的。本题中 const 修饰的是 ptr 所指的对象本身,所以,ptr 是可以重新指向新的对象,而 ptr-a 则无法被更新。33.在下列数据管理的各阶段中,数据独立性最高的阶段是(分数:2.00)A.手工管理B.文件系统C.数据项管理D.数据库系统 解析:解析 显然,在数据库系统阶段,数据独立性最高。34.已知 int a, b;用语句 scanf(“%d%d“, “语句后得到的输出结果为U 【6】 /U。(分数:2.00)填空项 1:_ (正确答案:C)解析:解析 本题考察强制类型转化,char()在这里作为
33、一个强制类型转化函数存在,将整数转化为字符。42.下列函数的功能是U 【7】 /U。 #includeiostream. h int Func(int a,int b) if (ab) return 1; else if(a=b) return 0; else return -1; (分数:2.00)填空项 1:_ (正确答案:比较两个整数 a 和 b 的大小,若 ab 则返回 1,若 a 等于b,则返回 0,否则返回-1。)解析:43.根据三角形的基本定理完成填空,则表达式为U 【8】 /U。 #includeiostream. h #includemath. h void main() d
34、ouble a,b,c,s,area; cout“请输入三角形三边a,b,c:“end1; cinabc; if(_) s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)* (s-c), cout“三角形的面积为:“area; else cout“不能构成三角形!“end1; (分数:2.00)填空项 1:_ (正确答案:a0 for(i=1; i6;i+)if(i=3) break: com“i=“iend1; (分数:2.00)填空项 1:_ (正确答案:i3)解析:解析 本题考察考生的 for 语句和 if 语句综合使用能力。本题的情况适用于希望在满足指定值时停止循
35、环的情况。45.下列程序编译错误,因为 add 函数返回值是一个引用,故对 return 后返回值的要求是U 【10】 /U。 #includeiostream. h int void main( ) int i=3,j=19; cout(add(i,j)+ =20)end1; (分数:2.00)填空项 1:_ (正确答案:不能是表达式)解析:解析 引用是变量的别名,其实质是变量的地址。return 在返回值时,如果其后为表达式,则系统为该表达式生成一个临时变量用于存放该表达式的结果,函数执行完毕之后该变量被系统回收,因此,返回的该变量的地址对调用函数来说已经没有意义了。46.在下面的类定义中
36、,this 指针的用途是U 【11】 /U。 #include iostream. h class Sample int x,y; public: Sample(int i,int j)x=i;y=j; void asstgn(Sample sa): ; void Sample: :assign(Sample p) if (this! = y=p.y; (分数:2.00)填空项 1:_ (正确答案:防止对类对象自己给自己赋值)解析:解析 防止对象给自己赋值,这是一种自毁行为,这种行为如果不加以判断,可能造成无意识的破坏。47.参照函数模板的写法,完成非模板函数的定义,语句为U 【12】 /U。
37、 #includeiostream, h #includestring. h templateclass T T min(T a, T b) return(ab? a:b); char * min(char * a, char * b) _ void main() double a=1.23,b=3.45; char s1=“abcd“,s2=“erg“; coutmin(a, b)min(s1,s2)end1: (分数:2.00)填空项 1:_ (正确答案:return(strcmp(a,b)0? a:b);)解析:解析 由于对于两个变量的比较来说,字符间的比较不同于整型或浮点剩变量那样可以
38、直接比较,而是要采用专用函数进行,因此不能采用同一个函数模板,所以本题采用的就是单独写成一个非模板函数。48.下列程序中的 this 指针的作用是U 【13】 /U。 #include iostream. h class Sample int n; static int st; public, Sample() Sample(int m) n=m; st=m+10; void Change(int k) st=st+k; void AddValue(int m) Sample s, s. n=n+m; *this=s; void disp( ) cout“n=“n“;st=“stend1; ;
39、 int Sample: :st=0 void main() Sample s1(10),s2(10) s1. disp() s1. AddValue(5), s2. Change(100); s1. disp(); s2. disp() (分数:2.00)填空项 1:_ (正确答案:修改本对象的值)解析:解析 本题巧妙的使用 this 指针来完成类的不同实例进行的修改自身数据成员的操作。49.下列程序的运行结果为U 【14】 /U。 #include iostream. h class myclass private: int a, b, c; public: void fun() int
40、a; a=10; this-,a=5; b=6; this-c=7; cout“a=“a“,this-a=“this-aendl; ; void main() myclass obj1; obj1.fun() (分数:2.00)填空项 1:_ (正确答案:a=10, this-a=5)解析:解析 本题考察在类的成员函数定义中,如果出现类的数据成员和成员函数的局部变量同名的情况下,如何正确引用合适的变量或数据成员。本题巧妙的采用了 this 指针完成这种标识。50.下列程序的运行结果是U 【15】 /U。 #includeiostream, h class Sample int a; public: Sample(int aa=0) a=aa; Sample() cout“Sample=“a; class Derived: public Sample int b; public: Derived(int aa=0, int bb=0): Sample(aa) b=bb; De rived() cout “Derived=“b; void main() Derived dl (9) (分数:2.00)填空项 1:_ (正确答案:Derived=0 Sample=9)解析:解析 本题考察派生类和基类的构造函数,析构函数的执行顺序。