1、国家二级(C+)机试-试卷 10-2 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.有如下类定义:class B public: void fun1() private: void fun2() protected: void fun3() ;class D: public B protected: void fun4() ;若 obj 是类 D 的对象,则下列语句中不违反访问控制权限的是( )。(分数:2.00)A.obj.fun1();B.obj.fun2();C.obj.fun3();D.obj.fun4();2.支持子程序调用的数据
2、结构是( )。(分数:2.00)A.栈B.树C.队列D.二叉树3.下列关于运算符重载的叙述中,错误的是( )。(分数:2.00)A.有的运算符可以作为非成员函数重载B.所有的运算符都可以通过重载而被赋予新的含义C.不得为重载的运算符函数的参数设置默认值D.有的运算符只能作为成员函数重载4.有如下类定义:class MyClass int value;public:MyClass(int n): value (n) int getValue()const return value; ;则类 MyClass 的构造函数的个数是( )。(分数:2.00)A.1 个B.2 个C.3 个D.4 个5.在
3、下列模式中,能够给出数据库物理存储结构与物理存取方法的是( )。(分数:2.00)A.外模式B.内模式C.概念模式D.逻辑模式6.在函数中,定义一个变量时,默认的存储类型是(分数:2.00)A.externB.autoC.registerD.static7.有如下程序: #include #include using namespace std; class TV public: TV(int s=41):size(s) coutfun();D.fun();21.对于循环队列,下列叙述中正确的是( )。(分数:2.00)A.队头指针是固定不变的B.队头指针一定大于队尾指针C.队头指针一定小于队
4、尾指针D.队头指针可以大于队尾指针,也可以小于队尾指针22.已知函数 f 的原型是 void f(int *a, long ,变量 v1、v2 的定义是:int v1; long v2;下列调用语句中正确的是( )。(分数:2.00)A.f(v1,B.f(v1,v2);C.f(D.f(23.下列关于模板的叙述中,错误的是(分数:2.00)A.调用模板函数时,在一定条件下可以省略模板实参B.可以用 int、double 这样的类型修饰符来声明模板参数C.模板声明中的关键字 class 都可以用关键字 typename 替代D.模板的形参表中可以有多个参数24.有如下程序段: int i=1; w
5、hile(1) i+; if(i = 30) break; if(i%3 = 0) cout fun();D.fun();解析:解析:本题考查公用继承对基类成员的访问属性。在公用继承中,基类的公用成员和保护成员在派生类中保持原有的访问属性,其私有成员仍为基类私有。本题中想要输出 Base:fun,则必须调用基类的公用成员函数 fun,所以使用 Base:fun();来调用基类的成员函数 fun。21.对于循环队列,下列叙述中正确的是( )。(分数:2.00)A.队头指针是固定不变的B.队头指针一定大于队尾指针C.队头指针一定小于队尾指针D.队头指针可以大于队尾指针,也可以小于队尾指针 解析:解
6、析:循环队列的队头指针与队尾指针都不是固定的,随着入队与出队操作要进行变化。因为是循环利用的队列结构所以对头指针有时可能大于队尾指针有时也可能小于队尾指针。22.已知函数 f 的原型是 void f(int *a, long ,变量 v1、v2 的定义是:int v1; long v2;下列调用语句中正确的是( )。(分数:2.00)A.f(v1,B.f(v1,v2);C.f(D.f( 解析:解析:函数参数的 3 种传递方式:将变量名作为形参和实参,即传值方式;传递变量指针;引用形参。本题中函数 f 的第一个形参为指针,那么调用 f 函数时,第一个参数必须是地址,所以必须是while(1) i
7、+; if(i = 30) break; if(i%3 = 0) cout *; 执行这个程序段输出字符 * 的个数是(分数:2.00)A.30B.8C.9 D.10解析:解析:本题中 while 循环中当 i 为 3 的倍数时输出*,而 i 为 30 时跳出循环,所以输出 9 个*,答案为 C。25.有如下类定义和变量定义: class Parents public: int publicData; private: int privateData; ;class ChildA : public Parents /*类体略*/ ; class ChildB : private Parents
8、 /*类体略*/ ; ChildA a; ChildB b;下列语句中正确的是(分数:2.00)A.couta.publicDataendl; B.couta.privateDataendl;C.coutb.privateDataendl;D.coutb.publicDataendl;解析:解析:本题考查派生类对基类成员的访问属性,派生类公用继承基类,所以派生类可以直接使用基类的公用成员,所以只有 A 选项正确。26.对长度为 10 的线性表进行冒泡排序,最坏情况下需要比较的次数为(分数:2.00)A.9B.10C.45 D.90解析:解析:冒泡法是在扫描过程中逐次比较相邻两个元素的大小,最坏
9、的情况是每次比较都要将相邻的两个元素互换,需要互换的次数为 9+8+7+6+5+4+3+2+1=45,选 C。27.有如下程序: #include using namespace std; void _ int z=x; x=y; y=z; int main() int x=0,y=1; f(x,y); coutxyA.f(intx,inty)B.f(int*x,int*y)C.f(int class Animal public: virtual string GetType() const return “Animal“; virtual string GetVoice() const re
10、turn “Voice“; ; class Dog:public Animal public: string GetType() const return “Dog“; string GetVoice() const return “Woof“; ; class Cat:public Animal public: string GetType() const return “Cat“; string GetVoice() const return “Miaow“; ; void Type(Animal a) cout“ speak “; Speak(d); cout“ - “; Cat c;
11、Type(c); cout“ speak “; Speak(c); coutA.DogspeakVoice-CatspeakVoiceB.DogspeakWoof-CatspeakMiaowC.AnimalspeakVoice-AnimalspeakVoiceD.AnimalspeakWoof-AnimalspeakMiaow 解析:解析:本题考查虚函数的运用,本题中定义 Dogd;Type(d)时,执行基类的 Type 函数,输出Animal,然后输出 speak,然后执行派生类的 Speak 函数输出 Woof,最后输出-,同理 cat 输出类似,所以结果为 D 选项正确。29.下列叙述中
12、,错误的是(分数:2.00)A.false 是一个逻辑型常量B.n 是一个字符型常量 C.1481 是一个 int 常量D.1.414 是一个 double 常量解析:解析:字符型常量是用单引号括起来的一个字符。B 选项中“n“是字符串常量,答案为 B。30.下列模板声明中,有语法错误的是(分数:2.00)A.templateTfun(Tx)returnx*x;B.templateTfun(Tx,intn)returnx+n;C.templateTfun(T*p)return*p;D.templateTfun()returnT; 解析:解析:模板形参表中,class 关键字修饰的是类型形参,代
13、表在函数中使用的数据类型,而 return语句返回的应该是整型值,选项 D 错误,答案为 D。31.某个工厂有若干个仓库,每个仓库存放有不同的零件,相同零件可能放在不同的仓库中。则实体仓库和零件间的联系是(分数:2.00)A.多对多 B.一对多C.多对一D.一对一解析:解析:一般来说,实体集之间必须通过联系来建立联接关系,分为三类:一对一联系(1:1)、一对多联系(1:m)、多对多联系(m:n)。每个仓库存放有不同的零件,相同零件可能放在不同的仓库中,故实体仓库和零件间的联系是多对多,A 选项正确。32.派生类的成员函数不能访问的基类成员是(分数:2.00)A.公有成员和保护成员B.私有成员
14、C.保护成员D.公有成员解析:解析:基类中的 private 成员,只有基类和基类的友元可以访问,派生类的成员函数不能直接访问,所以派生类若要访问基类的 private 成员,必须使用基类的接口,答案为 B。33.下列叙述中正确的是( )。(分数:2.00)A.循环队列有队头和队尾两个指针,因此,循环队列是非线性结构B.在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况C.在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况D.循环队列中元素的个数是由队头指针和队尾指针共同决定 解析:解析:循环队列有队头和队尾两个指针,但是循环队列仍是线性结构的,所以 A)错误;在循环队列中
15、只需要队头指针与队尾两个指针来共同反映队列中元素的动态变化情况,所以 B)与 C)错误。34.下列运算符中,不能被重载的是( )。(分数:2.00)A. ; class Circle:public Point public: Circle(int r):radius(r) private: int radius; ;派生类 Circle 中数据成员的个数为(分数:2.00)A.1B.2C.3 D.5解析:解析:本题考查如何定义派生类以及派生类对基类成员的访问,声明派生类的一般形式为:class派生类名:继承方式基类名题目中公用继承,所以也继承基类的数据成员,所以总共有 3 个数据成员,所以 C
16、 选项正确。38.若 x 和 y 是程序中的两个整型变量,则下列 if 语句中正确的是(分数:2.00)A.if(x!=0)y=1;elsey=2; B.if(x!=0)y=1elsey=2;C.if(x!=0)theny=1elsey=2;D.ifx!=0y=1;elsey=2;解析:解析:本题考查 if 语句,if 语句一种形式为: if(表达式 1)语句 1 else 语句 2 只有 A 选项是正确的。39.有如下程序: #include #include using namespace std; class Wheel public: Wheel(string s=“W“):name(
17、s) coutA.GB.RGC.WRG D.RWG解析:解析:定义 Bicyclebike 时,执行 Wheel 的构造函数输出 W,然后执行 Bicycle 的构造函数输出RG,最终输出 WRG,选项 C 正确。40.下列关于 C+函数的叙述中,正确的是(分数:2.00)A.函数不能自己调用自己B.每个函数都必须返回一个值C.每个函数至少要有一个参数D.函数在被调用之前必须先进行声明或定义 解析:解析:函数可以自己调用自己,称为递归调用;函数返回类型为 void 时,没有返回值;函数的参数列表中可以没有参数;函数在被调用前必须先进行函数声明或定义。A、B、C 错误,D 正确;答案为D。二、基
18、本操作题(总题数:1,分数:2.00)41.请使用 VC6 或使用【答题】菜单打开考生文件夹 pmjl 下的工程 proj1。此工程中包括类 Date(“13 期”)和主函数 main 的定义。程序中位于每个“ERROR*found*”之后的一行语句有错误,请加以改正。改正后程序的输出结果应为:2006-1-12005-12-312005-1-312006-1-1 注意:只修改每个“ERROR*found*”下的那一行,不要改动程序中的其他内容。#includeiostreamusingnamespaeestd;clasSDatepublic:Date(inty=2006,intm=1,int
19、d=1)ERROR“*found*:year=y,month=m,day=dERROR*found*Date(constDated)this-year=dyear;this-month=dmonth;this-day=dday;voidprint()constcoutyear一month一dayend1;private:ERROR*found*intyear(2006),month(1),day(1);intmain()Datedl,d2(2005,12,31),d3;d1print:();d2print:();c13=d2;c12=d1;d1=d3;d1print();d2print();r
20、eturn0;(分数:2.00)_正确答案:(正确答案:(1): year(y), month(m), day(d) (2)Date(const Date )解析:解析:(1)主要考查考生对构造函数的掌握,使用成员列表初始化。 (2)主要考查考生对拷贝构造函数的掌握,拷贝构造函数的形参使用引用调用。 (3)主要考查考生对私有成员的掌握,私有成员只能声明不能定义初始值。三、简单应用题(总题数:1,分数:2.00)42.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj2 下的工程 proj2,其中定义了 vehicle 类,并派生出 motorcar 类和 bicycle 类。然后以 m
21、otorcar 和 bicycle 作为基类,再派生出 motocycle 类。要求将 vehicle 作为虚基类,避免二义性问题。请在横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为:Avehicleisrunning!Avehiclehasstopped!Abicycleisrunning!Abicyclehasstopped!Amotorcarisnmning!Amotocycleisrunning!注意:只在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“*found*”。#includeiostreamhclassvehicleprivat
22、e:intMaxSpeed;intWeight;public:vehicle():MaxSpeed(0),Weight(0)vehicle(intmax_speed,intweight):MaxSpeed(max_speed),Weight(weight)*found*_Run()cout“AvehicleiSrunning!“end1;*found*_Stop()cout“Avehiclehasstopped!“end1;classbicycle:virtualpublicvehicleprivate:intHeight;public:bicycle():Height(0)bicycle(i
23、ntmax_speed,intweight,intheight):vehicle(max_speed,weight),Height(height);voidRun()cout“Abicycleisrunning!“end1;voidStop()cout”Abicyclehasstopped!”end1;);classmotorcar:virtualpublicvehicleprivate:intSeatNum;public:motorcar():SeatNum(0)motorcar(intmaxspeed,intweight,intseat_num)*found*:_voidRun()cout
24、“Amotorcarisrunning!“end1;voidStop()cout“Amotorcarhasstopped!“end1;*found*classmOtOrcycle:_public:motorcycle()motorcycle(intmax_speed,intweight,intheight,intseet_num):bicycle(max_speed,weight,height),motorcar(max_speed,weight,seet_num);motorcycle();voidRun()cout“Amotorcycleisrunning!“end1;voidStop()
25、cout“AmotOrcyclehasstopped!“end1;intmain()vehicle*ptr;vehiclea;bicycleb;motorcarc;motorcycled;aRun();aStop();bRun();bStop();ptr=&c;ptr-Run();ptr=&d;ptr-Run(),return0;(分数:2.00)_正确答案:(正确答案:(1)virtual void (2)virtual void (3)vehicle(max_speed, weight), SeatNum(seat_num) (4)public bicycle, public motorc
26、ar)解析:解析:(1)和(2)主要考查考生对虚函数的掌握,虚函数使用 virtual 定义。 (3)主要考查考生对构造函数的掌握,使用成员列表初始化。 (4)主要考查考生对派生类的掌握,派生类继承基类时要表明继承方式,公有继承为 public,多个继承时要使用“,“隔开。四、综合应用题(总题数:1,分数:2.00)43.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj3 下的工程 prog3,其中声明了 ValArmy 类,该类在内部维护一个动态分配的整型数组。ValArray 类的复制构造函数应实现对象的深层复制。请编写ValArray 类的复制构造函数。在 main 函数中给出
27、了一组测试数据,此种情况下程序的输出应该是:ValArrayvl=1,2,3,4,5ValArrayv2=2,2,2,2,2要求:补充编制的内容写在“*333*”与“*666*”之间。不要修改程序的其他部分。注意:相关文件包括:mmncpp、ValArrayh。程序最后调用 writeToFile 函数,使用另一组不同的测试数据,将不同的运行结果输出到文件 outdat 中。输出函数 writeToFile 已经编译为 obi 文件。ValArrayh#includeiostreamusingnamespacestd;classValArrayint*v;intsize;public:ValA
28、rray(constint*P,intn):size(n)v=newintsize;for(inti=0;isize;i+)vi=Pi;ValArray(constValArray&other);ValArray()deleteV;lvoidsetElement(inti,intval)vi=val;voidprint(ostream&out)constout;for(inti=0;isize-1;i+)outvi“,“;outvsize-1);voidwriteToFile(constchar*);maincpp#include“ValArrayh“ValArray:ValArray(con
29、stValArray&other)*333*666*intmain()constinta=1,2,3,4,5);ValArrayvl(a,5);ValArrayv2(v1);for(inti=0;i5;i+)v2setElement(i,2);cout”ValArrayvl=”;v1print(cout);coutend1;cout“ValArrayv2=“;v2print(cout);coutend1;writeToFile(“);return0;(分数:2.00)_正确答案:(正确答案:Size=others1ze; 把对象数组的大小赋值给 size v=newintothersize;根据对象数组的大小动态分配数组 V for(inti=0;isize;+i) vi=othervi; 遍历整个对象的数组把值 othervi放到数组 V 中)解析:解析:主要考查考生对复制构造函数的掌握。由函数名:ValArray:ValArray(constValArray&other),知道要复制的对象是 other,对由 ValArray 类的成员:int*v;intsize;知道要复制的内容是动态数组 v 及整型变量 size。动态数组要使用 new 语句分配内存,最后利用 for 循环语句来完成复制过程。