1、国家二级(C+)机试-试卷 1-3 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.在数据管理技术发展的三个阶段中,数据共享最好的是( )。(分数:2.00)A.人工管理阶段B.文件系统阶段C.数据库系统阶段D.三个阶段相同2.下列关于类定义的说法中,正确的是( )。(分数:2.00)A.类定义中包括数据成员和函数成员的声明B.类成员的缺省访问权限是保护的C.数据成员必须被声明为私有的D.成员函数只能在类体外进行定义3.C+中的模板包括( )。(分数:2.00)A.对象模板和函数模板B.对象模板和类模板C.函数模板和类模板D.变量模板和对象模
2、板4.下列字符串中不能作为 C+标识符使用的是(分数:2.00)A.INTB.testC._1481D.1temp5.在 C+中,编译系统自动为一个类生成默认构造函数的条件是(分数:2.00)A.该类没有定义任何有参构造函数B.该类没有定义任何无参构造函数C.该类没有定义任何构造函数D.该类没有定义任何成员函数6.下列关于输入流类成员函数 getline()的叙述中,错误的是(分数:2.00)A.该函数是用来读取键盘输入的字符串的B.该函数读取的字符串长度是受限制的C.该函数读取字符串时,遇到终止符便停止D.该函数读取字符串时,可以包含空格7.下列语句或语句序列中有语法错误的是(分数:2.00
3、)A.inti,j;for(i=0,j=0;iC.0 不成立;由70/3=23,可知循环最少执行 23 次,之后 i 取值为 1,仍然满足循环条件,所以循环总共执行 24 次,n 自增 24 次,答案为 B29.有如下类定义: class Pa int k; public: Pa():k(0) / Pa(int n):k(n) / Pa(Pa 若执行语句 Pa a=Pa(1),Pa(2);则在标有号码的构造函数中,被调用的包括(分数:2.00)A.B.和C.D.和 解析:解析:对象数组,就是数组元素是类对象,不管对象数组在哪里定义,如果没有显式的调用构造函数初始化,编译器将使用类的默认构造函数
4、初始化对象元素,这里程序中显式的使用构造函数 Pa(intn)初始化各个元素,所以被调用的构造函数只有 Pa(intn),没有调用默认构造函数和复制构造函数,答案为 C。30.下列函数声明中,错误的是(分数:2.00)A.voidfun(intx=0,inty=0);B.voidfun(intx,inty=0);C.voidfun(intx=0,inty); D.voidfun(intx,inty);解析:解析:默认参数是通过给形参表中的形参提供明确的初始值来指定的,可以为一个或多个形参定义默认值,但是如果有一个形参具有默认值,那它右边的形参都必须有默认值(即全是默认参数)。选项 C 错误,形
5、参 y 也必须要有默认值;答案为 C。31.有如下类声明: class How int k; public: How() cout“Bye“; ;则类 How 所拥有的构造函数的数量是(分数:2.00)A.1B.2 C.3D.4解析:解析:在类 How 定义中没有定义任何构造函数,所以编译器会自动生成一个默认构造函数,同时还生成复制构造函数,所以类 How 拥有两个构造函数,答案为 B。32.在数据库设计中,将 ER 图转换成关系数据模型的过程属于( )。(分数:2.00)A.需求分析阶段B.概念设计阶段C.逻辑设计阶段 D.物理设计阶段解析:解析:ER 图转换成关系模型数据则是把图形分析出来
6、的联系反映到数据库中,即设计出表,所以属于辑设计阶段。33.下列有关继承和派生的叙述中,正确的是( )。(分数:2.00)A.如果一个派生类公有继承其基类,则该派生类对象可以访问基类的保护成员B.派生类的成员函数可以访问基类的所有成员C.基类对象可以赋值给派生类对象D.如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类 解析:解析:私有继承方式为基类的公用成员和保护成员在派生类中成了私有成员,其私有成员仍为基类私有,但派生类对象可以访问基类的保护成员,所以基类对象不能赋值给派生类对象。抽象类是指含有纯虚拟函数的类,所以选项 D 正确。34.对于循环队列,下列叙述中正确的是( )。(分
7、数:2.00)A.队头指针是固定不变的B.队头指针一定大于队尾指针C.队头指针一定小于队尾指针D.队头指针可以大于队尾指针,也可以小于队尾指针 解析:解析:循环队列的队头指针与队尾指针都不是固定的,随着入队与出队操作要进行变化。因为是循环利用的队列结构所以对头指针有时可能大于队尾指针有时也可能小于队尾指针。35.已知函数 f 的原型是 voidf(int*a,long,变量 v1、v2 的定义是:intv1;longv2;下列调用语句中正确的是( )。(分数:2.00)A.f(v1,B.f(v1,v2);C.f(D.f( 解析:解析:函数参数的 3 种传递方式:将变量名作为形参和实参,即传值方
8、式;传递变量指针;引用形参。本题中函数 f 的第一个形参为指针,那么调用 f 函数时,第一个参数必须是地址,所以必须是B.templateTfun(Tx,intn)returnx*n;C.templateTfun(T*p)return*p;D.templateTclassATn; 解析:解析:本题考查模板的定义,B 选项中 x 为 T 类型的,n 为 int 型的,但是 x*n 就不一定是 T 类型的,所以错误。37.在 C+中,用来取代中的预处理宏函数的是(分数:2.00)A.重载函数B.友元函数C.递归函数D.内联函数 解析:解析:内联函数具有一般函数的特性,它与一般函数所不同之处公在于函
9、数调用的处理。一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换,内联函数被发明出来就是为了取代 C 中的宏,所以答案为 D。38.有如下程序: #include using namespace std; class Point public: Point(int xx=0,int yy=0):x(xx),y(yy) void SetXY(int xx,int yy) x=xx; y=yy; protected: int x,y; ; class Circle:Point public: Circle(int r
10、):radius(r) void Set(int r,int x,int y) radius=r; SetXY(x,y); / void Print() const coutx,y,A.B.C. D.解析:解析:选项中 SetXY 为基类的成员函数,派生类也继承下来,但是 SetXY 的参数为两个,而调用时是 3 个参数,所以错误。39.下列语句或语句序列中错误的是(分数:2.00)A.inta;constint*point=B.constinta=10;C.constint*point=10; D.constint*point=newint(10);解析:解析:本题考查常指针,C 选项中不能
11、直接将整型变量赋值给常指针,所以 C 选项错误。40.有下列类模板声明中,出现语法错误的是(分数:2.00)A.templateclassA;B.templateclassA;C.templateclassA;D.templateclassA; 解析:解析:在类模板声明中,每个模板类型形参前面都必须用关键字 class 和 typename 来修饰;选项D 错误,答案为 D。二、基本操作题(总题数:1,分数:2.00)41.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj1 下的工程 proj1,其中在编辑窗口内显示的主程序文件中定义有类 AAA 和主函数 main。程序文本中位于每
12、行“ERROR*found*”下面的一行有错误,请加以改正。改正后程序的输出结果应该是:sum=60 注意:只修改每个“ERROR*found*”下面的一行,不要改动程序中的其他任何内容。#includeiostreamusingnamespacestd;classAAAintai0;intn;ERROR*found*private:AAA(intaa,intnn):n(nn)ERROR*found*for(inti=0;in;i+)aai=ai;intGeta(inti)returnai;intmain()inta6=2,5,8,10,15,20;AAAx(a,6);intsum=0;EfU
13、ROR*found*for(inti=0;i6;i+)sum+=xai;cout“sum=“sumend1;return0;(分数:2.00)_正确答案:(正确答案:(1)public: (2)for(inti=0;i解析:解析:(1)构造函数肯定是公有成员,所以应使用 pubhc。 (2)主要考查考生对赋值语句的掌握,因为数组 a 是私有成员,因此 a 应该在左边,而数组 aa 是形参,要赋值给数组 a。 (3)主要考查考生对成员函数调用的掌握,数组 a 是类的私有成员,因此不能被 main 函数直接调用,要通过成员函数 Geta 来调用数组 a。三、简单应用题(总题数:1,分数:2.00)
14、42.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj2 下的工程 proj2。此工程中包含一个源程序文件 maincpp,其中有“书”类 Book 及其派生出的“教材”类 TeachingMaterial 的定义,还有主函数main 的定义。请在横线处填写适当的代码并删除横线,以实现上述类定义和函数定义。该程序的正确输出结果应为:教材名:C+语言程序设计页数:299 作者:张三相关课程:面向对象的程序设计注意:只在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“*found*”。#includeiostreamusingnamespacestd;classBook
15、“书”类 char*title;书名intnum_pages;页数 char*writer;作者姓名public:*found*Book(constchar*thetitle,intpages,constchar*thewriter):_title=newcharstrlen(thetitle)+1;strcpy(title,thetitle);*found*strcpy(writer,thewriter);Book()deletetitle;deletewriter;intnumOfPages()constreturnnumpages;返回书的页数 constchar*theTitle()c
16、onstreturntitle,t返回书名 constchar*theWriter()constreturnwriter;返回作者名;classTeachingMaterial:publicBook“教材”类char*course;public:TeachingMaterial(constchar*thetitle,intpages,constchar*thewriter,constchar*thecourse)*+*found*:_course=newcharstrlen(thecourse)+1;strcpy(course,the_course);TeachingMaterial()del
17、etecourse;constchar*theCourse()constreturncourse;返回相关课程的名称;intmain()TeachingMaterialabook(“c+语言程序设计“,299,“张三“,“面向对象的程序设计“);cout“教材名:“abooktheTitle()end1“页数:“abooknumOfPages()end1“作者:“abooktheWriter()end1*found*“相关课程:“_;coutend1;return0;(分数:2.00)_正确答案:(正确答案:(1)num_pages(pages) (2)writer = new charstr
18、len(the_writer) + 1; (3)Book(the_title, pages, the_writer) (4)a_book.theCourse()解析:解析:(1)主要考查考生对构造函数的掌握情况,使用成员列表进行初始化。 (2)主要考查考生对动态分配的掌握情况,使用 new 给 writer 分配空间。 (3)主要考查考生对构造函数的掌握情况,使用成员列表初始化给基类初始化。 (4)主要考查考生对成员函数调用的掌握情况,函数 theCourse()返回相关课程。四、综合应用题(总题数:1,分数:2.00)43.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj3 下的工
19、程文件 proj3,此工程中包含一个源程序文件 p,oj3cpp,其中定义了用于表示平面坐标系中的点的类 MyPoint 和表示矩形的类 MyRectane;程序应当显示:(0,2)(2,2)(2,0)(0,0)4 但程序中有缺失部分,请按照以下提示,把缺失部分补充完整:(1)在“*1*found*”的下方是构造函数的定义,它用参数提供的左上角和右下角的坐标对 up_left 和 down_fight 进行初始化。(2)在“*2*found*”的下方是成员函数getDownLeft 的定义中的一条语句。函数 getDownLeft 返回用 MyPoint 对象表示的矩形的左下角。(3)在“*3
20、*found*”的下方是成员函数 area 的定义,它返回矩形的面积。注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“*found*”。proj3cpp#includeiostreamusingnamespacestd;classMyPoint表示平面坐标系中的点的类 doublex;doubley;public:MyPoint(doublex,doubleY)this-x=x;this-y=y;)doublegetX()constreturnx;)doublegetY()constreturnY;voidshow()constcout(x,y););classMy
21、Rectangle表示矩形的类MyPointup_left;矩形的左上角顶点 MyPointdown_riqht;矩形的右下角顶点public:MyRectangle(MyPointupleft,MyPointdownright);MyPointgetUpLeft()constreturnup_1eft;返回左上角坐标 MyPointgetDownRight()constreturndown_right;返回右下角坐标 MyPointgetUpRight()const;返回右上角坐标 MyPointgetDownLeft()const;返回左下角坐标 doublearea()const;返回矩
22、形的面积);*1*found*MyRectangle:MyRectangle(_):up_left(p1),down_right(p2)MyPointMyRectangle:getUpRight()constreturnMyPoint(down_rightgetX(),up_leftgetY();MyPointMyRectangle:getDownLeft()const*2*found*returnMyPoint(_);*3*found*_area()Iconstreturn(getUpLeft()getX()-getDownRight()getX()*(getDownRight()getY(
23、)-getUpLeft()getY();intmain()MyRectangler(MyPoint(0,2),MyPoint(2,0);rgetUpLeft()show();rgetUpRight()show();rgetDownRight()show();rgetDownLeft()show();coutrarea()end1;return0;(分数:2.00)_正确答案:(正确答案:(1)MyPointp1,MyPointp2 (2)up_leftgetX(),downrightgetY() (3)doubleMyRectangle:)解析:解析:(1)考查构造函数,构造函数中的参数要给私有成员赋值,在下句中 upleft(p1),downright(p2)指出私有成员赋值要使用形参 p1 和 p2,因此这里参数要定义为 MyPointp1,MyPointp2。 (2)主要考查成员函数的返回语句,MyPointMyRectangle:getDownLeft()const 函数要求返回一个左下角的点坐标,因此使用语句 MyPoint(up_leftgetX(),down_rightgetY();。 (3)主要考查成员函数的定义,在 MyRectangle 类中已经声明 doublearea()const,因此此处只要添加 doubleMyRect删 e:即可。