1、国家二级(C+)机试-试卷 15-1 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.下列语句中,错误的是( )。(分数:2.00)A.constintbuffer=256;B.constinttemp;C.constdouble*point;D.constdouble*rt=newdouble(5.5);2.由于常对象不能被更新,因此( )。(分数:2.00)A.通过常对象只能调用它的常成员函数B.通过常对象只能调用静态成员函数C.常对象的成员都是常成员D.通过常对象可以调用任何不改变对象值3.在 C+中,cin 是一个( )。(分数:2.
2、00)A.类B.对象C.模板D.函数4.执行下列语句段后,输出字符“*“的个数是( )。for (int i=50; i1; i-=2)cout draw(); int main() Shape s; Triangle t; plot( plot( s=t; s.draw(); return 0; 运行这个程序的输出是(分数:2.00)A.STTB.STSC.TSSD.TTT18.下列函数声明中,错误的是(分数:2.00)A.voidfun(intx=0,inty=0);B.voidfun(intx,inty=0);C.voidfun(intx=0,inty);D.voidfun(intx,i
3、nty);19.若 Pay 是一个类名,则执行语句 Pay p1,p22,*p3;时 Pay 的构造函数被调用的次数是(分数:2.00)A.1B.2C.3D.420.下列语句中,错误的是( )。(分数:2.00)A.constintbuffer=256;B.constdouble*point;C.intconstbuffer=256;D.double*constpoint;21.下列关于派生类构造函数和析构函数的说法中,错误的是( )。(分数:2.00)A.派生类的构造函数会隐含调用基类的构造函数B.如果基类中没有缺省构造函数,那么派生类必须定义构造函数C.在建立派生类对象时,先调用基类的构造
4、函数,再调用派生类的构造函数D.在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数22.下列叙述中正确的是( )。(分数:2.00)A.栈是一种先进先出的线性表B.队列是一种后进先出的线性表C.栈与队列都是非线性结构D.以上三种说法都不对23.若已经声明了函数原型“boolfun(boola,intb=0);“,则下列重载函数声明中正确的是(分数:2.00)A.boolfun(boola=true,intb=0);B.intfun(boola,intB);C.voidfun(doublea,intB);D.voidfun(boola,intb=0);24.有如下程序: #incl
5、ude #include using namespace std; class Person public: Person(string n):name(n) Person() cout1; i-=2)cout draw(); int main() Shape s; Triangle t; plot( plot( s=t; s.draw(); return 0; 运行这个程序的输出是(分数:2.00)A.STTB.STS C.TSSD.TTT解析:解析:main 函数中,plot 函数的参数通过 Shape 对象引用和 Triangle 对象引用来调用虚函数draw(),由于形参 s 是基类引
6、用,所以符合多态性调用,程序将在运行时期根据 s 引用对象的类型决定调用哪个 draw(),这里实参 s 是 Shape 类类型,因而调用 Shape 类的 draw()函数,实参 t 是 Triangle 类类型,因而调用 Triangle 类的 draw()函数,输出:“ST“;程序接着将派生类对象 t 赋给 s,由于基类Shape 没有显式的定义赋值运算符和将派生类对象作为参数的基类构造函数,因而编译器自动产生基类Shape 的赋值运算符 operator=(ShapeB.voidfun(intx,inty=0);C.voidfun(intx=0,inty); D.voidfun(int
7、x,inty);解析:解析:默认参数是通过给形参表中的形参提供明确的初始值来指定的,可以为一个或多个形参定义默认值,但是如果有一个形参具有默认值,那它右边的形参都必须有默认值(即全是默认参数)。选项 C 错误,形参 y 也必须要有默认值;答案为 C。19.若 Pay 是一个类名,则执行语句 Pay p1,p22,*p3;时 Pay 的构造函数被调用的次数是(分数:2.00)A.1B.2C.3 D.4解析:解析:程序定义了 Pay 对象 p1,Pay 对象数组 p2 和 Pay 对象指针 p3,编译器自动生成默认构造函数初始化 p1 对象和 p2 的两个对象元素;p3 没有初始化,没有调用构造函
8、数,答案为 C。20.下列语句中,错误的是( )。(分数:2.00)A.constintbuffer=256;B.constdouble*point;C.intconstbuffer=256;D.double*constpoint; 解析:解析:const 是一个 C+关键字,用于限定不允许改变的变量。选项 B 是指向常量的指针,定义时可以不初始化;选项 D 是指针常量,定义时必须初始化。故答案为 D。21.下列关于派生类构造函数和析构函数的说法中,错误的是( )。(分数:2.00)A.派生类的构造函数会隐含调用基类的构造函数B.如果基类中没有缺省构造函数,那么派生类必须定义构造函数C.在建立
9、派生类对象时,先调用基类的构造函数,再调用派生类的构造函数D.在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数 解析:解析:在销毁派生类对象时,先调用派生类的析构函数,再调用基类的析构函数。22.下列叙述中正确的是( )。(分数:2.00)A.栈是一种先进先出的线性表B.队列是一种后进先出的线性表C.栈与队列都是非线性结构D.以上三种说法都不对 解析:解析:栈是一种先进后出的线性表,队列是一种先进先出的线性表,栈与队列都是线性结构。23.若已经声明了函数原型“boolfun(boola,intb=0);“,则下列重载函数声明中正确的是(分数:2.00)A.boolfun(boo
10、la=true,intb=0);B.intfun(boola,intB);C.voidfun(doublea,intB); D.voidfun(boola,intb=0);解析:解析:本题考查函数重载相关知识,重载函数是函数的一种特殊情况,为方便使用,C+允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。ABD 选项的形参都与原函数相同,所以不能作为重载函数,选项 C 正确。24.有如下程序: #include #include using namespace std; class Perso
11、n public: Person(string n):name(n) Person() coutx=x,this-y=y; (2)voidshow()consttout(x,); (3):p1(pt1),p2(pt2)或p1=pt1;p2=pt2)解析:解析:(1)主要考查考生对构造函数的掌握,因为形参名和私有成员名称一样,因此不能直接赋值,在这里使用成员列表初始化,也可以使用 this 指针赋值。 (2)主要考查考生对语句基本语法的掌握,根据语句:voidshow()consteout(x,y)。可看出函数体内并没有“;”作为 cout 语句的结束符,因此程序错误。 (3)主要考查考生对构造
12、函数的掌握,形参是 pt1 和 pt2,这里写反了,也可以使用成员列表初始化法,可以避免这种错误。三、简单应用题(总题数:1,分数:2.00)42.请使用“答题”菜单或使用 VC6 打开考生文件夹 proj2 下的工程 proj2。此工程包含一个程序文件maincpp,其中有日期类 Date、人员类 Person 以及排序函数 sortByName 和主函数 main 的定义。请在程序中的横线处填写适当的代码,然后删除横线,以实现上述类定义和函数定义。此程序的正确输出结果应为:按姓名排序排序前:张三男出生日期:1978 年 4 月 20 日王五女出生日期:1965 年 8 月 3 日杨六女出生
13、日期:1965 年 9 月 5 日李四男出生日期:1973 年 5 月 30 日排序后:李四男出生日期:1973 年 5 月30 日王五女出生日期:1965 年 8 月 3 日杨六女出生日期:1965 年 9 月 5 日张三男出生日期:1978 年 4月 20 日注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不能删除或移动“*found*”。#includeiostreamusingnamespacestd;classDate日期类 intyear,month,day;年、A、日 public:Date(intyear,intmonth,intday):year(year),m
14、onth(month),day(day)intgetYear()constreturnyear;intgetMonth()const(returnmonth;intgetDay()constreturnday;classPerson人员类 charname14;姓名boolismale;性别,为 true 时表示男性 Datebirthdate;出生日期public:Person(char*name,booliSmale,Datebirthdate)*found*:_strcpy(this-name,name);constchar*getName()constreturnname;boolisMale()constreturnismale;DategetBirthdate()constreturnbirthdate;利用 strcmp()函数比较姓名,返回一个正数、0 或负数,分别表示大于、等于、小于 intcompareName(constPerson int counter = 1; int length = strlen(str); for (int i = 0; i length; i+) if (isspace(stri) counter+; return counter;)解析:解析:主要考查考生对动态数组的掌握情况,计算单词个数通过计算空格数目来完成。