1、二级 C+-185 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:100.00)1.下列选项不属于结构化程序设计方法的是_。(分数:2.50)A.自顶向下B.逐步求精C.模块化D.可复用2.两个或两个以上模块之间关联的紧密程度称为_。(分数:2.50)A.耦合度B.内聚度C.复杂度D.数据传输特性3.下列叙述中正确的是_。(分数:2.50)A.软件测试应该由程序开发者来完成B.程序经调试后一般不需要再测试C.软件维护只包括对程序代码的维护D.以上三种说法都不对4.按照“后进先出”原则组织数据的数据结构是_。(分数:2.50)A.队列B栈C.双向链表D.二
2、叉树5.下列叙述中正确的是_。(分数:2.50)A.线性链表是线性表的链式存储结构B.栈与队列是非线性结构C.双向链表是非线性结构D.只有根结点的二叉树是线性结构6.对如下二叉树,进行后序遍历的结果为_。 (分数:2.50)A.ABCDEFB.DBEAFCC.ABDECFD.DEBFCA7.在深度为 7 的满二叉树中,叶子结点的个数为_。(分数:2.50)A.32B.31C.64D.638.“商品”与“顾客”两个实体集之间的联系一般是_。(分数:2.50)A.一对一B.一对多C.多对一D.多对多9.在 E-R 图中,用来表示实体的图形是_。(分数:2.50)A.矩形B.椭圆形C.菱形D.三角形
3、10.数据库 DB、数据库系统 DBS、数据库管理系统 DBMS 之间的关系是_。(分数:2.50)A.DB 包含 DBS 和 DBMSB.DBMS 包含 DB 和 DBSC.DBS 包含 DB 和 DBMSD.没有任何关系11.下列关于 C+函数的说明中,正确的是_。(分数:2.50)A.内联函数就是定义在另一个函数体内部的函数B.函数体的最后一条语句必须是 return 语句C.标准 C+要求在调用一个函数之前,必须先声明其原型D.编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式12.由于常对象不能被更新,因此_。(分数:2.50)A.通过常对象只能调用它的常成员函数B.通过常
4、对象只能调用静态成员函数C.常对象的成员都是常成员D.通过常对象可以调用任何不改变对象值的成员函数13.下列关于虚函数的说明中,正确的是_。(分数:2.50)A.从虚基类继承的函数都是虚函数B.虚函数不得是静态成员函数C.只能通过指针或引用测用虚函数D.抽象类中的成员函数都是虚函数14.运算符重载是对已有的运算符赋予多重含义,因此_。(分数:2.50)A.可以对基本类型(如 int 类型)的数据,重新定义“+”运算符的含义B.可以改变一个已有运算符的优先级和操作数个数C.只能重载 C+中已经有的运算符,不能定义新运算符D.C+中已经有的所有运算符都可以重载15.模板对类型的参数化提供了很好的支
5、持,因此_。(分数:2.50)A.类模板的主要作用是生成抽象类B.类模板实例化时,编译器将根据给出的模板实参生成一个类C.在类模板中的数据成员都具有同样类型D.类模板中的成员函数都没有返回值16.下列关于 C+流的说明中,正确的是_。(分数:2.50)A.与键盘、屏幕、打印机和通信端口的交互都可以通过流类来实现B.从流中获取数据的操作称为插入操作,向流中添加数据的操作称为提取操作C.cin 是一个预定义的输入流类D.输出流有一个名为 open 的成员函数,其作用是生成一个新的流对象17.下列符号中可以用作 C+标识符的是_。(分数:2.50)A._radiusB.foobarC.elseD.3
6、room18.下列语句中,错误的是_。(分数:2.50)A.const int buffer=256;B.const int temp;C.const double *point;D.const double *rt=new double(5.5);19.有如下程序: int x=3; do x-=2; coutx; while(!(-x); 执行这个程序的输出结果是_。(分数:2.50)A.1B.30C.1-2D.死循环20.有如下程序: #includeiostream using namespace std; int main() int *p; *p=9; cout“The value
7、 at p:“*p; return 0; 编译运行程序将出现的情况是_。(分数:2.50)A.够编译时出现语法错误,不能生成可执行文件B.运行时一定输出:The value at p:9C.运行时一定输出:The value at p:*9D.运行时有可能出错21.有如下程序: #includeiostream using nanespace std; int main() void function(double val); double val; function(val); coutval; return 0; void function(double val) val=3; 编译运行这
8、个程序将出现的情况是_。(分数:2.50)A.编译出错,无法运行B.输出:3C.输出:3.0D.输出一个不确定的数22.有如下类定义: class AA int a; public: int getRef() constreturn / int getvalue() constreturn a; / void set(int n) consta=n; / friend void show(AA aa) const cout/ ; 其中的四个函数定义中正确的是_。(分数:2.50)A.B.C.D.23.有如下程序: #includeiostream using namespace std; cl
9、ass Base public: void fun()cout“Base:fun“endl; ; class Derived:public Base public: void fun() cout“Derived:fun“endl; ; int main() Derived d; d.fun(); return 0; 已知其执行后的输出结果为_。 Base:fun Derived:fun 则程序中下画线处应填入的语句是_。(分数:2.50)A.Base.fun();B.Base:fun()C.Base-fun()D.fun();24.下面是重载为非成员函数的运算符函数原型,其中错误的是_。(分
10、数:2.50)A.Fraction operator+(Fraction, Fraction);B.Fraction operator-(Fraction);C.FractionD.Fraction25.有如下函数模板: Templatetypename T, typename U T cast(U u)return u; 其功能是将 U 类型数据转换为 T 类型数据。已知 i 为 int 型变量,下列对模板函数 cast 的调用中正确的是_。(分数:2.50)A.cast(i);B.cast(i);C.castchar*, int(i);D.castdouble, int(i);26.若磁盘
11、上已存在某个文本文件,其全路径文件名为 d:/ncre/test.txt,下列语句中不能打开该文件的是_。(分数:2.50)A.ifstream file(“d:/ncre/test.txt“);B.ifstream file(“d:/ncre/test.txt“);C.ifstream file; file.open(“d:/ncre/test.txt“);D.ifstream* pFile=new ifstream(“d:/ncre/test.txt“);27.有如下类定义: class Foo public: Foo(int v):value(v)/ Foo()/ private: Fo
12、o()/ int value=0; / ; 其中存在语法错误的行是_。(分数:2.50)A.B.C.D.28.有如下类定义: class Point int x_, y_; public: Point():x_(0), y_(0) Point(int x, int y=0):x_(x), y_(y) ; 若执行语句 Point a(2), b3, *c4; 则 Point 类的构造函数被调用的次数是_。(分数:2.50)A.2 次B.3 次C.4 次D.5 次29.有如下类定义: class Test public: Test()a=0; c=0; / int f(int a)constthi
13、s-a=a;/ static int g()return a;/ void h(int b)Test:b=b;/ private: int a; static int b; const int c; ; int Test:b=0; 在标注号码的行中,能被正确编译的是_。(分数:2.50)A.B.C.D.30.有如下程序: #includeiostream using namespace std; class A public: A()cout“A“; A()cout“A“; ; class B:public A A* p; public: B()cout“B“; p=new A(); B()c
14、out“B“; delete p; ; int main() B obj; return 0; 执行这个程序的输出结果是_。(分数:2.50)A.BAAABAB.ABABAAC.BAABAAD.ABAABA31.有如下程序: #includeiostream using namespace std; class Base private: void fun1() constcout“fun1“; protected: void fun2() constcout“fun2“; public: void fun3() constcout“fun3“; ; class Derived:protect
15、ed Base public: void fun4() constcout“fun4“; ; int main() Derived obj; obj.fun1();/ obj.fun2();/ obj.fun3();/ obj.fun4();/ return 0; 其中有语法错误的语句是_。(分数:2.50)A.B.C.D.32.有如下程序: #includeiostream using namespace std; class Base public: void funl()cout“Base/n“; virtual void fun2()cout“Base/n“; ; class Deri
16、ved:public Base public: void fun1()cout“Derived/n“; void fun2()cout“Derived/n“; ; void f(Base b.fun2(); int main() Derived obj; f(obj); return 0; 执行这个程序的输出结果是_。(分数:2.50)A.BaseBaseB.BaseDerivedC.DerivedBaseD.DerivedDerived33.有如下程序: #includeiostream using namespace std; class Complex double re, im; pu
17、blic: Complex(double r, double i):re(r), im (i) double real() constreturn re; double image() constreturn im; Complex im+=a.im; return * this; ; ostream int main() Complex x(1, -2), y(2, 3); cout(x+=y) return 0; 执行这个程序的输出结果是_。(分数:2.50)A.(1, -2)B.(2, 3)C.(3, 5)D.(3, 1)34.有如下程序: #includeiostream #inclu
18、deiostream using namespace std; int main() cout.fill(“*“); coutleftsetw(4)123“OK“endl; return 0; 执行这个程序的输出结果是_。(分数:2.50)A.123*OKB.123*OK*C.*123OKD.*123*OK35.有如下类声明: class SAMPLE int n; public: SAMPLE(int i=0):n(i) void setvalue(int n0); ; 下列关于 setvalue 成员函数的实现中,正确的是_。(分数:2.50)A.SAMPLE:setvalue(int n
19、0)n=n0;B.void SAMPLE:setvalue(int n0)n=n0;C.void setvalue(int n0)n=n0;D.setvalue(int n0)n=n0;36.下列有关内联函数的叙述中,正确的是_。(分数:2.50)A.内联函数在调用时发生控制转移B.内联函数必须通过关键字 inline 来定义C.内联函数是通过编译器来实现的D.内联函数体的最后一条语句必须是 return 语句37.在函数中,可以用 auto、extern、register 和 static 这四个关键字中的一个来说明变量的存储类型,如果不说明存储类型,则默认的存储类型是_。(分数:2.50)
20、A.auto;B.extern;C.register;D.static;38.有以下程序: #includeiostream using namespace std; long fib(int n) if(n2) return(fib(n-1)+fib(n-2); else return 2; int main() coutfib(3)endl; return 0; 该程序输出的结果是_。(分数:2.50)A.2B.4C.6D.839.有以下程序段: #includeiostream inline int abs(int x) if(x0) return-x; else return x; i
21、nt main() int m, m1=2, n, n1=-10; m=abs(m1); n=abs(n1); coutm“, “nendl; return 0; 该程序运行后输出的结果是_。(分数:2.50)A.2, -10B.-2, -10C.2, 10D.程序编译出错40.有如下程序: #includeiostream using namespace std; void fun(int i, int j) cout(i+j)endl; void fun(int i) couti+endl; int main() int a=1; fun(a); return 0; 该程序执行后输出的结果
22、是_。(分数:2.50)A.1B.2C.3D.4二级 C+-185 答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:40,分数:100.00)1.下列选项不属于结构化程序设计方法的是_。(分数:2.50)A.自顶向下B.逐步求精C.模块化D.可复用 解析:解析 20 世纪 70 年代以来,提出了许多软件设计方法,主要有:逐步求精:对复杂的问题,应没计一些子目标作过渡,逐步细化。自顶向下:程序设计时应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。模块化:一个复杂问题,肯定是由若干相对简单
23、的问题构成。模块化是把程序要解决的总目标分解为分目标,再进一步分解为具体的小目标,把每个小目标称为一个模块,而可复用是面向对象程序设计的一个优点。2.两个或两个以上模块之间关联的紧密程度称为_。(分数:2.50)A.耦合度 B.内聚度C.复杂度D.数据传输特性解析:解析 耦合度是模块间互相连接的紧密程度的度量;内聚度是一个模块内部各个元素间彼此结合的紧密程度的度量。3.下列叙述中正确的是_。(分数:2.50)A.软件测试应该由程序开发者来完成B.程序经调试后一般不需要再测试C.软件维护只包括对程序代码的维护D.以上三种说法都不对 解析:解析 程序调试的任务是诊断和改正程序中的错误。它与软件测试
24、不同,软件测试是尽可能多地发现软件中的错误。先要发现软件的错误,然后借助于一定的调试工具去找出软件错误的具体位置。软件测试贯穿整个软件生命期,调试主要在开发阶段。为了达到更好的测试效果,应该由独立的第三方来构造测试。因为从心理学角度讲,程序人员或设计方在测试自己的程序时,要采取客观的态度程度不同地存在障碍。软件的运行和维护是指将已交付的软件投入运行,并在运行使用中不断地维护,根据新提出的需求进行必要且可能的扩充和删改。4.按照“后进先出”原则组织数据的数据结构是_。(分数:2.50)A.队列B栈 C.双向链表D.二叉树解析:解析 栈和队列都是一种特殊的操作受限的线性表,只允许在端点处进行插入和
25、删除。二者的区别是:栈只允许在表的一端进行插入或删除操作,是一种“后进先出”的线性表;而队列只允许在表的一端进行插入操作,在另一端进行删除操作,是一种“先进先出”的线性表。具有记忆功能。双向链表和二叉树都没有按照“后进先出”的原则。5.下列叙述中正确的是_。(分数:2.50)A.线性链表是线性表的链式存储结构 B.栈与队列是非线性结构C.双向链表是非线性结构D.只有根结点的二叉树是线性结构解析:解析 根据数据结构中各数据元素之间前后关系的复杂程度,一般将数据结构分为两大类型:线性结构与非线性结构。如果一个非空的数据结构满足下列两个条件:有且只有一个根结点;每个结点最多有一个前件,也最多有一个后
26、件。则称该数据结构为线性结构,又称线性表。如果一个数据结构不是线性结构,则称之为非线性结构。线性表、栈与队列、线性链表都是线性结构,而二叉树是非线性结构。6.对如下二叉树,进行后序遍历的结果为_。 (分数:2.50)A.ABCDEFB.DBEAFCC.ABDECFD.DEBFCA 解析:解析 后序遍历:若需遍历的二叉树为空,执行空操作;否则,依次执行下列操作: (1)首先按照后序遍历的顺序访问根结点的左子树; (2)然后按照后序遍历的顺序访问根结点的右子树; (3)最后访问根结点。7.在深度为 7 的满二叉树中,叶子结点的个数为_。(分数:2.50)A.32B.31C.64 D.63解析:解析
27、 所谓满二叉树是指这样的一种二叉树:除最后一层外,每层上的所有结点都有两个子结点。这就是说,在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第 k 层上有 2k-1 个结点,且深度为 m 的满二叉树有 2m-1 个结点。树的最大层次称为树的深度。本题中深度为 7,故叶子结点数为 2 7 -1=64。8.“商品”与“顾客”两个实体集之间的联系一般是_。(分数:2.50)A.一对一B.一对多C.多对一D.多对多 解析:解析 在现实世界中,两个实体之间的联系可分为三种类型: 一对一联系(简记为 1:1):一对一的联系表现为主表中的每一条记录只与相关表中的一条记录相关联。 一对多联系(简记为
28、 1:n):一对多的联系表现为主表中的每一条记录与相关表中的多条记录相关联。 多对多联系(简记为 M:N 或 m:n):多对多的联系表现为一个表中的多个记录在相关表中同样有多个记录其匹配。 该题目中一个顾客可以购买多种商品,同一种商品可以有多个顾客购买,所以商品和顾客之间是多对多的联系。9.在 E-R 图中,用来表示实体的图形是_。(分数:2.50)A.矩形 B.椭圆形C.菱形D.三角形解析:解析 该题目主要考的是 E-R 模型的图示法:在 E-R 图中用矩形表示实体,存矩形内写上该实体的名字,这是实体表示法;用椭圆表示属性,在椭圆形内写上该属性的名称,这是属性表示法;用菱形表示联系,这是联系
29、表示法。10.数据库 DB、数据库系统 DBS、数据库管理系统 DBMS 之间的关系是_。(分数:2.50)A.DB 包含 DBS 和 DBMSB.DBMS 包含 DB 和 DBSC.DBS 包含 DB 和 DBMS D.没有任何关系解析:解析 数据库系统由如下几部分组成:数据库、数据库管理系统、数据库管理员、系统平台(硬件平台和软件平台)。所以数据库、数据库系统与数据库管理系统之间的关系是数据库系统包含数据库和数据库管理系统。11.下列关于 C+函数的说明中,正确的是_。(分数:2.50)A.内联函数就是定义在另一个函数体内部的函数B.函数体的最后一条语句必须是 return 语句C.标准
30、C+要求在调用一个函数之前,必须先声明其原型 D.编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式解析:解析 在 C+中,内联函数是为了取代宏而引进的,它是真正的函数,但是和普通函数不同的是,在函数调用的时候像宏一样展开使用。函数如果没有返回值的话,就不用 return 语句。函数重载看的是参数跟返回值类型没有关系。12.由于常对象不能被更新,因此_。(分数:2.50)A.通过常对象只能调用它的常成员函数 B.通过常对象只能调用静态成员函数C.常对象的成员都是常成员D.通过常对象可以调用任何不改变对象值的成员函数解析:解析 通过常对象只能调用类中的常成员函数,而不能调用类中的其他成
31、员函数。13.下列关于虚函数的说明中,正确的是_。(分数:2.50)A.从虚基类继承的函数都是虚函数B.虚函数不得是静态成员函数 C.只能通过指针或引用测用虚函数D.抽象类中的成员函数都是虚函数解析:解析 虚函数和虚基类没有必然联系。虚函数不能是静态成员函数,也不能是内联函数和构造函数。虚函数有两种调用方法:多态调用(通过指针和引用)和非多态调用(直接调用)。有纯虚函数的类才是抽象类,但抽象类的成员函数并不都是纯虚函数。14.运算符重载是对已有的运算符赋予多重含义,因此_。(分数:2.50)A.可以对基本类型(如 int 类型)的数据,重新定义“+”运算符的含义B.可以改变一个已有运算符的优先
32、级和操作数个数C.只能重载 C+中已经有的运算符,不能定义新运算符 D.C+中已经有的所有运算符都可以重载解析:解析 运算符重载不能改变当运算符作用于 C+内部类型的对象时的含义,即运算符的函数的参数中至少有一个用户自定义对象。运算符不能改变运算符原有的优先级和结合性。“.”、“:”、“.*”、“-*”、“?:”这五个运算符是不能重载的。15.模板对类型的参数化提供了很好的支持,因此_。(分数:2.50)A.类模板的主要作用是生成抽象类B.类模板实例化时,编译器将根据给出的模板实参生成一个类 C.在类模板中的数据成员都具有同样类型D.类模板中的成员函数都没有返回值解析:解析 抽象类和类模板没有
33、联系,含有纯虚函数的类才是抽象类。类模板中的数据成员可以是虚拟类型,也可以是不同的具体类型,类模板中德尔成员函数都是模板函数,可以有返回值,故 B 是正确的。16.下列关于 C+流的说明中,正确的是_。(分数:2.50)A.与键盘、屏幕、打印机和通信端口的交互都可以通过流类来实现 B.从流中获取数据的操作称为插入操作,向流中添加数据的操作称为提取操作C.cin 是一个预定义的输入流类D.输出流有一个名为 open 的成员函数,其作用是生成一个新的流对象解析:解析 从流中获取数据的操作应该是提取操作,向流中添加数据的操作成为提取操作。cin 是一个输入流对象,而不是类,open 是用来打开文件的
34、函数,而不是生成新的流对象的。17.下列符号中可以用作 C+标识符的是_。(分数:2.50)A._radius B.foobarC.elseD.3room解析:解析 在 C+中,标识符只能使用字母、数字、下画线、其中数字不能是首字符,关键字也不能为标识符,故答案 A 是正确的。18.下列语句中,错误的是_。(分数:2.50)A.const int buffer=256;B.const int temp; C.const double *point;D.const double *rt=new double(5.5);解析:解析 修饰符 const 声明的常量只能被读取,该常量必须在声明时进行初
35、始化,并且它的值在程序中不能改变。故 B 是错误的。19.有如下程序: int x=3; do x-=2; coutx; while(!(-x); 执行这个程序的输出结果是_。(分数:2.50)A.1B.30C.1-2 D.死循环解析:解析 x 的初始值为 3,首先执行一次循环体,x 变为 1,输出,-x,x 为 0,(!0)为 1,条件为真,继续执行循环体,x 变为-2,输出,-x,x 为-3,!(-3)为 0,条件假,跳出循环,故答案为 C。20.有如下程序: #includeiostream using namespace std; int main() int *p; *p=9; co
36、ut“The value at p:“*p; return 0; 编译运行程序将出现的情况是_。(分数:2.50)A.够编译时出现语法错误,不能生成可执行文件B.运行时一定输出:The value at p:9C.运行时一定输出:The value at p:*9D.运行时有可能出错 解析:解析 定义了指针 p,却没有赋值,指针的指向是随机的,所以程序运行时可能会出错。21.有如下程序: #includeiostream using nanespace std; int main() void function(double val); double val; function(val); c
37、outval; return 0; void function(double val) val=3; 编译运行这个程序将出现的情况是_。(分数:2.50)A.编译出错,无法运行B.输出:3C.输出:3.0D.输出一个不确定的数 解析:解析 函数 function()中的 val 只是局部变量,函数调用进行的是参数传递,实参的值是没有变化的,而 val 在主函数中没有赋值所以 val 始终是个不确定的值。22.有如下类定义: class AA int a; public: int getRef() constreturn / int getvalue() constreturn a; / voi
38、d set(int n) consta=n; / friend void show(AA aa) const cout/ ; 其中的四个函数定义中正确的是_。(分数:2.50)A.B. C.D.解析:解析 函数的返回类型不正确,函数是常函数却改变了成员的值,函数是友元函数应该用aa.a 访问对象成员,而不能直接访问成员。故选项 B 是正确的。23.有如下程序: #includeiostream using namespace std; class Base public: void fun()cout“Base:fun“endl; ; class Derived:public Base pub
39、lic: void fun() cout“Derived:fun“endl; ; int main() Derived d; d.fun(); return 0; 已知其执行后的输出结果为_。 Base:fun Derived:fun 则程序中下画线处应填入的语句是_。(分数:2.50)A.Base.fun();B.Base:fun() C.Base-fun()D.fun();解析:解析 由于基类和派生类都定义了同名,同参数的函数,所以引用基类中 fun()函数的时候要用作用域运算符“:”。24.下面是重载为非成员函数的运算符函数原型,其中错误的是_。(分数:2.50)A.Fraction o
40、perator+(Fraction, Fraction);B.Fraction operator-(Fraction);C.Fraction D.Fraction解析:解析 赋值运算符“=”必须作为成员函数重载。25.有如下函数模板: Templatetypename T, typename U T cast(U u)return u; 其功能是将 U 类型数据转换为 T 类型数据。已知 i 为 int 型变量,下列对模板函数 cast 的调用中正确的是_。(分数:2.50)A.cast(i);B.cast(i);C.castchar*, int(i);D.castdouble, int(i)
41、; 解析:解析 当模板函数获得特定类型的返回值时,不能省略模板实参,故 A、B 是错误的,C 项中把int 转换为 char*型,程序执行时将会出错。26.若磁盘上已存在某个文本文件,其全路径文件名为 d:/ncre/test.txt,下列语句中不能打开该文件的是_。(分数:2.50)A.ifstream file(“d:/ncre/test.txt“); B.ifstream file(“d:/ncre/test.txt“);C.ifstream file; file.open(“d:/ncre/test.txt“);D.ifstream* pFile=new ifstream(“d:/nc
42、re/test.txt“);解析:解析 在用字符串常量表示一个文件名时,文件路径中“/”必须表示为转义字符“/”,因此选项 A 错误。27.有如下类定义: class Foo public: Foo(int v):value(v)/ Foo()/ private: Foo()/ int value=0; / ; 其中存在语法错误的行是_。(分数:2.50)A.B.C.D. 解析:解析 在类的成员中,非静态成员不能在类中直接被赋值,要通过构造函数初始化。故答案 D 是错的。28.有如下类定义: class Point int x_, y_; public: Point():x_(0), y_(0
43、) Point(int x, int y=0):x_(x), y_(y) ; 若执行语句 Point a(2), b3, *c4; 则 Point 类的构造函数被调用的次数是_。(分数:2.50)A.2 次B.3 次C.4 次 D.5 次解析:解析 在定义指向对象的指针时,由于指针没有实例化,故不调用构造函数。当对象 a 和对象数组 b 中的 3 个对象被创建时,构造函数被调用 4 次。29.有如下类定义: class Test public: Test()a=0; c=0; / int f(int a)constthis-a=a;/ static int g()return a;/ void
44、 h(int b)Test:b=b;/ private: int a; static int b; const int c; ; int Test:b=0; 在标注号码的行中,能被正确编译的是_。(分数:2.50)A.B.C.D. 解析:解析 行中,由于 c 为常数据成员,初始化应该采用类表方式;行中,常函数不能更新类的数据成员,行中,静态函数应该返回静态成员;只有行正确编译。30.有如下程序: #includeiostream using namespace std; class A public: A()cout“A“; A()cout“A“; ; class B:public A A*
45、p; public: B()cout“B“; p=new A(); B()cout“B“; delete p; ; int main() B obj; return 0; 执行这个程序的输出结果是_。(分数:2.50)A.BAAABAB.ABABAA C.BAABAAD.ABAABA解析:解析 根据派生类的执行顺序,首先执行基类 A 的构造函数 A(),输出 A,由于定义对象指针 p 时不调用构造函数,所以接下来执行派生类 B 的构造函数体:先输出 B,然后动态创建基类 A 的对象,此时需要掉要基类 A 的构造函数,输出 A。再根据析构函数的执行顺序,先调用派生类的析构函数:输出B,然后删除
46、p 所指向的积累对象,此时调用基类的析构函数,输出A,最后调用基类的析构函数,输出A,故最后结果是 B。31.有如下程序: #includeiostream using namespace std; class Base private: void fun1() constcout“fun1“; protected: void fun2() constcout“fun2“; public: void fun3() constcout“fun3“; ; class Derived:protected Base public: void fun4() constcout“fun4“; ; int main() Derived obj; obj.fun1();/ obj.fun2();/ obj.fun3();/ obj.fun4();/ return 0; 其中有