1、国家二级(C+)机试-试卷 9-1 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.if 语句的语法格式可描述为: 格式 1:if() 或 格式 2:if() else 关于上面的语法格式,下列表述中错误的是( )。(分数:2.00)A.部分可以是一个 if 语句,例如 if(if(a=0)B.部分可以是一个 if 语句,例如 if()if()C.如果在前加上逻辑非运算符!并交换和的位置,语句功能不变D.部分可以是一个循环语句,例如 if()while()2.下列关于派生类构造函数和析构函数的说法中,错误的是( )。(分数:2.00)A.派生
2、类的构造函数会隐含调用基类的构造函数B.如果基类中没有缺省构造函数,那么派生类必须定义构造函数C.在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数D.在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数3.有如下语句序列:char str10; cinstr;当从键盘输入“I love this game“时,str 中的字符串是( )。(分数:2.00)A.IlovethisgameB.IlovethiC.IloveD.I4.下列语句中,正确的是(分数:2.00)A.charstr=“abcde“;B.char*str=“abcde“;C.charstr5=“ab
3、cde“;D.char*str5=“abcde“;5.有如下程序: #include using namespace std; class Base public: void fun() coutfun();C.Base:fun();D.fun();6.设循环队列的存储空间为 Q(1:35),初始状态为 front=rear=35。现经过一系列入队与退队运算后,front=15,rear=15,则循环队列中的元素个数为(分数:2.00)A.15B.16C.20D.0 或 357.下列关于运算符重载的表述中,错误的是(分数:2.00)A.所有的运算符都可以通过重载而赋予其新的含义B.有的运算符只
4、能作为成员函数重载C.不得为重载的运算符函数的参数设置默认值D.有的运算符可以作为非成员函数重载8.有如下类定义: class Bag public: Bag(); / void SetSize(string s); / string GetSize() const; / friend void Display(Bag / private: string size; ;在标注号码的 4 个函数中,不具有隐含 this 指针的是(分数:2.00)A.B.C.D.9.算法的有穷性是指( )。(分数:2.00)A.算法程序的运行时间是有限的B.算法程序所处理的数据量是有限的C.算法程序的长度是有限的
5、D.算法只能被有限的用户使用10.下列关于函数的叙述中,正确的是(分数:2.00)A.C+不允许函数嵌套定义B.C+中所有函数都有返回值C.函数的形参列表一定不能为空D.调用函数时一定会执行完函数体的最后一条语句11.有如下类定义: class Base1 int m; public: Base(int m1): m(m1) ; class Base2 int n; public: Base(int n1): n(n1) ; class Derived: public Base2,public Base1 int q; public: Derived(int m1, int n1, int q
6、1): q(q1),Base1(m1),Base2(n1); ;在创建一个 Derived 对象时,数据成员 m、n 和 q 被初始化的顺序是(分数:2.00)A.m、n、qB.n、m、qC.q、m、nD.q、n、m12.某二叉树中有 15 个度为 1 的结点,16 个度为 2 的结点,则该二叉树中总的结点数为(分数:2.00)A.32B.46C.48D.4913.有如下类定义: class MyClass public: MyClass(double d=0.0):val(d) _ /运算符函数-的声明 private: double val; ;若要使语句序列 MyClass y(4.6)
7、,z; z=6.7-y;能够正常运行,横线处的声明语句应为(分数:2.00)A.friendMyClassoperator-(MyClassB.friendMyClassoperator-(double,MyClass);C.friendMyClassoperator-(MyClassD.friendMyClassoperator-(double14.有如下类定义: class Pet char name30; public: Pet(char * n) strcpy(name, n); void bark() coutbark()D.(*p).bark()15. (分数:2.00)A.投影B
8、.交C.选择D.并16.下列关于 this 指针的描述中,正确的是(分数:2.00)A.下列关于 this 指针的描述中,正确的是B.类的 const 成员函数都有 this 指针C.任何静态成员函数都有 this 指针D.类的非静态成员函数都有 this 指针17.某二叉树的前序序列为 ABCD,中序序列为 DCBA,则后序序列为(分数:2.00)A.BADCB.DCBAC.CDABD.ABCD18.有如下程序: #include using namespace std; void fun(int x=y/4; x+; int main() int x=4,y=5; fun(x,y); co
9、utstr;当从键盘输入“I love this game“时,str 中的字符串是( )。(分数:2.00)A.IlovethisgameB.IlovethiC.IloveD.I 解析:解析:cin 是 C+预定义的标准输入流对象,cin 用来接收字符串时,遇“空格“、“TAB“、“回车“时都会结束。所以本题答案为 D。4.下列语句中,正确的是(分数:2.00)A.charstr=“abcde“;B.char*str=“abcde“; C.charstr5=“abcde“;D.char*str5=“abcde“;解析:解析:本题考查字符串的定义,A 选项中,定义了一个字符,而用字符串赋值,所
10、以错误,C 选项定义了字符数组,但是赋值的字符串实际上有 6 个字符,所以赋值错误,D 选项定义了一个字符串指针数组,赋值错误。5.有如下程序: #include using namespace std; class Base public: void fun() coutfun();C.Base:fun(); D.fun();解析:解析:本题考查派生类对基类成员的访问属性,派生类公用继承基类,所以派生类可以直接使用基类的公用成员,题目中输出了 Base:fun,所以可以推断派生类一定是调用了基类的 fun 函数,只有 C 选项正确调用了基类的 fun 函数,所以 C 选项正确。6.设循环队列
11、的存储空间为 Q(1:35),初始状态为 front=rear=35。现经过一系列入队与退队运算后,front=15,rear=15,则循环队列中的元素个数为(分数:2.00)A.15B.16C.20D.0 或 35 解析:解析:在循环队列中,用队尾指针 rear 指向队列中的队尾元素,用排头指针 front 指向排头元素的前一个位置。在循环队列中进行出队、入队操作时,头尾指针仍要加,朝前移动。只不过当头尾指针指向向量上界时,其加操作的结果是指向向量的下界。由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时,头尾指针均相等。答案为 D 选项。7.下列关于运算符重载的表述
12、中,错误的是(分数:2.00)A.所有的运算符都可以通过重载而赋予其新的含义 B.有的运算符只能作为成员函数重载C.不得为重载的运算符函数的参数设置默认值D.有的运算符可以作为非成员函数重载解析:解析:本题考查运算符重载,重载不能改变运算符运算对象的个数;不能改变运算符的优先级别;不能改变运算符的结合性;重载运算符的函数不能有默认值,否则就改变了运算符参数的个数;不能定义新的运算符,某些运算符不能重载。所以 A 选项错误。8.有如下类定义: class Bag public: Bag(); / void SetSize(string s); / string GetSize() const;
13、/ friend void Display(Bag / private: string size; ;在标注号码的 4 个函数中,不具有隐含 this 指针的是(分数:2.00)A.B.C.D. 解析:解析:当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数,所以正确使用 this 指针。9.算法的有穷性是指( )。(分数:2.00)A.算法程序的运行时间是有限的 B.算法程序所处理的数据量是有限的C.算法程序的长度是有限的D.算法只能被有限的用户使用解析:解析:算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。有穷性是指算
14、法程序的运行时间是有限的。10.下列关于函数的叙述中,正确的是(分数:2.00)A.C+不允许函数嵌套定义 B.C+中所有函数都有返回值C.函数的形参列表一定不能为空D.调用函数时一定会执行完函数体的最后一条语句解析:解析:C+中函数可以不返回任何值,不返回任何值指定返回类型为 void 类型;函数形参表可以为空,但不能省略;函数调用过程中,可能会由于 return 语句或者异常终止执行,不一定会执行完最后一条语句;B、C、D 错误;函数不允许嵌套定义,答案为 A。11.有如下类定义: class Base1 int m; public: Base(int m1): m(m1) ; class
15、 Base2 int n; public: Base(int n1): n(n1) ; class Derived: public Base2,public Base1 int q; public: Derived(int m1, int n1, int q1): q(q1),Base1(m1),Base2(n1); ;在创建一个 Derived 对象时,数据成员 m、n 和 q 被初始化的顺序是(分数:2.00)A.m、n、qB.n、m、q C.q、m、nD.q、n、m解析:解析:C+中,派生类构造函数都是先调用基类构造函数,再根据声明次序定义数据成员,所以Derived 构造函数的初始化列
16、表中,最后初始化 q;另外对于多继承,派生类的构造函数初始化列表中,基类构造函数是按照基类在派生类的派生列表中出现的次序调用的;由于 Derived 类的派生列表中,Base2 在前,所以应该先调用 Base2 的构造函数;这样 Derived 类中初始化顺序为:基类 Base2、基类Base1、数据成员 q;所以数据成员 m、n、q 的初始化顺序为:n、m、q,答案为 B。12.某二叉树中有 15 个度为 1 的结点,16 个度为 2 的结点,则该二叉树中总的结点数为(分数:2.00)A.32B.46C.48 D.49解析:解析:在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中
17、最大的度称为树的度。对任何一棵二叉树,度为 0 的结点(即叶子结点)总是比度为 2 的结点多一个。由 16 个度为 2 的结点可知叶子结点个数为 17,则结点结点总数为 16+17+15=48,C 选项正确。13.有如下类定义: class MyClass public: MyClass(double d=0.0):val(d) _ /运算符函数-的声明 private: double val; ;若要使语句序列 MyClass y(4.6),z; z=6.7-y;能够正常运行,横线处的声明语句应为(分数:2.00)A.friendMyClassoperator-(MyClassB.frien
18、dMyClassoperator-(double,MyClass); C.friendMyClassoperator-(MyClassD.friendMyClassoperator-(double解析:解析:由调用函数 6.7-y 可知,double 类型在运算符“-“的左边,应该作为运算符函数“-“的第一形参,选项 A、C 错误;由于运算符“-“函数并不改变操作数的状态,所以形参应该声明为 const 对象的引用,或者按值传递,参数按引用类型传递可能会改变操作数的状态,选项 D 错误;答案为 B。14.有如下类定义: class Pet char name30; public: Pet(ch
19、ar * n) strcpy(name, n); void bark() coutbark()D.(*p).bark()解析:解析:Pet 类指针 p 指向 my_dog 对象,通过指针访问类对象的成员函数,与通过指针访问内置类型对象一样,有两种方法:p-bark()、(*p).brak(),选项 A 错误,答案为 A。15. (分数:2.00)A.投影 B.交C.选择D.并解析:解析:用于查询的 3 个操作无法用传统的集合运算表示,引入的运算为投影运算、选择运算、笛卡尔积。常用的扩充运算有交、除、连接及自然连接等。投影,从关系模式中指定若干个属性组成新的关系,题目中从 R 中指定 AB 组成
20、新的关系 T,故 A 选项正确。选择,从关系中找出满足给定条件的元组的操作称为选择,即结果 T 应该包含 R 中全部属性,故 C 选项错误。假设,R 与 S 经过某种关系得到 T,则并:RS 是将 S 中的记录追加到 R 后面;交:RS 结果是既属于 R 又属于 S 的记录组成的集合。上述两种操作中,关系 R 与 S 以及 T 要求有相同的结构,故 B、D 选项错误。16.下列关于 this 指针的描述中,正确的是(分数:2.00)A.下列关于 this 指针的描述中,正确的是B.类的 const 成员函数都有 this 指针C.任何静态成员函数都有 this 指针D.类的非静态成员函数都有
21、this 指针 解析:解析:C+中,静态成员是类的组成部分,不是任何对象的组成部分,因此静态成员函数没有 this指针,类的非 const 成员函数包括静态成员函数,所以选项 A、C 错误;答案选 B 或 D。17.某二叉树的前序序列为 ABCD,中序序列为 DCBA,则后序序列为(分数:2.00)A.BADCB.DCBA C.CDABD.ABCD解析:解析:二叉树遍历可以分为 3 种:前序遍历(访问根结点在访问左子树和访问右子树之前)、中序遍历(访问根结点在访问左子树和访问右子树两者之间)、后序遍历(访问根结点在访问左子树和访问右子树之后)。本题中前序序列为 ABCD,中序序列为 DCBA,
22、可知 D 为根结点,ABC 为左侧结点,C 为 D 左子结点,A 为 B 子结点,故后序序列为 DCBA,故 B 选项正确。18.有如下程序: #include using namespace std; void fun(int x=y/4; x+; int main() int x=4,y=5; fun(x,y); cout,所以 B 选项错误。25.下列定义语句中,错误的是(分数:2.00)A.int*p10;B.int*p();C.int(*p)();D.intp*; 解析:解析:本题考查一维数组和指针,A 选项为一维指针数组,B、C 选项为函数指针,D 选项定义指针方式不对,*号应该在
23、 p 的左边。所以答案为 D。26.有如下类定义: class Cup public: _ /构造函数声明 private: double price; ;其中下划线处缺失的构造函数声明是(分数:2.00)A.voidCup(doubleprice);B.Cup(doublePrice); C.myCup(doubleprice);D.staticCup(doubleprice);解析:解析:本题考查构造函数的定义,构造函数名为类的名称,所以只有 B 选项正确。27.算法的有穷性是指( )。(分数:2.00)A.算法程序的运行时间是有限的 B.算法程序所处理的数据量是有限的C.算法程序的长度是
24、有限的D.算法只能被有限的用户使用解析:解析:算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。有穷性是指算法程序的运行时间是有限的。28.下列运算符中,可以重载为类的友元函数的运算符是(分数:2.00)A.=B.()CD.“必须重载为成员函数,这些操作符定义为非成员函数将在编译时标记为错误,友元函数是非成员函数,上面四种操作符不能重载为类的友元函数,另外成员访问操作符“.“不能重载,答案为 D。29.有如下的类声明: #include using namespace std; class AA public: virtual void disp() coutprint();)
25、解析:解析:(1)主要考查考生对构造函数的掌握情况,默认构造函数的参数值必须从右到左。 (2)主要考查考生对 const 函数的掌握情况,函数体中有语句:x += xOff;,成员变量值改变,因此函数不能使用const。 (3)主要考查考生对指针的掌握情况,由于 p 为指针类型,因此调用成员函数时要使用标识符-。三、简单应用题(总题数:1,分数:2.00)42.请使用 VC6 或使用【答题】菜单打开考生文件夹 pmj2 下的工程 proj2,其中定义了 Employee 类和Manager 类。Employee 用于表示某公司的雇员,其属性包括姓名(name)和工作部分(dept)。Manag
26、er 是Employee 的公有派生类,用于表示雇员中的经理。除了姓名和工作部分之外,Manager 的属性还包括级别(level)。Employee 类的成员函数 print 用于输出雇员的信息;Manager 类的成员函数 print 负责输出经理的信息。请在横线处填写适当的代码,然后删除横线,以实现上述类定义。此程序的正确输出结果应为:Name:SallySmithDept:SMesLevel:2 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“*found*”。#includeiosLream#includestringusingnamespacestcl
27、;classEmployeepublic:Employee(stringFlame,stringdept):*found*virtualvoidprint()const;stringdept()const返回部门名称*found*virtualEmployee()private:stringname_;stringdept_;classManager:publicEmployeepublic:Nanager(stringname,stringdept,intlevel):*found* virtualvoidprint()const;private:intlevel;voidEmployee:
28、print()constcout“Name:“name_end1;cout“Dept:“dept_end1;voidNanager:print()const*found*cout“Level:“levelend1;intmain()Employee*erap=newNanacjer(“SallySmith”,”Sales”,2);emp-print:();deleteemp;return0;(分数:2.00)_正确答案:(正确答案:(1)nanle_(naiTle),dept_(dept) (2)returndept_; (3)Employee(name,dept),level_(1evel)
29、 (4)Employee:print();)解析:解析:(1)主要考查考生对构造函数的掌握,这里使用成员列表初始化法对私有成员初始化。 (2)主要考查考生对成员函数的掌握,题目要求返回部门名称,因此这里是一条返回语句。函数要求返回的类型为 string,因此直接返回 dept_即可。 (3)主要考查考生对构造函数的掌握,因为 Manager 类是Employee 类的派生类,因此它的构造函数要先对基类初始化,应使用成员列表初始化。 (4)主要考查考生对虚函数的掌握,因为 Manager 类是 Errrployee 类的派生类,因此它的 print 函数可以先调用基类的print 函数,再输出自
30、身要输出的数据,故为 Employee:prim();。四、综合应用题(总题数:1,分数:2.00)43.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj3 下的工程 proj3,其中声明的 Matrix 是一个用于表示矩阵的类。operator+的功能是实现两个矩阵的加法运算。例如,若有两个 3 行 3 列的矩阵 则 A 与 B 相加的和为 (分数:2.00)_正确答案:(正确答案:Matrix m; for (int i = 0; i M; i+) for (int j = 0; j N; j+) m.setElement(i, j, (m1.getElement(i,j) + m2.getElement(i,j); return m;)解析:解析:主要考查考生对运算符重载的掌握,本题使用二维数组表示矩阵,使用 for 循环遍历数组的每个元素,将位置一样的两个数组元素相加,放入新的二维数组中。