1、国家二级( C+)机试模拟试卷 73及答案与解析 一、选择题 1 下列语句中,错误的是 ( )。 ( A) constintbuffer=256; ( B) constinttemp; ( C) constdouble*point; ( D) constdouble*rt=newdouble(5.5); 2 由于常对象不能被更新,因此 ( )。 ( A)通过常对象只能调用它的常成员函数 ( B)通过常对象只能调用静态成员函数 ( C)常对象的成员都是常成员 ( D)通过常对象可以调用任何不改变对 象值 3 在 C+中, cin是一个 ( )。 ( A)类 ( B)对象 ( C)模板 ( D)函
2、数 4 执行下列语句段后,输出字符 “*“的个数是 ( )。 for (int i=50; i1; i-=2) cout using namespace std; class Shape /图形类 public: /图形绘制函数(用显示字母模拟) virtual void draw()const coutdraw(); int main() Shape s; Triangle t; plot( plot( s=t; s.draw(); return 0; 运行这个程序的输出是 ( A) STT ( B) STS ( C) TSS ( D) TTT 18 下列函数声明中,错误的是 ( A) vo
3、idfun(intx=0,inty=0); ( B) voidfun(intx,inty=0); ( C) voidfun(intx=0,inty); ( D) voidfun(intx,inty); 19 若 Pay 是一个类名,则执行语句 Pay p1,p22,*p3; 时 Pay 的构造函数被调用的次数是 ( A) 1 ( B) 2 ( C) 3 ( D) 4 20 下列语句中,错误的是 ( )。 ( A) constintbuffer=256; ( B) constdouble*point; ( C) intconstbuffer=256; ( D) double*constpoint
4、; 21 下列关于派生类构造函数和析构函数的说法中,错误的是 ( )。 ( A)派生类的构造函数会隐含调用基类的构造函数 ( B)如果基类中没有缺省构造函数,那么派生类必须定义构造函数 ( C)在建立派生类对象时,先调用基类的构造函数, 再调用派生类的构造函数 ( D)在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数 22 下列叙述中正确的是 ( )。 ( A)栈是一种先进先出的线性表 ( B)队列是一种后进先出的线性表 ( C)栈与队列都是非线性结构 ( D)以上三种说法都不对 23 若已经声明了函数原型 “boolfun(boola,intb=0);“,则下列重载函数声明中
5、正确的是 ( A) boolfun(boola=true,intb=0); ( B) intfun(boola,intB); ( C) voidfun(doublea,intB); ( D) voidfun(boola,intb=0); 24 有如下程序: #include #include using namespace std; class Person public: Person(string n):name(n) Person() cout using namesapce std; int return r; int main() int a=1,3,5,7; cout using
6、namespace std; class GA public: virtual int f() return 1; ; class GB: public GA public: virtual int f() return 2; ; void show(GA g) cout using namespace std; class Point public: Point(int xx=0,int yy=0):x(xx),y(yy) protected: void SetXY(int xx,int yy) x=xx; y=yy; private: int x,y; ; class Circle:pub
7、lic Point public: Circle(int r):radius(r) void Set(int r,int x,int y) radius=r; SetXY(x,y); / void Print() const cout using namespace std; int main() int a6=27,57,20,42,56,18; int s1,s2; s1=s2=a0; for(int* p=a+1;p-a*p?*p:s1; s2=s2 using namespace std; class TV public: TV(int s=41):size(s) void Print
8、() cout #include usingnamespacestd; clasSPoint doublex, y; public: Point(doublex=0 0, doubley=0 0) ERROR*found* x=x; y=y; ) doublegetX()constreturnx; doublegetY()constreturny; ) ERROR*found* voidshow()constcoutusingnamespacestd; classDate日期类 intyear, month, day;年、 A、日 public: Date(intyear, intmonth,
9、 intday): year(year), month(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); c
10、onstchar*getName()constreturnname; boolisMale()constreturnismale; DategetBirthdate()constreturnbirthdate; 利用 strcmp()函数比较姓名,返回一个正数、 0或负数,分别表示大于、等于、小于 intcompareName(constPerson时,依次执行 person、 Date、 Student构造函数,然后依次执行 Student、 Date、 person的析构函数,所以输出为 SDP, D选项正确。 25 【正确答案】 D 【试题解析】 用来表示变量、符号常量、函数、数组类型等
11、实体名字的有效字符序列称为标识符,标识符由字母、数字、和下划线 3种字符组成,且第一个字符必须为字母或者下划线。所以 D选项错误。 26 【正确答案】 C 【试题解析】 本题考查派生类定义时使用的关键字,三种继承方式分别为private、 public、 protected,而 C选项为静态声明关键字,故选择 C。 27 【正确答案】 C 【试题解析】 线性表的顺序存储结构具备如下两个基本特征:( 1)线性表中的所有元素所占的存储空间是连续的;( 2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。用一组任意的存储单元来依次存放线性表的结点,这组存储单元既可以是连续的,也可以是不连续的,
12、甚至是零散分布在内存中的任意位置上的。因此 C正确。 28 【正确答案】 D 【试题解析】 本题考查赋值运算符重载,赋值运算符只能作为类的成员函数重载,所以 D选项错误。 29 【正确答案】 B 【试题解析 】 类 How 的定义体中没有定义任何构造函数,所以编译器需要自动生成一个默认构造函数和复制构造函数,答案为 B。 30 【正确答案】 D 【试题解析】 函数 f()的功能:根据形参整型数组 a和下标 index,返回数组 a中元素 aindex的引用, main 函数定义数组 a并初始化,调用 f()函数并输出函数的返回值。所以输出结果为 a2, a2=5,答案为 D。 31 【正确答案
13、】 A 【试题解析】 C+中,派生类构造函数都是先调用基类构造函数,再根据声明次序定义数据成员,另外对于多继承,派生 类的构造函数初始化列表中,基类构造函数是按照基类在派生类的派生列表中出现的次序调用的;而析构函数是按构造函数运行顺序的逆序进行调用的,可知题目中析构函数的调用顺序为:派生类Derived的析构函数, Base1的析构函数, Base2的析构函数;答案为 A。 32 【正确答案】 D 【试题解析】 软件需求分析方法包括结构化分析方法和面向对象的分析方法两大类,前者常用工具为数据流图( DFD)、数据字典( DD)、判定表、判定树等。故 D选项正确。 33 【正确答案】 D 【试题
14、解析】 this 作用域 是在类内部,当在类的非静态成员函数中访问类的非静态成员时,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。另外,全局函数和静态函数都不能使用 this 指针。所以答案为 D。 34 【正确答案】 C 【试题解析】 根据二叉树的基本性质 3:在任意一棵二叉树中,度为 0的叶子节点总是比度为 2的节点多一个,所以本题中是 5 1 6个。 35 【正确答案】 A 【试题解析】 运算符重载为成员函数时,会省略一个参数,如果无参数,表明是一元运算符。一元运算符既可以作为成员函数重载,也可以作为非成员函数 重载。二元运算符如果作为非成员函数,则参数表中必须有两个参数。 C
15、+有 5个运算符不能重载,它们是: .(成员访问运算符 )、 .*(成员指针访问运算符 )、: (域运算符 )、 sizeof(长度运算符 )和 ?: (条件运算符 )。故本题答案为 A。 36 【正确答案】 C 【试题解析】 本题主要考察虚函数。虚函数指在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,本题中定义类 GA 的对象 a,执行show(a)、 display(a),输出 11,定义了类 GB 的对象 b,执行 show(b),仍然输出1, display(b)执行会调用派生类的 f函数,因为 f 函数为虚函数,输出 2,所以本题答案为 C。 37 【正
16、确答案】 C 【试题解析】 本题中 while循环中当 i为偶数时输出 *,而 i为 100时跳出循环,所以输出 49个 *,答案为 C。 38 【正确答案】 B 【试题解析】 本题考查对象成员的引用,派生类公用继承基类,但是不能继承基类的私有成员,所以执行 voidPrint()constcoutx=x, this-y=y; (2)voidshow()consttout(x, y ); (3): p1(pt1), p2(pt2)或 p1=pt1; p2=pt2 【试题解析】 (1)主要考查考生对构造函数的掌握,因为形参名和私有成员名称一样,因此不能直接赋值,在这里使用成员列表初始化,也可以使
17、用 this 指针赋值。 (2)主要考查考生对语句基本语法的掌握,根据语句:voidshow()consteout(x, y)。可看出函数体 内并没有 “; ”作为cout语句的结束符,因此程序错误。 (3)主要考查考生对构造函数的掌握,形参是 pt1和 pt2,这里写反了,也可以使用成员列表初始化法,可以避免这种错误。 三、简单应用题 42 【正确答案】 (1)is_male(is_male), birth_date(birth_date) (2)returnstrcmp(name, p name); (3)birth_date getMonth()“月 “ 【试题解析】 (1)主要考查考生对构造函数的掌握情况, Person 类在 构造函数 的成员初始化列表中完成对数据成员 is_male、 birth_date的初始化。 (2)主要考查考生对成员函数定义的掌握, compareName(constPerson int counter = 1; int length = strlen(str); for (int i = 0; i length; i+)