1、二级C+笔试377二级C+笔试-377(总分:100.00,做题时间:90分钟)一、选择题(总题数:35,分数:70.00)1.下面是关于派生类声明的开始部分,其中正确的是( )。(分数:2.00)A.class virtual B:public AB.virtual class B:public AC.class B:public A virtualD.class B:virtual public A解析:解析 声明派生类的一般形式为:class派生类名:继承方式基类名。其中继承方式包括:public,private,protected,而virtual为C+中的关键字。虚函数的使用方法是在
2、基类用virtual声明成员函数为虚函数。2.下列叙述中正确的是( )。(分数:2.00)A.一个逻辑数据结构只能有一种存储结构B.逻辑结构属于线性结构,存储结构属于非线性结构C.一个逻辑数据结构可以有多种存储结构,且各种存储结构不影响数据处理的效率D.一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率解析:解析 数据的存储结构是指数据的逻辑结构在计算机存储空间中的存放形式,一种数据结构可以根据需要采用不同的存储结构,常用的存储结构有顺序和链式结构。采用不同的存储结构,其处理的效率是不同的。3.在软件开发中,需求分析阶段产生的主要文档是( )。(分数:2.00)A.可行性分析
3、报告B.集成测试计划C.概要设计说明书D.软件需求规格说明书解析:解析 软件的生命周期分为计划、开发和运行3个时期。其中计划期包括问题定义和可行性研究。运行的任务是软件维护。开发期包括分析、设计和实施:分析即为需求分析。需求分析的最终结果是生成软件需要规格说明书,可以为用户、分析人员和设计人员之间的交流提供方便。4.有如下程序:#includeiostreamusing namespace std;class Apublic:A()coutA;A()coutA;class B:public AA*p;public:B()coutB;p=new A;B()coutB;delete p;int m
4、ain()B obj;return 0;执行这个程序的输出结果是( )。(分数:2.00)A.BAAABAB.ABABAAC.BAABAAD.ABAABA解析:解析 此题考查的是类的构造函数和析构函数。派生类构造函数的执行顺序为:首先调用基类的构造函数,调用顺序按它们被继承时说明的顺序;然后调用子对象的构造函数,调用顺序按它们在类中说明的顺序;最后是派生类构造函数中的内容。因此本题中,首先调用基类构造函数输出A,然后调用子对象的构造函数输出B,p=new A再调用类A的构造函数输出A;析构函数的调用顺序和构造函数的调用顺序相反。5.若要把函数void fun()定义为TestClass的友元函
5、数,则应该在类TestClass的定义中加入的语句是( )。(分数:2.00)A.void friend fun()B.friend fun()C.friend void fun()D.TestClass void fun()解析:解析 如果在类以外的其他地方定义了一个函数,在类体中用friend对该函数进行声明,此函数就称为本类的友元函数。因为函数为void fun(),根据友元定义补全语句为“friend voidfun();”。6.如果一个关系中,存在多个属性(或属性组)都能用来唯一标识该关系的元组,且其任何一个子集都不具有这一特性。这些属性(或属性组)都被称为关系的( )。(分数:2.
6、00)A.连接码B.主码C.外码D.候选码解析:解析 在关系中凡能惟一标识元组的最小属性集称为该表的键或码。二维表中可能有若干个键,它们称为该表的候选码或候选键。从二维表的所有候选键中选取一个作为用户使用的键称为主键或主码。7.已知一个有序线性表为(13,18,24,35,47,50,62,83,90,115,134),当用二分法查找值为90的元素时,查找成功的比较次数为( )。(分数:2.00)A.1B.2C.3D.9解析:解析 根据二分法查找法需要两次:首先将90与表中间的元素50进行比较,由于90大于50,所以在线性表的后半部分查找。第二次比较的元素是后半部分的中间元素,即90,这时两者
7、相等,即查找成功。8.在函数中,可以用auto、extern、register和static这四个关键字中的一个来说明变量的存储类型,如果不说明存储类型,则默认的存储类型是( )。(分数:2.00)A.autoB.externC.registerD.static解析:解析 此题考查的是存储类型。C+语言变量的存储类型分为如下几种类型:auto函数内部的局部变量;static静态存储分配;extern全局变量;register变量存储在硬件寄存器中。9.类MyClass的定义如下,若要对value赋值,则下面语句正确的是( )。class MyClasspublic:MyClass()MyCla
8、ss(int i)value=new int(i);int*value;(分数:2.00)A.MyClass my;my.value=10;B.MyClass my;*my.value=10;C.MyClass my;my.*value=10;D.MyClass my(10);解析:解析 因题目中定义的指针value是指向变量i的,所以直接利用语句MyClass(int i)value=new int(i);对value进行赋值即可。10.字面常量42、4.2、42L的数据类型分别是( )。(分数:2.00)A.long,double,intB.long,float,intC.int,doub
9、le,longD.int,float,long解析:解析 此题考查的知识点是字面常量。对于整型字面常量,只要没有超过C+中整数所能表示的范围,C+将自动按整数来存储此数,也可以通过在整型字面常量后添加u或1来指定无符号整数或长整数来存储;对于实型字面常量,C+将自动按照双精度数来存储,也可以通过在实型字面常量后添加f来指定按单精度数存储。11.已知递归函数fun的定义如下:int fun(int n)if(n=1)return1;/递归结束情况else return n*fun(n-2);/递归则函数调用语句fun(5)的返回值是( )。(分数:2.00)A.5B.12C.15D.30解析:解
10、析 递归函数fun被定义为含有参数int n,返同整型。其中fun函数递归调用本身,当n=1时,fun返回1,如果大于1那么执行n*fun(n-2)。所以,当n等于5时,执行5*fun(3);当3时继续调用fun,3*fun(1),即fun(5)=5*(3*fun(1),答案为15。12.有下列二叉树,对此二叉树中序遍历的结果为( )。(分数:2.00)A.BDYEACFXZB.DYBEAFCZXC.ABCDEFXYZD.ABDYECFXZ解析:解析 对二叉树的中序遍历是指:首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右予树时,注意依旧按照“左子树根结点右子树”的顺序。本题的遍历
11、顺序是这样的:首先访问左子树:BDEY;在左子树BDEY中,也按中序遍历,先访问左子树DY;在左子树DY中,也按中序遍历,先访问左子树,左子树没有,则访问根结点D,然后访问右子树Y;接着访问根B,再访问右子树E;访问左子树BDEY后,接着访问根结点A,接着访问右子树CFXZ;右子树CFXZ的访问顺序同理可得:FCZX。13.关于结构化程序设计原则和方法的描述错误的是( )。(分数:2.00)A.选用的结构只准许有一个入口和一个出口B.复杂结构应该用嵌套的基本控制结构进行组合嵌套来实现C.不允许使用GOTO语句D.语言中所没有的控制结构,应该采用前后一致的方法来模拟解析:解析 限制使用GOTO语
12、句是结构化程序设计的原则和方法之一,但不是绝对不允许使用GOTO语句。其他三项为结构化程序设计的原则。14.在数据库设计中,将E-R图转换为关系模式的过程属于( )。(分数:2.00)A.需求分析阶段B.逻辑设计阶段C.概念设计阶段D.物理设计阶段解析:解析 数据库设计阶段主要包括需求分析、概念设计、逻辑设计和物理设计。其中逻辑设计的主要工作是将E-R图转换为关系模式。15.有如下程序:#includeiostreamusing namespace std;class sampleprivate:int x,y;public:sample(int i,int j)x=i;y=j;void di
13、sp()coutdisp1endl;void disp()constcoutdisp2endl;int main()const sample a(1,2);a.disp();return 0;该程序运行后的输出结果是( )。(分数:2.00)A.disp1B.disp2C.disp1 disp2D.程序编译时出错解析:解析 因为对象a被定义为常对象,所以a.disp()语句调用的是类的常成员函数void disp()const,输出的结果是disp2。16.设R是一个2元关系,有3个元组,S是一个3元关系,有4个元组。如T=RS,则T的元组为( )个。(分数:2.00)A.6B.8C.12D.
14、16解析:解析 R为n元关系,S为m元关系,分别有p、q两个元组。两个关系笛卡儿积后,新关系是一个n+m元的关系,元组个数是qp。知识拓展 通俗而言,所谓“元”就好像表格中有多少列,“元组”就好像表格中有多少行。17.有如下程序:#includeiost earnusing namespace std;class TestClassprotected:TestClass()coutx;TestClass(char C) coutc;class TestClass1:public TestClasspublic:TestClass1(char C) Coutc;);int main()TestC
15、lass1 d1(y);return 0;执行这个程序,屏幕上将显示输出( )。(分数:2.00)A.yB.yxC.xyD.yy解析:解析 程序中的类TestClass为基类,TestClass1为TestClass的派生类。由main主函数入手,定义TestClass1类型的对象d1,参数值为y。TestClass1类继承TestClass,所以主函数中“TestClass1 d1(y);”语句首先调用调用基类中的“TestClass()coutx;)”输出x,然后调用“TestClass1(char C) coutc;”输出y,即答案为“xy”。18.若有以下程序:#includeiost
16、reamusing namespace std;class TestClasspublic:void who()coutTestClassendl;class TestClass1:public TestClasspublic:void who()coutTestClass1endl;int main()TestClass *p;TestClass1 obj1;P=&obj1;P-who();return 0;则该程序运行后的输出结果是( )。(分数:2.00)A.TestClass1B.TestClassC.0D.无输出解析:解析 程序中的TestClas1为TestClass的派生类,主函
17、数main中定义TestClass对象*p,TestClass1对象obj1,然后p引用obj1,执行p-who()则是调用基类中的who函数,输出TestClass。19.有如下程序:#includeiostreamusing namespace std;class Testpublic:Test() n+=2;Test() n-=3;static int getNum()return n;private:static int n;int Test:n=1;int main()Test*p=new Test;delete p;coutn=Test:getNum()endl;return 0;
18、执行后的输出结果是( )。(分数:2.00)A.n=0B.n=1C.n=2D.n=3解析:解析 语句Test*p=new Test;会调用类的构造函数Test() n+=2;,使n的值由原来的1变为3,然后delete p调用类的析构函数Test() n-=3;,因为n是static型变量,所以会在3的基础上减3使得输出结果为0。20.若有以下程序:#includeiostreamusing namespace std;class Apublic:A(int i,int j)a=i;b=j;void move(int x,int y)a+=x;b+=y;void show()couta,ben
19、dl;private:int a,b;class B:private Apublic:B(int i,int j):A(i,j)void fun()move(3,5);void fl()A:show();int main()B d(3,4);d.fun();d.fl();return 0;程序执行后的输出结果是( )。(分数:2.00)A.3,4B.6,8C.6,9D.4,3解析:解析 此题的执行过程如下:首先B d(3,4);语句调用B类的构造函数:B(int i,int j),B的构造函数中调用基类A的构造函数,使得a=3,b=4;d.fun()会调用函数move(3,5),使得(3,4)
20、和(3,5)的对应部分分别相加,最后输出6,9。21.下列有关拷贝构造函数的描述中错误的是( )。(分数:2.00)A.拷贝构造函数是一种构造函数B.拷贝构造函数与一般的构造函数一样,可以设置多个形参C.每一个类中都必须有一个拷贝构造函数D.拷贝构造函数的功能是用一个已知对象去初始化一个正在创建的对象解析:解析 拷贝构造函数是一个特殊的构造函数,它用一个己知的对象初始化一个正在创建的同类对象,它不能指定函数返回类型;只有一个参数,是同类的某个对象名的引用。每一个类中都必须有一个拷贝构造函数,如果类中未声明,编译器会目动生成一个公有的拷贝构造函数。22.有如下类的定义,横线处的语句是( )。cl
21、ass TestClass_ int x,y;public:TestClass(int a=0,int b=0)X=a:y=b;static void change()y-=10;y-=10;(分数:2.00)A.publicB.privateC.staticD.protected解析:解析 因为static void change()为静态函数,静态函数主要访问静态数据,不访问非静态数据。所以函数中访问了数据y,所以下划线的数据类型应对应为static。23.下面叙述错误的是( )。(分数:2.00)A.派生类可以使用private派生B.对基类成员的访问必须是无二义性的C.基类成员的访问能
22、力在派生类中维持不变D.赋值兼容规则也适用于多继承的组合解析:解析 在建立派生类的时候,并不是简单地把基类的私有成员直接作为派生类的私有成员,把基类的公用成员直接作为派生类的公用成员。涉及如何确定基类的成员在派生类中的访问属性问题,不仅要考虑对基类成员所声明的访问属性,还要考虑派生类所声明的对基类的继承方式,根据这两个因素共同决定基类成员在派生类中的访问属性。所以本题选择C)。24.下面的描述中,正确的是( )。(分数:2.00)A.virtual可以用来声明虚函数B.含有纯虚函数的类是不可以用来创建对象的,因为它是虚基类C.即使基类的构造函数没有参数,派生类也必须建立构造函数D.静态数据成员
23、可以通过成员初始化列表来初始化解析:解析 在基类中用virtual声明成员函数为虚函数,所以A是正确的。纯虚函数是在声明虚函数时被“初始化”为0的虚函数。纯虚函数是一种特殊的虚函数,它没有具体的实现。静态数据成员函数只能在类外进行初始化。25.假定MyClass为一个类,那么下列的函数说明中,( )为该类的析构函数。(分数:2.00)A.voidMyClass();B.MyClass(int n);C.MyClass();D.MyClass();解析:解析 C+语言中析构函数为符号“”加类名,且析构函数没有返回值和参数,故前不加void关键字。所以正确的形式应该是MyClass()。26.若有
24、如下程序:#includeiostreamusing namespace std;int s=0;class samplestatic int n;public:sample(int i)n=i;static void add()S+=n;int sample:n=0;int main()sample a(2),b(5);sample:add();coutsendl;return 0;程序运行后的输出结果是( )。(分数:2.00)A.2B.5C.7D.3解析:解析 执行语句“sample a(2),b(5)”;的结果是使n的值最终变为5,sample:add()语句调用函数static vo
25、id add(),使得s=s+n=5。27.下列重载函数中,正确的是( )。(分数:2.00)A.void fun(int a,floatb);void fun(int C,floatd)B.void fun(int a,floatb);void fun(float a,intb)C.float fun(int a,floatb);int fun(int b,floata)D.int fun(int a,intb);float fun(int a,int解析:解析 所谓函数重载是指同一函数名可以对应多个函数实现。进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。28.要使程序执
26、行后的输出结果为ABCD,应在横线处添加语句( )。#includeiostreamusing namespace std;public:A()coutA;class B=_public:B()coutB;class C:virtual public Apublic:C()coutC;class D:public B,public Cpublic:D()coutD;void main()D obj;(分数:2.00)A.public AB.private AC.protected AD.virtual public A解析:解析 由主函数main入手,定义了类D对象obj。其中D为类B和C的公
27、有继承,A是C的虚基类。题目中要求的输出结果为“ABCD”,依次为类A,类B,类C,类D中构造函数的输出语句。为了保证基类通过多条路径被派生类继承时,即保证A只被继承一次,输出一个A,所以不但需要声明A为C的虚基类,同样也要声明A为B的虚基类。29.下列有关继承和派生的叙述中,正确的是( )。(分数:2.00)A.如果一个派生类私有继承其基类,则该派生类对象不能访问基类的保护成员B.派生类的成员函数可以访问基类的所有成员C.基类对象可以赋值给派生类对象D.如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类解析:解析 如果派生类私有继承基类,不能访问基类中的私有成员,所以A)、B)是错
28、误的。派生类是对基类的具体化,所以C)错误的。如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类,即选择D)。30.下列程序的输出结果为2,横线处应添加语句( )。#includeiostreamusing namespace std;public:_void fun()cout1;class TestClass2:public TestClass1public:void fun()cout2;);int main()TestClass1 *p=new TestClass2;p-fun();delete p;Teturn 0;(分数:2.00)A.publicB.privateC.virtualD.protected解析:解析 由主函数main入手,定义TestClass1类的指针对象p指向派生类Testclass2。因为基类和派生类中都有fun函数,题目要求输出为2,就是基类对象访问派生类
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1