1、二级 C+模拟 492 及答案解析(总分:169.00,做题时间:90 分钟)一、选择题(总题数:40,分数:69.00)1.下面有关类模板的说法中不正确的是 _ 。(分数:2.00)A.类模板的成员函数都是模板函数B.类模板本身在编译中不会生成任何代码C.类模板只是虚拟类型的参数D.用类模板定义一个对象时,不能省略实际参数2.关于纯虚函数,下列表述中正确的是_。(分数:1.00)A.纯虚函数是没有给出实现版本(即无函数体定义)的虚函数B.纯虚函数的声明总是以“=0”结束C.派生类必须实现基类的纯虚函数D.含有纯虚函数的类不可能是派生类3.有以下程序: class Date public: D
2、ate(int y,int m,int d); year=y; month=m; day=d; Date(int y=2000) year=y; month=10; day=1; Date(Dated) year=d.year; month=d.month; day=d.day; void print() coutyear“.“month“.“dayendl; private; int year,month,day; ; Date fun(Date d) Date temp; temp=d; return temp; int main() Date date1(2000,1,1),daie2(
3、0,0,0); Date date3(date1); date2=fun(date3); return 0; 程序执行时,Date 类的拷贝构造函数被调用的次数是_。(分数:2.50)A.2B.3C.4D.54.关于关键字 class 和 typename,下列表述中正确的是_。(分数:1.00)A.程序中的 typename 都可以替换为 classB.程序中的 class 都可以替换为 typenameC.在模板形参表中只能用 typename 来声明参数的类型D.在模板形参表中只能用 class 或 typename 来声明参数的类型5.下列关于队列的叙述中正确的是(分数:1.00)A.
4、在队列中只能插入数据B.在队列中只能删除数据C.队列是先进先出的线性表D.队列是先进后出的线性表6.下面对静态数据成员的描述中,正确的是_。(分数:1.00)A.静态数据成员可以在类体内进行初始化B.静态数据成员不可,以被类的对象调用C.静态数据成员不能受 private 控制符的作用D.静态数据成员可以直接用类名调用7.下列选项,不正确的是_。(分数:1.00)A.for(int a=1; a=10; a+);B.int a=1;doa+; while(a=10);C.int a=1;while(a=10)a+;D.for(int a=1; a=10; a+)a+;8.有如下类声明: cla
5、ss Foo int bar; ; 则 Foo 类的成员 bar 是(分数:2.00)A.公有数据成员B.公有成员函数C.私有数据成员D.私有成员函数9.下面属于黑盒测试方法的是_。(分数:2.50)A.基本路径测试B.等价类划分C.判定覆盖测试D.语句覆盖测试10.有如下程序: #include iostream using namespaee std; int main() void function( double val) ; double val; function(val) ; cout val ; return 0 ; void function( double val) val
6、 =3; 编译运行这个程序将出现的情况是 _ 。(分数:1.00)A.编译出错,无法运行B.输出:3C.输出:3.0D.输出一个不确定的数11.有如下程序: int x=3; do x-=2; coutx; while(!(-x); 执行这个程序的输出结果是_。(分数:1.00)A.1B.30C.1-2D.死循环12.下列字符串中不能作为 C+标识符使用的是_。(分数:1.00)A.IN25B.testC._1481D.12313._ 复审应该把重点放在系统的总体结构、模块划分、内外接口等方面。(分数:2.00)A.详细设计B.系统设计C.正式D.非正式14.有如下程序: #includeio
7、stream using namespace std; class Media public: void Name(); void Show(); protected: int page; ; class Book:private Media public: void Print() coutpageendl; void Show()Media:Show();) / ; int main() Book Bible; Bible.Name(); / Bible.Print(); / Bible.Show(); / return 0; 编译时有错误的是_。(分数:2.00)A.语句B.语句C.语句
8、D.语句15.下面关于函数模板的表述中不正确的是_。(分数:2.50)A.类模板的成员函数都是模板函数B.类模板本身在编译过程中不会产生任何代码C.类模板只能有虚拟类型的参数D.用类模板定义一个对象时,实参不能省略16.有如下类定义: class B public: void funl() private: void fun2() protected: void fun3() ; class D: public B protected: void fun4() ; 若 obj 是类 D 的对象,则下列语句中不违反访问控制权限的是_。(分数:1.00)A.obj.funl();B.obj.fun
9、2();C.obj.fun3();D.obj.fun4();17.重载输入流运算符“”必须使用的原型为_。(分数:2.50)A.istreamB.istreamC.istream operator(istream,类名D.类名operator(istream18.考虑函数原型 void test(int a,int b=7,char z=“*7“),下面的函数调用中,属于不合法调用的是_。(分数:1.00)A.test(5);B.test(5,8);C.test(6,“#“);D.test(0,0,“*“);19.下列有关运算符重载的叙述中,正确的是_。(分数:1.00)A.运算符重载是多态性
10、的一种表现B.C+中可以通过运算符重载创造新的运算符C.C+中所有运算符都可以作为非成员函数重载D.重载运算符时可以改变其结合性20.以下选项中,不能正确赋值的是 _ 。(分数:2.00)A.char s110;s1=“Ctest“;B.char s2=“C“,“t“,“e“,“s“,“t“);C.char s320=“Ctest“;D.char* s4=“Ctest/n“;21.有如下程序: #includeiostream using namespace std; class BASE public: BASE()cout“BASE“; ; class DERIVED:public BAS
11、E public: DERIVED()cout“DERIVED“; ; int main()DERIVED x;return 0; 执行后的输出结果是_。(分数:3.00)A.BASEB.DERJVEDC.BASEDERIVEDD.DERIVEDBASE22.有如下程序: #includeiostream using namespace std; class Part public: Part(int x=0): val(x) coutval; Part() coutval; private: int val; ; class Whole public: whole(int x, int y,
12、 int z=0): p2(x), p1(y), val(z) coutVal; Whole() coutval; private: Part p1, p2; int val; ; int main() Whole obj(1, 2, 3); return 0; 执行这个程序的输出结果是_。(分数:1.00)A.123321B.213312C.213D.12312323.有如下类定义: class Point int x_,y_; public: Point( ):x_(0),y_(0) Point(int x,int y=0):x_(x),y_(y) ; 若执行语句: Point a(2),
13、b3,*c4; 则 Point 类的构造函数被调用的次数是(分数:2.00)A.2 次B.3 次C.4 次D.5 次24.下列关于运算符重载不正确的是_。(分数:1.00)A.运算符重载不能改变运算符的操作数个数B.运算符重载不能改变运算符的优先级C.运算符重载不能改变运算符的结合性D.运算符重载能改变对预定义类型数据的操作方式25.有如下定义: int a5=1, 3, 5, 7, 9, *P=a; 下列表达式中不能得到数值 5 的是_。(分数:1.00)A.a2B.a3C.*(P+2)D.*P+426.有如下程序: #includeiostream #includeiomanip usin
14、g namespace std; int main() coutsetfill(“#“)setw(4)“OK“123endl; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.#OK123B.#OK#123C.OK#123D.OK#123#27.下列程序的执行结果为_。 #includeiostream. h void main() int a=3, b=0; int*P= b=+a+; cout*P“,“bendl;(分数:1.00)A.3, 4B.4, 3C.3, 4D.4, 428.有如下程序: #includeiostream using namespace st
15、d; class Point public: static int number; public: Point() number+; Point() number -; ; int Point:number=0; int main() Point *ptr; Point A, B; Point *ptr_point=new Point3; ptr=ptr_point; Point C; coutPoint:numberendl; deleteptr; return 0; 执行这个程序的输出结果是_。(分数:1.00)A.3B.4C.6D.729.若有定义“int a23;”,下列选项中对 a
16、数组元素正确引用的是_。(分数:2.50)A.a2!1B.a23C.a03D.a12!130.下列关于类定义的说法中,正确的是_。(分数:2.00)A.类定义中包括数据成员和函数成员的声明B.类成员的缺省访问权限是保护的C.数据成员必须被声明为私有的D.成员函数只能在类体外进行定义31.下列关于运算符重载的描述中,错误的是_。(分数:2.50)A.:运算符不能重载B.类型转换运算符只能作为成员函数重载C.将运算符作为非成员函数重载时必须定义为友元D.重载口运算符应完成“下标访问”操作32.己知类 X 是类 Y 的友元,类 Y 是类 Z 的友元,则 _。(分数:2.00)A.类 X 一定是类 Z
17、 的友元B.类 Z 一定是类 X 的友元C.类 Z 的成员函数可以访问类 Y 的对象的任何成员D.类 K 的成员函数可以访问类 Y 的对象的任何成员33.设有以下定义和程序: #includeiostream.h classA1 public: void show1() cout“classA1”end1; ; classA2:public A1 public: void show2() cout“classA2“end1; ; class A3:protected A2 public: voidshow3() cout“class A1”end1; ; void main() A1obj1;
18、 A2obj2; A3obj3; 则以下不合语法的调用语句是(分数:1.00)A.obj1show1();B.obj2show1();C.obj3show1();D.obj2show2();34.若执行下面的程序时,从键盘上输入 5 和 2,则输出结果是_。 # includeiostream.h void main() int a,b,k; cinab; k=a; if(ab) k=a%b; else k=b%a; coutkendl;(分数:2.50)A.5B.3C.2D.035.关于类模板,下列表述中不正确的是_。(分数:3.00)A.类模板中声明的类称为模板类B.类模板只能有虚拟类型参
19、数C.类模板本身在编译中不会生成任何代码D.类模板的成员函数都是模板函数36.为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定义为_。(分数:2.00)A.publicB.protectedC.privateD.static37.有如下程序: #includeiostream using namespace std; class Point public: Point(int xx=0,int yy=0):x(xx),y(yy) void SetX(int xx)x=xx; void SetY(int yy)y=yy; private: int x,y; ; c
20、lass Circle:Point public: Circle(int r):radius(r) int GetRadius()return radius; private: void SetRadius(int r)radius=r; int radius; ; int main() Circle c1(5); c1.SetX(1); / c1.SetY(2); / c1.SetRadius(10); / coutc1.GetRadius(); / return 0; 在标注号码的语句行中不存在语法错误的是_。(分数:1.00)A.B.C.D.38.同一概念在一处为实体而在另一处为属性或联
21、系的冲突在视图集成中称为_。(分数:2.50)A.命名冲突B.概念冲突C.域冲突D.约束冲突39.下列选项合法的标识符是_。(分数:2.50)A.1_1B.1-1C._11D.1_ _40.有以下类定义 class MyClass private: int id; char gender, char*phone; public: MyClass():id(0),gender(“#“),phone(NULL) MyClass(int no,char ge=“#“,char*ph=NUl1.) id=no;gende=ge;phone=ph; ; 下列类对象定义语句中错误的是_。(分数:2.50)
22、A.MyClass myObj;B.MyClass myObj(11,“13301111155“);C.MyClass myObj(12,“m“);D.MyClass myObj(12);二、基本操作题(总题数:1,分数:30.00)41.使用 VC+6.0 打开 下的源程序文件 1.cpp,该程序运行时有错,请改正错误,使得程序正确执行,并且输出以下语句: TC1: 0 TC2 注意:不要改动 main 函数,不能增加或删除行,也不能更改程序的结构,错误的语句在/*error*的下面。 试题程序: #includeiostream.h struct TC1 TC1(int i=0) m_i=
23、i; void print() cout“TC1:“m_iendl; int m_i; ; class TC2 public: TC2() void print() cout“TC2“endl; /*error* private: TC2() ; int main() /*error* TC1 obj1(); /*error* TC2 obj2(); obj1.print(); obj2.print(); return 0; (分数:30.00)_三、简单应用题(总题数:1,分数:30.00)42.使用 VC+6.0 打开 下的源程序文件 2.cpp。完成 fun()函数,其功能是:求出 M
24、行 N 列二维数组每行元素中的最小值,并计算它们的和。和通过形参传回主函数并输出。 注意:不能修改程序的其他部分,只能修改 fun()函数。 试题程序: #include iostream.h #define M 2 #define N 4 void fun(int aMN,int *sum) void main() int xMN=7,6,5,2,4,2,8,3; int s; fun(x, coutsendl; return; (分数:30.00)_四、综合应用题(总题数:1,分数:40.00)43.请使用 VC6 或使用【答题】菜单打开 proj3 下的工程 proj3,其中包含了类 I
25、ntegerSet 和主函数main 的定义。一个 IntegerSet 对象就是一个整数的集合,其中包含 0 个或多个无重复的整数;为了便于进行集合操作,这些整数按升序存放在成员数组 elem 的前若干单元中。成员函数 add 的作用是将一个元素添加到集合中(如果集合中不存在该元素),成员函数 remove 从集合中删除指定的元素(如果集合中存在该元素)。请编写成员函数 remove。在 main 函数中给出了一组测试数据,此时程序的正确输出结果应为:2 3 4 5 27 28 31 66 75 2 3 4 5 6 27 28 3l 66 75 2 3 4 5 6 19 27 28 31 6
26、6 75 3 4 5 6 19 27 28 31 66 75 3 4 5 6 19 27 28 31 66 75 要求: 补充编制的内容写在“/ *333*”与“/ *666*”之间,不得修改程序的其他部分。 注意:程序最后将结果输出到文件 out.dat 中。输出函数 writeToFile 已经编译为 obj 文件,并且在本程序中调用。 /IntegorSet.h #ifndef INTEGERSET #define INTEGERSET #include iostream using namespace std; const int MAXELEMENTS = 100; /集合做多可拥有
27、的元素个数 class IntegerSet int elemMAXELEMENTS; /用于存放集合元素的数组 int counter; public: IntegerSet(): counter(0) /创建一个空集合 IntegerSet (int data, int size); /利用数组提的数据创建一个整数集合 void add(int element); /添加一个元素到集合中 void remove(int element); /删除集合中指定的元算 int getCount() const return counter; /返回集合中元素的个数 int getElement
28、(int i) const return elemi; /返回集合中指定的元素 void show() const; ; void WriteToFile(char *); #endif /main.cpp #include “IntegerSet.h“ #include iomanip IntegerSet: IntegerSet (int data, int size): counter(0) for(int i = 0; i size; i+) add (datai); void IntegerSet:add (int element) int j; /从后往前寻找第一个小于等于 ele
29、ment 的元素 for(j = counter; j 0; j-) if (element = elemj - 1) break; /如果找到的是等于 element 的元素,说明要添加的元素已经存在,直接返回 if(j 0) if (element = elemj - 1) return; /如果找到的是小于 element 的元素,j 就是要添加的位置 /该元素及其后面的元素依次后移,腾出插入位置 for (int k = counter; k j; k-) elem k = elemk - 1; elemj = element; /将 element 插入到该位置 counter +;
30、 /计数器加 1 void IntegerSet:remove (int element) / *333* / *666* void IntegerSet:show() const for(int i = 0; i getCount (); i+) cout setw(4) getElement(i); cout endl; int main() int d = 5,28,2,4,5,3,2,75,27,66,31; IntegerSet s(d, 11); s.show(); s.add(6); s.show(); s.add(19); s.show(); s.remove(2); s.sh
31、ow(); s.add(4); s.show(); WriteToFile(“ “); return 0; (分数:40.00)_二级 C+模拟 492 答案解析(总分:169.00,做题时间:90 分钟)一、选择题(总题数:40,分数:69.00)1.下面有关类模板的说法中不正确的是 _ 。(分数:2.00)A.类模板的成员函数都是模板函数B.类模板本身在编译中不会生成任何代码C.类模板只是虚拟类型的参数 D.用类模板定义一个对象时,不能省略实际参数解析:解析 C+中类模板的声明格式为 template模板形参表声明类声明,并且类模板的成员函数都是模板函数。2.关于纯虚函数,下列表述中正确的
32、是_。(分数:1.00)A.纯虚函数是没有给出实现版本(即无函数体定义)的虚函数B.纯虚函数的声明总是以“=0”结束 C.派生类必须实现基类的纯虚函数D.含有纯虚函数的类不可能是派生类解析:解析 纯虚函数是在声明虚函数时被“初始化”为 O 的虚函数。纯虚函数没有函数体,纯虚函数的作用是在基类中为其派生类保留一个函数名称。3.有以下程序: class Date public: Date(int y,int m,int d); year=y; month=m; day=d; Date(int y=2000) year=y; month=10; day=1; Date(Dated) year=d.y
33、ear; month=d.month; day=d.day; void print() coutyear“.“month“.“dayendl; private; int year,month,day; ; Date fun(Date d) Date temp; temp=d; return temp; int main() Date date1(2000,1,1),daie2(0,0,0); Date date3(date1); date2=fun(date3); return 0; 程序执行时,Date 类的拷贝构造函数被调用的次数是_。(分数:2.50)A.2B.3 C.4D.5解析:解析
34、 本题考核拷贝构造函数。上述程序中,拷贝构造函数一共被调用了 3 次:第 1 次是在执行语句 Date date3(date1)时,用已经建立的对象 date1 对正在建立的对象 date3 进行初始化;第 2 次是在调用 fun 函数时,由于是传值调用,因此实参对象 date3 要对形参对象 d 进行初始化;第 3 次是在执行fun 函数中的返回语句 return temp;时,系统初始化一个匿名对象时使用了拷贝构造函数。4.关于关键字 class 和 typename,下列表述中正确的是_。(分数:1.00)A.程序中的 typename 都可以替换为 class B.程序中的 class
35、 都可以替换为 typenameC.在模板形参表中只能用 typename 来声明参数的类型D.在模板形参表中只能用 class 或 typename 来声明参数的类型解析:解析 此题考查的是 class 和 typename 两个关键字。关键字 class 除了能用来定义类以外还能用来声明模板的虚拟类型参数。在用作声明虚拟类型参数时 typename 与 class 可以互换,但不能使用typename 来定义类;在模板形参表中除了可以用 typename 和 class 声明虚拟类型参数外,还可以使用普通类型声明常规函数,故选项 C 错误。5.下列关于队列的叙述中正确的是(分数:1.00)
36、A.在队列中只能插入数据B.在队列中只能删除数据C.队列是先进先出的线性表 D.队列是先进后出的线性表解析:解析 队列是指允许在一端进行插入、而在另一端进行删除的线性表,选项 A 和选项 B 错误。允许插入的一端称为队尾,允许删除的一端称为队头。在队列中,最先插入的元素将最先能够被删除,反之,最后插入的元素将最后才能被删除。所以,队列又称为“先进先出”或“后进后出”的线性表,它体现了“先来先服务”的原则,选项 C 正确,选项 D 错误。6.下面对静态数据成员的描述中,正确的是_。(分数:1.00)A.静态数据成员可以在类体内进行初始化B.静态数据成员不可,以被类的对象调用C.静态数据成员不能受
37、 private 控制符的作用D.静态数据成员可以直接用类名调用 解析:解析 静态数据成员必须在类体外初始化,它是类的所有对象的共有成员,需要使用类名调用,静态数据成员的初始化与权隈控制无关。7.下列选项,不正确的是_。(分数:1.00)A.for(int a=1; a=10; a+);B.int a=1;doa+; while(a=10); C.int a=1;while(a=10)a+;D.for(int a=1; a=10; a+)a+;解析:解析 本题考查的是基本循环语句的使用,选项 A,选项 C 和选项 D 都为正确的形式,在选项 B中的 while(a=10)后缺少结束符分号“;”
38、。8.有如下类声明: class Foo int bar; ; 则 Foo 类的成员 bar 是(分数:2.00)A.公有数据成员B.公有成员函数C.私有数据成员 D.私有成员函数解析:解析 本题考核类的定义。在定义类的成员变量时,一般都会加上关键字来修饰其访问权限,其缺省值为私有。9.下面属于黑盒测试方法的是_。(分数:2.50)A.基本路径测试B.等价类划分 C.判定覆盖测试D.语句覆盖测试解析:解析 等价类划分法是一种典型的、重要的黑盒测试方法,它将程序所有可能的输入数据(有效的和无效的)划分成若干个等价类。10.有如下程序: #include iostream using namesp
39、aee std; int main() void function( double val) ; double val; function(val) ; cout val ; return 0 ; void function( double val) val =3; 编译运行这个程序将出现的情况是 _ 。(分数:1.00)A.编译出错,无法运行B.输出:3C.输出:3.0D.输出一个不确定的数 解析:解析 本题考查函数调用及传值方式传递参数,执行函数 function 时,并没有将 3 的值传回来,而 val 又没有初始化,所以会输出一个不确定的值,D 选项正确。11.有如下程序: int x
40、=3; do x-=2; coutx; while(!(-x); 执行这个程序的输出结果是_。(分数:1.00)A.1B.30C.1-2 D.死循环解析:解析 本题考查 do.while 语句,执行 do.while 语句时,先执行循环体内的语句,然后判断while 中表达式的值,表达式为非零时,返回重新执行循环体语句。在本题中,先执行循环体内的语句,输出 1,然后判断表达式,为非零,且此时 x 为 0;再次执行循环体时,输出-2,然后判断表达式为 0,不执行,退出,所以答案为 C。12.下列字符串中不能作为 C+标识符使用的是_。(分数:1.00)A.IN25B.testC._1481D.1
41、23 解析:解析 C+规定标识符只能由字母、数字和下划线 3 种字符组成,且第一个字符必须为字母或下划线。所以选项 D 不能作为标识符,答案为 D。13._ 复审应该把重点放在系统的总体结构、模块划分、内外接口等方面。(分数:2.00)A.详细设计B.系统设计 C.正式D.非正式解析:14.有如下程序: #includeiostream using namespace std; class Media public: void Name(); void Show(); protected: int page; ; class Book:private Media public: void Pr
42、int() coutpageendl; void Show()Media:Show();) / ; int main() Book Bible; Bible.Name(); / Bible.Print(); / Bible.Show(); / return 0; 编译时有错误的是_。(分数:2.00)A.语句B.语句 C.语句D.语句解析:解析 类 Book 私有继承自类 Media,所以类 Media 中的公有成员函数 Name()在继承类 Book 中变成了私有成员函数,因而类 Book 的对象 Bible 不能访问私有成员函数 Name()。15.下面关于函数模板的表述中不正确的是_。(
43、分数:2.50)A.类模板的成员函数都是模板函数B.类模板本身在编译过程中不会产生任何代码C.类模板只能有虚拟类型的参数 D.用类模板定义一个对象时,实参不能省略解析:解析 类模板本身在编译时是不会产生代码的,只有在其实例化以后才产生代码。定义一个对象时,不能省略其实参。16.有如下类定义: class B public: void funl() private: void fun2() protected: void fun3() ; class D: public B protected: void fun4() ; 若 obj 是类 D 的对象,则下列语句中不违反访问控制权限的是_。(分
44、数:1.00)A.obj.funl(); B.obj.fun2();C.obj.fun3();D.obj.fun4();解析:解析 本题考查公用继承对基类成员的访问属性。在公用继承中,基类的公用成员和保护成员在派生类中保持原有的访问属性,其私有成员仍为基类私有。所以在本题中,在类外引用成员函数时,派生对象只能引用基类的公用成员函数 fun1,故本题答案为 A。17.重载输入流运算符“”必须使用的原型为_。(分数:2.50)A.istream B.istreamC.istream operator(istream,类名D.类名operator(istream解析:解析 C+流的输入运算符“”和输
45、出运算符“”只能作为非成员函数重载。重载输入流运算符“”须使用以下原型:istream 。18.考虑函数原型 void test(int a,int b=7,char z=“*7“),下面的函数调用中,属于不合法调用的是_。(分数:1.00)A.test(5);B.test(5,8);C.test(6,“#“); D.test(0,0,“*“);解析:解析 题中函数声明带有默认参数,那么在 C 选项的调用中,将会把字符型实参#赋值给整型形参b,这不符合参数传递规则。19.下列有关运算符重载的叙述中,正确的是_。(分数:1.00)A.运算符重载是多态性的一种表现 B.C+中可以通过运算符重载创造新的运算符C.C+中所有运算符都可以作为非成员函数重载D.重载运算符时可以改变其结合性解析:解析 重载运算符的规则如下:C+不允许用户自己定义新的运算符,只能对已有的 C+运算符进行重载;C+不能重载的运算