1、二级 C+-184 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:100.00)1.下列选项中不符合良好程序设计风格的是_。(分数:2.50)A.源程序要文档化B.数据说明的次序要规范化C.避免滥用 goto 语句D.模块设计要保证高耦合、高内聚2.从工程管理角度看,软件设计一般分为两步完成,它们是_。(分数:2.50)A.概要设计与详细设计B.数据设计与接口设计C.软件结构设计与数据设计D.过程设计与数据设计3.下列选项中不属于软件生命周期开发阶段任务的是_。(分数:2.50)A.软件测试B.概要设计C.软件维护D.详细设计4.在数据库系统中,用户所见
2、的数据模式为_。(分数:2.50)A.概念模式B.外模式C.内模式D.物理模式5.数据库设计的四个阶段是:需求分析、概念设计、逻辑设计和_。(分数:2.50)A.编码设计B.测试阶段C.运行阶段D.物理设计6.下列操作中正确的是_。 (分数:2.50)A.T=RSB.T=RSC.T=RSD.T=R/S7.下列描述中正确的是_。(分数:2.50)A.一个算法的空间复杂度大,则其时间复杂度也必定大B.一个算法的空间复杂度大,则其时间复杂度必定小C.一个算法的时间复杂度大,则其空间复杂度必定小D.上述三种说法都不对8.在长度为 64 的有序线性表中进行顺序查找,最坏情况下需要比较的次数为_。(分数:
3、2.50)A.63B.64C.6D.79.数据库技术的根本目标是要解决数据的_。(分数:2.50)A.存储问题B.共享问题C.安全问题D.保护问题10.对下列二叉树进行中序遍历的结果是_。 (分数:2.50)A.ACBDFEGB.ACBDFGEC.ABDCGEFD.FCADBEG11.下列有关内联函数的叙述中,正确的是_。(分数:2.50)A.内联函数在调用时发生控制转移B.内联函数必须通过关键字 inline 来定义C.内联函数是通过编译器来实现的D.内联函数函数体的最后一条语句必须是 return 语句12.下列情况中,不会调用拷贝构造函数的是_。(分数:2.50)A.用一个对象去初始化同
4、一类的另一个新对象时B.将类的一个对象赋值给该类的另一个对象时C.函数的形参是类的对象,调用函数进行形参和实参结合时D.函数的返回值是类的对象,函数执行返回调用时13.下列有关继承和派生的叙述中,正确的是_。(分数:2.50)A.如果一个派生类私有继承其基类,则该派生类对象不能访问基类的保护成员B.派生类的成员函数可以访问基类的所有成员C.基类对象可以赋值给派生类对象D.如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类14.下列运算符不能重载为友元函数的是_。(分数:2.50)A.= () -B.+ - +- -C. = =D.+= -= *= /=15.关于在调用模板函数时模板实
5、参的使用,下列表述正确的是_。(分数:2.50)A.对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略B.对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略C.对于虚拟类型参数所对应的模板实参,若能够省略则必须省略D.对于常规参数所对应的模板实参,任何情况下都不能省略16.下列关于输入流类成员函数 getline()的描述中,错误的是_。(分数:2.50)A.该函数是用来读取键盘输入的字符串的B.该函数读取的字符串长度是受限制的C.该函数读取字符串时,遇到终止符便停止D.该函数读取字符串时,可以包含空格17.下列符号中,正确
6、的 C+标识符是_。(分数:2.50)A.enumB.2bC.foo-9D._3218.下列语句中,错误的是_。(分数:2.50)A.const int buffer=256;B.const double *point;C.int const buffer=256;D.double * const point;19.if 语句的语法格式可描述为:格式 1:if(条件)语句或格式 2:if(条件)语句1else语句 2关于上面的语法格式,下列表述中错误的是_。(分数:2.50)A.条件部分可以是一个 if 语句,例如 if(if(a=0) ) B.语句部分可以是一个 if 语句,例如 if()i
7、f() C.如果在条件前加上逻辑非运算符!并交换语句 1和语句 2的位置,语句功能不变D.语句部分可以是一个循环语句,例如 if()while() 20.有如下说明:int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, *p=a; 则数值为 9 的表达式是_。(分数:2.50)A.*p+9B.*(p+8)C.*p+=9D.p+821.若有下面的函数调用:fun(a+b, 3, max(n-1, b),则 fun 的实参个数是_。(分数:2.50)A.3B.4C.5D.622.以下关键字不能用来声明类的访问权限的是_。(分数:2.50)A.publicB.staticC.
8、protectedD.private23.在公有继承的情况下,允许派生类直接访问的基类成员包括_。(分数:2.50)A.公有成员B.公有成员和保护成员C.公有成员、保护成员和私有成员D.保护成员24.关于运算符重载,下列表述中正确的是_。(分数:2.50)A.C+已有的任何运算符都可以重载B.运算符函数的返回类型不能声明为基本数据类型C.在类型转换符函数的定义中不需要声明返回类型D.可以通过运算符重载来创建 C+中原来没有的运算符25.关于关键字 class 和 typename,下列表述中正确的是_。(分数:2.50)A.程序中的 typename 都可以替换为 classB.程序中的 cl
9、ass 都可以替换为 typenameC.在模板形参表中只能用 typename 来声明参数的类型D.在模板形参表中只能用 class 或 typename 来声明参数的类型26.有如下程序: #includeiostream #includeiomanip using namespace std; int main() coutsetprecision(3)fixed setfill(“*“)setw(8); cout12.345_34.567; return 0; 若程序的输出是: *12.345*34.567 则程序中下画线处遗漏的操作符是_。(分数:2.50)A.setprecisio
10、n(3)B.fixedC.setfill(“*“)D.setw(8)27.有如下程序: #includeiostream #includeiomanip using namespace std; class MyClass public: MyClass()cout“A“; MyClass(char c)coutc; MyClass()cout“B“; ; int main() MyClass p1, *p2; p2=new MyClass(“X“); delete p2; return 0; 执行这个程序屏幕上将显示输出_。(分数:2.50)A.ABXB.ABXBC.AXBD.AXBB28.
11、有如下程序: #includeiostream using namespace std; int i=1; class Fun public: static int i; int value()return i-1; int value()constreturn i+1; ; int Fun:i=2; int main() int i=3; Fun fun1; const Fun fun2; _ return 0; 若程序的输出结果是: 123 则程序中下画线处遗漏的语句是_。(分数:2.50)A.coutfun1.value()Fun:ifun2.value();B.coutFun:ifun
12、1.value()fun2.value();C.coutfun1.value()fun2.value()Fun:i;D.coutfun2.value()Fun:ifun1.value();29.有如下程序: #includeiostream using namespace std; class Obj( static int i; public: Obj()i+; Obj()i-; static int getVal()return i; ; int Obj:i=0; void f()Obj ob2; coutob2.getVal(); int main() Obj ob1; f(); Obj
13、*ob3=new Obj; coutob3-getVal(); delete ob3; coutObj:getVal(); return 0; 程序的输出结果是_。(分数:2.50)A.232B.231C.222D.22130.有如下程序: #includeiostream using namespace std; class Base protected: Base()cout“A“; Base(char c)coutc; ; class Derived:public Base public: Derived(char c)coutc; ; int main() Derived d1(“B“
14、); return 0; 执行这个程序屏幕上将显示输出_。(分数:2.50)ABB.BAC.ABD.BB31.有如下类定义: class MyBase int k; public: MyBase(int n=0):k(n) int value()constreturn k; ; class MyDerived:MyBase int j; public: MyDerived(int i):j(i) int getK()constreturn k; int getJ()constreturn j; ; 编译时发现有一处语法错误,对这个错误最准确的描述是_。(分数:2.50)A.函数 getK 试图
15、访问基类的私有成员变量 kB.在类 MyDerived 的定义中,基类名 MyBase 前缺少关键字 public、protected 或 privateC.类 MyDerived 缺少一个无参的构造函数D.类 MyDerived 的构造函数没有对基类数据成员 k 进行初始化32.在一个派生类对象结束其生命周期时_。(分数:2.50)A.先调用派生类的析构函数后调用基类的析构函数B.先调用基类的析构函数后调用派生类的析构函数C.如果基类没有定义析构函数,则只调用派生类的析构函数D.如果派生类没有定义析构函数,则只调用基类的析构函数33.有如下的运算符重载函数定义: double operato
16、r+(int i, int k)return double(i+k); 但定义有错误,对这个错误最准确的描述是(分数:2.50)A.+只能作为成员函数重载,而这里的+是作为非成员函数重载的B.两个 int 型参数的和也应该是 int 型,而这里将+的返回类型声明为 doubleC.没有将运算符重载函数声明为某个类的友元D.C+已经提供了求两个 int 型数据之和的运算符+,不能再定义同样的运算符34.语句“ofstream f(“SALARY.DAT“, ios_base:app);”的功能是建立流对象 f,并试图打开文件SALARY.DAT 与 f 关联,而且_。(分数:2.50)A.若文件
17、存在,将其置为空文件;若文件不存在,打开失败B.若文件存在,将文件指针定位于文件尾;若文件不存在,建立一个新文件C.若文件存在,将文件指针定位于文件首;若文件不存在,打开失败D.若文件存在,打开失败;若文件不存在,建立一个新文件35.有如下程序: #includeiostream using namespace std; class A public: virtual void funcl()cout“A1“; void func2()cout“A2“; ; class B:public A public: void func1()cout“B1“; void func2()cout“B2“;
18、 ; int main() A *p=new B; p-func1(); p-func2(); return 0; 运行此程序,屏幕上将显示输出_。(分数:2.50)A.B182B.A1A2C.B1A2D.A18236.有以下程序: #includeiostream using namespace std; int main() int *p, b; b=3; p= p=p+1; cout*pendl; return 0; 上述程序运行后输出的结果是_。(分数:2.50)A.不确定B.2C.3D.537.下列关于 C+函数的叙述中,正确的是_。(分数:2.50)A.每个函数至少要具有一个参数B
19、.每个函数都必须返回一个值C.函数在被调用之前必须声明D.函数不能自己调用自己38.下列关于 C+函数的说明中,正确的是_。(分数:2.50)A.内联函数就是定义在另一个函数体内部的函数B.函数体的最后一条语句必须是 return 语句C.标准 C+要求在调用一个函数之前,必须先声明其原型D.编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式39.有如下程序: #includeiostream void fun(int x=y; y=t; int main() int a2=23, 42; fun(al, a0); std:couta0“, “a1std:endl; return 0
20、; 执行后的输出结果是_。(分数:2.50)A.42, 42;B.23, 23;C.23, 42;D.42, 23;40.有如下程序: #includeiostream using namespace std; int main() void function(double val); double val; function(val); coutval; return 0; void function(double val) val=3; 编译运行程序将会出现的情况是_。(分数:2.50)A.编译出错,无法运行B.输出 3C.输出 3.0D.输出一个不确定的数二级 C+-184 答案解析(总
21、分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:100.00)1.下列选项中不符合良好程序设计风格的是_。(分数:2.50)A.源程序要文档化B.数据说明的次序要规范化C.避免滥用 goto 语句D.模块设计要保证高耦合、高内聚 解析:解析 良好的程序设计风格可以使程序结构清晰合理,使程序代码便于维护,因此,程序设计风格对保证程序的质量很重要。主要应注意和考虑下述一些因素:(1)源程序要文档化;(2)数据说明的次序要规范化;(3)语句的结构应该简单直接,不应该为提高效率而把语句复杂化,避免滥用 goto 语句。模块设计要保证低耦合、高内聚。2.从工程管理角度看,软件设计
22、一般分为两步完成,它们是_。(分数:2.50)A.概要设计与详细设计 B.数据设计与接口设计C.软件结构设计与数据设计D.过程设计与数据设计解析:解析 从工程管理角度看,软件设计分为两步完成:概要设计与详细设计。概要设计(又称结构设计)将软件需求转化为软件体系结构、确定系统级接口、全局数据结构或数据库模式;详细设计确立每个模块的实现算法和局部数据结构,用适当方法表示算法和数据结构的细节。3.下列选项中不属于软件生命周期开发阶段任务的是_。(分数:2.50)A.软件测试B.概要设计C.软件维护 D.详细设计解析:解析 软件生命周期分为软件定义、软件开发及软件维护。其中软件开发阶段的任务中软件设计
23、阶段可分解成概要设计阶段和详细设计阶段;软件维护不属于软件开发阶段。4.在数据库系统中,用户所见的数据模式为_。(分数:2.50)A.概念模式B.外模式 C.内模式D.物理模式解析:解析 概念模式是数据库系统中全局数据逻辑结构的描述,是全体用户(应用)公共数据视图,它主要描述数据的记录类型及数据间关系,还包括数据间的语义关系等。数据库管理系统的三级模式结构由外模式、模式、内模式组成。数据库的外模式也称为用户级数据库,是用户所看到和理解的数据库,是从概念模式导出的子模式,用户可以通过子模式描述语言来描述用户级数据库的记录,还可以利用数据语言对这些记录进行操作。内模式,或称存储模式或物理模式,是指
24、数据在数据库系统内的存储介质上的表示,即对数据的物理结构和存取方式的描述。5.数据库设计的四个阶段是:需求分析、概念设计、逻辑设计和_。(分数:2.50)A.编码设计B.测试阶段C.运行阶段D.物理设计 解析:解析 我们按规范设计方法将数据库设计分为以下六个阶段:需求分析、概念结构设计、逻辑结构设计、数据库物理设计、数据库实现、数据库运行和维护。一般上数据库设计方法和步骤:需求分析、概念设计、逻辑设计和物理设计。6.下列操作中正确的是_。 (分数:2.50)A.T=RSB.T=RSC.T=RS D.T=R/S解析:解析 集合的并、交、差、广义笛卡儿积:设有两个关系为 R 和 S,它们具有相同的
25、结构,R 和 S的并是由属于 R 和 S,或者同时属于 R 和 S 的所有元组组成的集合,记作 RS;R 和 S 的交是由既属于 R又属于 S 的所有元组组成的集合,记作 RS;R 和 S 的差是由属于 R 但不属于 S 的所有元组组成的集合,记作 R-S;元组的前 n 个分量是 R 的一个元组,后 m 个分量是 S 的一个元组,若 R 有 K1 个元组,S 有 K2个元组,则 RS 有 K1K2 个元组,记为 RS。从图中可以看出,关系 T 是关系 R 和关系 S 的简单扩充,而扩充的符号为,所以答案为 T=RS。7.下列描述中正确的是_。(分数:2.50)A.一个算法的空间复杂度大,则其时
26、间复杂度也必定大B.一个算法的空间复杂度大,则其时间复杂度必定小C.一个算法的时间复杂度大,则其空间复杂度必定小D.上述三种说法都不对 解析:解析 算法在运行过程中所需要的辅助存储空间的大小称为算法空间复杂度;算法的时间复杂度是执行该算法所需要的计算工作量,即算法执行过程中所需要的基本运算次数。为了能够比较客观地反映出一个算法的效率,在度量一个算法的工作量时,与所使用的计算机、程序设计语言以及程序编制者无关,而且还与算法实现过程中的许多细节无关。但可以用算法在执行过程所需基本运算的执行次数来度量算法的工作量。8.在长度为 64 的有序线性表中进行顺序查找,最坏情况下需要比较的次数为_。(分数:
27、2.50)A.63B.64 C.6D.7解析:解析 在进行顺序查找过程中,如果线性表中的第 1 个元素就是要查找元素,则只需要做一次比较就查找成功,查找效率最高;但如果被查找的元素是线性表中的最后一个元素,或者被查找的元素根本就不在线性表中,则为了查找这个元素需要与线性表中的所有元素进行比较,这是顺序查找的最坏情况。所以对长度为 n 的线性表进行顺序查找,在最坏情况下需要比较 n 次。9.数据库技术的根本目标是要解决数据的_。(分数:2.50)A.存储问题B.共享问题 C.安全问题D.保护问题解析:解析 随着网络技术的发展,使数据可为多个应用所共享,数据的共享自身又可减少数据冗余性,不仅减少了
28、不必要的存储空间,更为重要的是可以避免数据的不一致性。因此,数据库设计的根本目标是要解决数据共享问题,而数据的安全性保护问题和存储问题是数据库技术不可缺少的内容。10.对下列二叉树进行中序遍历的结果是_。 (分数:2.50)A.ACBDFEG B.ACBDFGEC.ABDCGEFD.FCADBEG解析:解析 中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。11.下列有关内联函数的叙述中,正确的是_。(分数:2.50)A.内联函数在调用时发生控制转移B.内联函数必须通过关键字 inline 来定义C.内联函数是通过编译器来实现的 D.内联函数函数体的最后一条语句必须是 return 语句
29、解析:解析 在 C+中,内联函数是为了取代宏而引进的,它是真正的函数,但是和普通函数不同的是,在编译阶段通过编译器在函数调用的时候像宏一样展开使用。并不发生控制转移也没有返回值,没有返回语句。内联函数除了可以用 inline 定义外,还可以用 inline 来声明实现。12.下列情况中,不会调用拷贝构造函数的是_。(分数:2.50)A.用一个对象去初始化同一类的另一个新对象时B.将类的一个对象赋值给该类的另一个对象时 C.函数的形参是类的对象,调用函数进行形参和实参结合时D.函数的返回值是类的对象,函数执行返回调用时解析:解析 只要在程序的执行中,需要用一个对象来初始化另一个正在创建的对象时,
30、都要调用复制构造函数。13.下列有关继承和派生的叙述中,正确的是_。(分数:2.50)A.如果一个派生类私有继承其基类,则该派生类对象不能访问基类的保护成员B.派生类的成员函数可以访问基类的所有成员C.基类对象可以赋值给派生类对象D.如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类 解析:解析 派生类私有继承基类后,基类的保护成员变为派生类的私有成员,可以访问。基类的私有成员派生类是不能访问的。基类的对象是无法赋值给派生类的。14.下列运算符不能重载为友元函数的是_。(分数:2.50)A.= () - B.+ - +- -C. = =D.+= -= *= /=解析:解析 “=”、“
31、()”、“”、“-”只能作为成员函数重载。15.关于在调用模板函数时模板实参的使用,下列表述正确的是_。(分数:2.50)A.对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略B.对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略C.对于虚拟类型参数所对应的模板实参,若能够省略则必须省略D.对于常规参数所对应的模板实参,任何情况下都不能省略 解析:解析 只有从函数实参获得的信息已经能够判定其中部分或全部虚拟类型参数所对应的实参,而且它们又是模板参数表中最后的若干个参数,则模板参数表中的那几个参数才可以省略,但不是必须省略的。
32、常规参数的信息无法从模板的实参表中获得,因此不能省略,D 是正确的。16.下列关于输入流类成员函数 getline()的描述中,错误的是_。(分数:2.50)A.该函数是用来读取键盘输入的字符串的B.该函数读取的字符串长度是受限制的 C.该函数读取字符串时,遇到终止符便停止D.该函数读取字符串时,可以包含空格解析:解析 此函数的作用是用来读取键盘输入的字符串,在读取字符串时,遇到终止符(默认为回车)便停止,因此字符串是可以包含空格的,读取的字符长度也是没有限制的,直到遇到终止符为止,但接收字符串的数组是有限的。所以 B 是错误的。17.下列符号中,正确的 C+标识符是_。(分数:2.50)A.
33、enumB.2bC.foo-9D._32 解析:解析 在 C+中,标识符只能使用字母、数字、下画线、其中数字不能是首字符,关键字也不能为标识符,故答案 D 是正确的。18.下列语句中,错误的是_。(分数:2.50)A.const int buffer=256;B.const double *point;C.int const buffer=256;D.double * const point; 解析:解析 修饰符 const 和类型名是可以互换的,B 中声明的是一个指向 double 型常量的指针,所以不用初始化,D 项定义的是指向 double 型变量的常指针,故必须是定义的同时要初始化。且
34、在程序中式不可以改变的。19.if 语句的语法格式可描述为:格式 1:if(条件)语句或格式 2:if(条件)语句1else语句 2关于上面的语法格式,下列表述中错误的是_。(分数:2.50)A.条件部分可以是一个 if 语句,例如 if(if(a=0) ) B.语句部分可以是一个 if 语句,例如 if()if() C.如果在条件前加上逻辑非运算符!并交换语句 1和语句 2的位置,语句功能不变D.语句部分可以是一个循环语句,例如 if()while() 解析:解析 if 语句的条件一般为一个表达式或者是一个声明语句且必须用圆括号包围起来;if 语句的语句部分可以是任何类型的语句(包括复合语句
35、和空语句)。A 选项的条件既不是表达式又不是声明语句,故 A 项是错误的。20.有如下说明:int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, *p=a; 则数值为 9 的表达式是_。(分数:2.50)A.*p+9B.*(p+8) C.*p+=9D.p+8解析:解析 定义了指针 p,初值为数组 a 的首地址,*p 为第一个元素所以第几个元素是*(p+8)。21.若有下面的函数调用:fun(a+b, 3, max(n-1, b),则 fun 的实参个数是_。(分数:2.50)A.3 B.4C.5D.6解析:解析 第一个参数为表达式 a+b,第二个参数是 3,第三个参数是
36、一个函数。22.以下关键字不能用来声明类的访问权限的是_。(分数:2.50)A.publicB.static C.protectedD.private解析:解析 public、protected、private 是声明类的访问权限的,static 是用来声明静态变量的。23.在公有继承的情况下,允许派生类直接访问的基类成员包括_。(分数:2.50)A.公有成员B.公有成员和保护成员 C.公有成员、保护成员和私有成员D.保护成员解析:解析 派生类公有继承基类后,基类的成员访问权限没有发生变化,派生类可以直接访问其公有和保护成员。24.关于运算符重载,下列表述中正确的是_。(分数:2.50)A.C
37、+已有的任何运算符都可以重载B.运算符函数的返回类型不能声明为基本数据类型C.在类型转换符函数的定义中不需要声明返回类型 D.可以通过运算符重载来创建 C+中原来没有的运算符解析:解析 “.”、“:”、“.*”、“-”、“?:”五个运算符是不可以重载的,运算符的返回类型不能为 void 类型,其他基本数据类型都可,重载只是重定义原来存在的运算符,不可能创造出新的运算符。25.关于关键字 class 和 typename,下列表述中正确的是_。(分数:2.50)A.程序中的 typename 都可以替换为 class B.程序中的 class 都可以替换为 typenameC.在模板形参表中只能
38、用 typename 来声明参数的类型D.在模板形参表中只能用 class 或 typename 来声明参数的类型解析:解析 程序中 typename 是可以用 class 替换的,但 class 在类模板名前代表的是类不能用typename 替换,在模板形参表中除了它们以外,常规类型也可以声明参数类型。26.有如下程序: #includeiostream #includeiomanip using namespace std; int main() coutsetprecision(3)fixed setfill(“*“)setw(8); cout12.345_34.567; return
39、0; 若程序的输出是: *12.345*34.567 则程序中下画线处遗漏的操作符是_。(分数:2.50)A.setprecision(3)B.fixedC.setfill(“*“)D.setw(8) 解析:解析 执行语句 coutsetprecision(3)fixedsetfill(“*“)setw(8);完成的功能是:设置小数为定点输出,小数后有三位,设置宽度为 8,默认右对齐,填充字符*,其中 setw 的效果只对一次输入/输出有效,而 setprecision 和 sefill 的设置效果一直持续到下次设置,故 12.345 输出为*12.345,而第二个数字输出格式与 12.345
40、 相同,因此必须再次设置宽度,即 setw(8)。27.有如下程序: #includeiostream #includeiomanip using namespace std; class MyClass public: MyClass()cout“A“; MyClass(char c)coutc; MyClass()cout“B“; ; int main() MyClass p1, *p2; p2=new MyClass(“X“); delete p2; return 0; 执行这个程序屏幕上将显示输出_。(分数:2.50)A.ABXB.ABXBC.AXBD.AXBB 解析:解析 定义对象
41、p1 时,调用无参构造函数,输出 A,定义对象指针 p2 时,不调用构造函数,初始化 p2 时,调用含参构造函数,输出 X,删除对象指针时调用析构函数,输出 B,主函数结束时,对象p1 调用析构函数释放空间,输出 B。28.有如下程序: #includeiostream using namespace std; int i=1; class Fun public: static int i; int value()return i-1; int value()constreturn i+1; ; int Fun:i=2; int main() int i=3; Fun fun1; const
42、Fun fun2; _ return 0; 若程序的输出结果是: 123 则程序中下画线处遗漏的语句是_。(分数:2.50)A.coutfun1.value()Fun:ifun2.value(); B.coutFun:ifun1.value()fun2.value();C.coutfun1.value()fun2.value()Fun:i;D.coutfun2.value()Fun:ifun1.value();解析:解析 此程序中有全局变量、静态变量和局部变量以及常函数,根据它们的定义,可执行fun1.value()调用的 i,FUN:i,常对象 fun2.value()调用的 i,即可得到输
43、出 123。29.有如下程序: #includeiostream using namespace std; class Obj( static int i; public: Obj()i+; Obj()i-; static int getVal()return i; ; int Obj:i=0; void f()Obj ob2; coutob2.getVal(); int main() Obj ob1; f(); Obj*ob3=new Obj; coutob3-getVal(); delete ob3; coutObj:getVal(); return 0; 程序的输出结果是_。(分数:2.
44、50)A.232B.231C.222D.221 解析:解析 静态数据成员 i=0,创建对象 ob1 时,调用构造函数 i+,调用 f()函数,创建 ob2 时,再调用构造函数,i+,然后利用静态成员函数输出 i=2;f()函数结束时,调用析构函数 i-,创建 ob3 对象时,再调用构造函数,i+,利用静态成员函数输出 i=2,删除对象 ob3,调用析构函数 i-,利用成员函数输出 i=1。30.有如下程序: #includeiostream using namespace std; class Base protected: Base()cout“A“; Base(char c)coutc;
45、; class Derived:public Base public: Derived(char c)coutc; ; int main() Derived d1(“B“); return 0; 执行这个程序屏幕上将显示输出_。(分数:2.50)ABB.BAC.AB D.BB解析:解析 根据派生类的构造函数执行顺序,创建派生类对象时,首先执行基类的默认构造函数,输出 A,接下来执行派生类 B 的构造函数,输出 B。31.有如下类定义: class MyBase int k; public: MyBase(int n=0):k(n) int value()constreturn k; ; cla
46、ss MyDerived:MyBase int j; public: MyDerived(int i):j(i) int getK()constreturn k; int getJ()constreturn j; ; 编译时发现有一处语法错误,对这个错误最准确的描述是_。(分数:2.50)A.函数 getK 试图访问基类的私有成员变量 k B.在类 MyDerived 的定义中,基类名 MyBase 前缺少关键字 public、protected 或 privateC.类 MyDerived 缺少一个无参的构造函数D.类 MyDerived 的构造函数没有对基类数据成员 k 进行初始化解析:解析 类中的成员若没有指明访问权限则默认为私有成员,派生类无论刚什么方式继承都不能访问基类的私有成员。当不指名继承方式时,也默认为私有继承。32.在一个派生类对象结束其生命周期时_。(分数:2.50)A.先调用派生类的析构函数后调用基类的析构函数 B.先调用基类的析构函数后调用派生类的析构函数C.如果基类没有定义析构函数,则只调用派生类的析构函数D.如果派生类没有定义析构函数,则只调用基类的析构函数解析:解析