1、二级 C+笔试-318 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:35,分数:70.00)1.下列有关继承和派生的叙述中,正确的是(分数:2.00)A.如果一个派生类私有继承其基类,则该派生类对象不能访问基类的保护成员B.派生类的成员函数可以访问基类的所有成员C.基类对象可以赋值给派生类对象D.如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类2.有如下程序: #include iostream using namcspace std; int main( ) void function(double val); double val; functio
2、n(val); eoutval; return 0; void function(double val) val=3: 编译运行这个程序将出现的情况是(分数:2.00)A.编译出错,无法运行B.输出:3C.输出:3.0D.输出一个不确定的数3.数据库设计的 4 个阶段是:需求分析、概念设计、逻辑设计和(分数:2.00)A.编码设计B.测试阶段C.运行阶段D.物理设计4.有如下类定义: class Foo public: Foo(int v):value(v) / Foo() / private: Foo( ) / int value=0; / ; 其中存在语法错误的行是(分数:2.00)A.B
3、.C.D.5.在数据库系统中,用户所见的数据模式为(分数:2.00)A.概念模式B.外模式C.内模式D.物理模式6.从工程管理角度,软件设计一般分为两步完成,它们是(分数:2.00)A.概要设计与详细设计B.数据设计与接口设计C.软件结构设计与数据设计D.过程设计与数据设计7.对下列二叉树: (分数:2.00)A.ACBDFEGB.ACBDFGEC.ABDCGEFD.FCADBEG8.下列有关内联函数的叙述中,正确的是(分数:2.00)A.内联函数在调用时发生控制转移B.内联函数必须通过关键字 inline 来定义C.内联函数是通过编译器来实现的D.内联函数体的最后一条语句必须是 return
4、 语句9.有如下程序: #include iostream using namespace std: class A public: virtual void funcl( )cout“A1“; void func2( )cout“A2“; ; class B:public A public: void funcl( )cout“B1“; void fllnc2( )cout“B2“; ; int main( ) A*p=new B; p-funcl( ); p-func2( ); return 0: 运行程序,屏幕上将显示输出(分数:2.00)A.B182B.A1A2C.BlA2D.AlB2
5、10.有如下运算重载函数定义: Double operator+(int i,int k)return double(i+k); 但定义有错误,对这个错误的最准确的描述是(分数:2.00)A.+只能作为成员函数重载,而这里的+是作为非成员函数重载的B.两个 int 型参数的和应该是 int 型,而这里将+的返回类型声明为 doubleC.没有将运算符重载函数声明为某个类的友元D.C+已经提供了求两个 int 型数据之和运算符+,不能再定义同样的运算符11.下面是重载为非成员函数的运算符函数原型,其中错误的是(分数:2.00)A.Fraction operator+(Fraction,Fract
6、ion);B.Fraction operator-(Fraction);C.Fraction cout“The value at P:“*P: return 0; 编译运行程序将出现的情况是(分数:2.00)A.编译时出现语法错误,不能生成可执行文件B.运行时一定输出:The value at P:9C.运行时一定输出:The value at P:*9D.运行时有可能出错33.下列选项中不属于软件生命周期开发阶段任务的是(分数:2.00)A.软件测试B.概要设计C.软件维护D.详细设计34.语句 ofstream f(“SALARYDAT“,ios_base:app)的功能是建立流对象 f,
7、并试图打开文件SALARYDAT 与 f 关联,而且(分数:2.00)A.若文件存在,则将其置为空文件;若文件不存在,则打开失败B.若文件存在,则将文件指针定位于文件尾;若文件不存在,则建立一个新文件C.若文件存在,则将文件指针定位于文件首;若文件不存在,则打开失败D.若文件存在,则打开失败;若文件不存在,则建立一个新文件35.下列情况中,不会调用复制构造函数的是(分数:2.00)A.用一个对象去初始化同一类的另一个新对象时B.将类的一个对象赋予该类的另一个对象时C.函数的形参是类的对象,调用函数进行形参和实参结合时D.函数的返回值是类的对象,函数执行返回调用时二、填空题(总题数:15,分数:
8、30.00)36.如图所示的软件系统结构图的宽度为_。 (分数:2.00)填空项 1:_37. 1 的任务是诊断和改正程序中的错误。(分数:2.00)填空项 1:_38.一个关系表的行称为 1。(分数:2.00)填空项 1:_39.按“先进后出”原则组织数据的数据结构是 1。(分数:2.00)填空项 1:_40.数据结构分为线性结构和非线性结构,带链的队列属于 1。(分数:2.00)填空项 1:_41.若有定义语句:int*a,b;,则变量 b 的数据类型是 1。(分数:2.00)填空项 1:_42.已知数组 a 中的元素个数为 n,下列语句的作用是将下标为 i 的元素移动到下标为 i-1 的
9、单元,其中1in。例如,当 n=4,a 中原有数据为 1、2、3、4 时,则移动后 a 中元素为 2、3、4、4。请将语句补充完整: for(inti=0;in-1;i+)ai=a_。(分数:2.00)填空项 1:_43.已知递归函数 f 的定义如下: int f(int n) if(n= 1)return 1;/递归结束情况 f5=5*f3=5*3*f1 else return n*f(n-2); /递归 则函数调用语句 f(5)的返回值是_。(分数:2.00)填空项 1:_44.创建对象数组时,对数组的每一个元素都将调用一次构造函数,如果没有显式给出数组元素的初值,则调用默认构造函数,下列
10、程序涉及对象数组的创建和单个对象的创建,其输出结果是_。 #include iostream using namespace std; class Foo public: Foo(int x)eoutA; Foo( ) ; int main( ) Foo f3,g(3); return 0;(分数:2.00)填空项 1:_45.已知下列程序的输出结果是 42,请将下画线处缺失的部分补充完整。 #include iostream using namespace std; class Foo int value; public: Foo( ):value(0) void setValue(int
11、value) _=value;/给 Foo 的数据成员 value 赋值 void print( )eoutvalue; ; int main( ) Foo f; f.setValue(42); f.print(); return 0; (分数:2.00)填空项 1:_46.有如下程序: #include iostream using namespaee std; class ONE public: virtual void f( )cout“1“; ; class TWO:public ONE public: TWO( )1 cout“2“; ; class THREE:public TWO
12、 public: virtual void f( )TWO:f( );cout“3“; ; int main( ) ONE aa,*P; TWO bb; THREE cc; P= cout“The value at P:“*P: return 0; 编译运行程序将出现的情况是(分数:2.00)A.编译时出现语法错误,不能生成可执行文件B.运行时一定输出:The value at P:9C.运行时一定输出:The value at P:*9D.运行时有可能出错 解析:解析 int*p;指针变量定义时没有被初始化,也没有指向具体的地址,所以在后面打印时报错。应当做如下初始化: int*p=new
13、int( );33.下列选项中不属于软件生命周期开发阶段任务的是(分数:2.00)A.软件测试B.概要设计C.软件维护 D.详细设计解析:解析 软件生命周期由软件定义、软件开发和软件维护 3 个时期构成,每个时期又进一步划分为若干个阶段。软件定义时期的基本任务是确定软件系统的工程需求。软件定义可分为软件系统的可行性研究和需求分析两个阶段。软件开发时期是具体设计和实现在前一时期定义的软件,它通常由 5 个阶段组成:概要设计、详细设计、编写代码、组装测试和确认测试。软件维护时期的主要任务是使软件持久地满足用户的需要。即当软件在使用过程中发现错误时应加以改正:当环境改变时应该修改软件,以适应新的环境
14、;当用户有新要求时应该及时改进软件,以满足用户的新要求。根据上述对软件生命周期的介绍,可知选项c 中的软件维护不是软件生命周期开发阶段的任务。因此,本题的正确答案是 C。34.语句 ofstream f(“SALARYDAT“,ios_base:app)的功能是建立流对象 f,并试图打开文件SALARYDAT 与 f 关联,而且(分数:2.00)A.若文件存在,则将其置为空文件;若文件不存在,则打开失败B.若文件存在,则将文件指针定位于文件尾;若文件不存在,则建立一个新文件 C.若文件存在,则将文件指针定位于文件首;若文件不存在,则打开失败D.若文件存在,则打开失败;若文件不存在,则建立一个新
15、文件解析:解析 ios_base:app 所表示的文件打开方式为:如果文件存在则将文件指针指向文件尾,否则就建立一个新文件。35.下列情况中,不会调用复制构造函数的是(分数:2.00)A.用一个对象去初始化同一类的另一个新对象时B.将类的一个对象赋予该类的另一个对象时C.函数的形参是类的对象,调用函数进行形参和实参结合时D.函数的返回值是类的对象,函数执行返回调用时 解析:解析 用一个对象去初始化同一类的另一个新对象时,将类的一个对象赋予该类的另一个对象时,函数的形参是类的对象,调用函数进行形参和实参结合时都会调用复制构造函数,生成一个新的对象,只有返回值为对象时,才调用构造函数,而不是复制构
16、造函数,生成一个新对象给函数返回,故答案为 D。二、填空题(总题数:15,分数:30.00)36.如图所示的软件系统结构图的宽度为_。 (分数:2.00)填空项 1:_ (正确答案:3)解析:解析 题目中的图形是倒置的树状结构,这是用层次图表示的软件结构。在结构图中同一层次模块的最大模块个数称为结构的宽度,它表示控制的总宽度。根据上述结构图宽度的定义,从图中可以看出,第二层的模块个数最多,即为 3。因此,这个系统结构图的宽度就为 3。37. 1 的任务是诊断和改正程序中的错误。(分数:2.00)填空项 1:_ (正确答案:或程序调试(阶段)或软件调试(阶段)或 Debug(阶段))解析:解析
17、软件测试的目的是发现程序中的错误,而调试的目的是确定程序中错误的位置和引起错误的原因,并加以改正。换句话说,调试的目的就是诊断和改正程序中的错误。调试不是测试,但是它总是发生在测试之后。因此,本题的正确答案是调试(阶段)或程序调试(阶段)或软件调试(阶段)或 Debug(阶段)38.一个关系表的行称为 1。(分数:2.00)填空项 1:_ (正确答案:记录或元组)解析:解析 关系是关系数据模型的核心。关系可以用一个表来直观地表示,表的每一列表示关系的一个属性,每一行表示一个元组或记录。因此,本题的正确答案是元组或记录。39.按“先进后出”原则组织数据的数据结构是 1。(分数:2.00)填空项
18、1:_ (正确答案:栈或 Stack)解析:解析 栈和队列是两种特殊的线性表,其特殊性在于对它们的操作只能在表的端点进行。栈中的数据按照后进先出的原则进行组织,而队列中的数据按照先进先出的原则进行组织。因此,本题的正确答案是栈(stack)。40.数据结构分为线性结构和非线性结构,带链的队列属于 1。(分数:2.00)填空项 1:_ (正确答案:线性结构)解析:解析 数据结构分为线性结构和非线性结构,其中队列是属于线性结构。队列有两种存储结构:一种是顺序存储结构,称为顺序队列;另一种是链式存储结构,称为链队列。题目中所说的带链的队列就是指链队列。无论队列采取哪种存储结构,其本质还是队列,还属于
19、一种线性结构。因此,本题的正确答案是线性结构。41.若有定义语句:int*a,b;,则变量 b 的数据类型是 1。(分数:2.00)填空项 1:_ (正确答案:int)解析:解析 缺数据类型。42.已知数组 a 中的元素个数为 n,下列语句的作用是将下标为 i 的元素移动到下标为 i-1 的单元,其中1in。例如,当 n=4,a 中原有数据为 1、2、3、4 时,则移动后 a 中元素为 2、3、4、4。请将语句补充完整: for(inti=0;in-1;i+)ai=a_。(分数:2.00)填空项 1:_ (正确答案:ai+1)解析:解析 实现由后面一个数组元素将前一个数组元素进行覆盖,故应该为
20、 ai=ai+1。43.已知递归函数 f 的定义如下: int f(int n) if(n= 1)return 1;/递归结束情况 f5=5*f3=5*3*f1 else return n*f(n-2); /递归 则函数调用语句 f(5)的返回值是_。(分数:2.00)填空项 1:_ (正确答案:15)解析:解析 函数递归调用,f(5)=5*f(3)=5*(3*f(1)=15。44.创建对象数组时,对数组的每一个元素都将调用一次构造函数,如果没有显式给出数组元素的初值,则调用默认构造函数,下列程序涉及对象数组的创建和单个对象的创建,其输出结果是_。 #include iostream usin
21、g namespace std; class Foo public: Foo(int x)eoutA; Foo( ) ; int main( ) Foo f3,g(3); return 0;(分数:2.00)填空项 1:_ (正确答案:A)解析:解析 数组 f3调用的是无参构造函数,而 g(3)调用的是第一个有参构造函数,故打印 A。45.已知下列程序的输出结果是 42,请将下画线处缺失的部分补充完整。 #include iostream using namespace std; class Foo int value; public: Foo( ):value(0) void setValu
22、e(int value) _=value;/给 Foo 的数据成员 value 赋值 void print( )eoutvalue; ; int main( ) Foo f; f.setValue(42); f.print(); return 0; (分数:2.00)填空项 1:_ (正确答案:this.value)解析:解析 为类的数据成员赋值,将从形参传递来的实参赋值给类数据成员,为区分名字可以使用this 指针。46.有如下程序: #include iostream using namespaee std; class ONE public: virtual void f( )cout“
23、1“; ; class TWO:public ONE public: TWO( )1 cout“2“; ; class THREE:public TWO public: virtual void f( )TWO:f( );cout“3“; ; int main( ) ONE aa,*P; TWO bb; THREE cc; P=&cc; p-f( ); return 0; 程序的输出结果是_。(分数:2.00)填空项 1:_ (正确答案:2213)解析:解析 TWO bb;调用 TWO 的构造函数打印 2;THREE cc;调用继承类 TWO 的构造函数打印 2;p-f( );调用类 TREE
24、 的函数 f( ),先显式调用 TWO 类的函数 f( ),TWO 中没有重新定义 f( )函数,所以调用 TWO 的基类 ONE 的虚函数 f( );打印 1,然后再打印 3,故答案为 2213。47.有如下程序: #include iostream using namespace std; class PARENT public: PARENT( )cout“PARENT“; ; class SON:public PARENT public: SON( )cout“SON“; ; int main( ) SON son; PARENT*P; P=&son; return 0; 程序的输出结
25、果是_。(分数:2.00)填空项 1:_ (正确答案:PARENTSON)解析:解析 在有继承关系的类对象构造时,先执行基类的构造函数,然后执行派生类的构造函数。所以先执行 PARENT 的构造函数,然后执行 S0N 的构造函数。48.若以非成员函数形式,为类 Bounce 重载“!”运算符,其操作结果为一个 bool 型数据,则该运算符重载函数的原型是_。(分数:2.00)填空项 1:_ (正确答案:bool operator!(Bounee);)解析:解析 单目运算符重载为非成员函数的一般格式为: 返回类型 operator 操作符(形参) 其中形参类型为类名。49.下面是复数类 comp
26、lex 的定义,其中重载的运算符“+”的功能是返回一个新的复数对象,其实部等于两个操作对象实部之和,其虚部等于两个操作对象虚部之和;请补充完整。 class complex double real; /实部 double imag; /虚部 public: complex(double r,double i):real(r),imag(i)j complex operator+(complex A) return complex(_); ;(分数:2.00)填空项 1:_ (正确答案:real+areal,imag+aimag)解析:解析 为复数类 complex 以成员函数重载“+”运算符,虚部与虚部相加,实部与实部相加,并返回为 cornplex 类。50.已知一个函数模板定义为 template typename T1typenaine T2 T1 FUN(T2 n)return n*5.0; 若要求以 int 型数据 7 为函数实参调用该模板函数,并返回一个 double 型数据,则该调用应表示为_。(分数:2.00)填空项 1:_ (正确答案:FUNdouble(7))解析:解析 实参类型和返回值类型不匹配时,需要强制转换参数类型,所以在函数模板调用时要显式地定义参数数据类型 double,将整数 7 转换为 double 型。