1、二级 C+笔试-304 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:30,分数:70.00)1.下面内容不属于使用软件危机的是( )。(分数:2.00)A.软件质量难以保证B.软件的成本不断提高C.软件需求增长缓慢D.软件不可维护或维护程度非常低2.下列叙述中,正确的是( )。(分数:2.00)A.while 语句构成的循环不能用其他语句构成的循环来代替B.do-while 语句构成的循环只能用 break 语句退出C.用 while 语句构成的循环,只有在 while 后的表达式为非 0 时才执行循环D.do-while 语句构成的循环,只有在 while 后的
2、表达式为 0 时才结束循环3.以下程序执行后的输出结果是 ( )。#include iostream.hclass Baselpublic:void fun() cout“Basel“end1; ;class Base2public:void fun() cout“Base2“end1; class Derived : public Basel,public Base2;void main()Derived Obj;Obj.fun();(分数:2.00)A.BaselB.Base2C.BaselBase2D.程序产生二义性4.有如下程序:#include iostreamusing names
3、pace std;int getSum(int num);int main ()int i;for (i=1; i4; i+)coutgetSum(i);return 0;int getSum(int hum)static int sum=O;sum+=num;return sum;上述程序执行后的输出结果是( )。(分数:2.00)A.136B.248C.123D.1355.数据字典(DD) 是定义以下哪种系统描述工具中的数据的工具( )。(分数:2.00)A.数据流程图B.系统流程图C.程序流程图D.软件结构图6.若有以下程序:void g(int *q)(*q) +;(*q) +;voi
4、d main()int line 5;int *p=line;for (i=0; i5; i+)*p=i;g(for (i=0; i5; i+)coutlinei;coutend1;该程序运行后的输出结果为( )。(分数:2.00)A.12345B.01234C.11111D.555557.以下各项说法中,正确的是( )。(分数:2.00)A.当通过引用传递参数时,函数创建一个变量以存储参数的值B.当通过引用传递参数时,函数无法访问参数的值C.当通过引用传递参数时,调用程序创建一个临时变量以容纳参数的值D.当通过引用传递参数时,函数访问调用程序中参数的原始值8.若有定义“int k,*q;”,
5、则下列各选项中,赋值表达式正确的是( )。(分数:2.00)A.q=(class sampleprivate:int x, y;public:sample(int i,int j)x=i;y=j;void disp()cout“displ“end1;void disp() constcout“disp2“end1;int main ()const sample a(i,2);a.disp ();return 0;该程序运行后的输出结果是( )。(分数:2.00)A.disp1B.disp2C.disp1 disp2D.程序编译时出错11.下面的程序段中,有( )处错误和警告。#includes
6、tdiohint main()int x;cinxcoutx;(分数:2.00)A.1B.2C.3D.412.有以下程序:#include iostreamusing namespace std;int f1(int x, int y)return xy ? x:y;int f2(int x, int y)return xy? y:x;int main ( )int a = 4,b = 3,c = 5,d,e,f;d = f1(a,b) ;d = f1(d,c) ;e = f2 (a,b) ;e = f2(e,c) ;f = a+b+c-d-e;coutd“, “e“, “fend1;retu
7、rn 0;执行后的输出结果是 ( )。(分数:2.00)A.3,4,5B.5,3,4C.5,4,3D.3,5,413.下列对派生类的描述中,错误的是( )。(分数:2.00)A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的默认继承方式是私有派生D.派生类只继承了基类的公有成员和保护成员14.关于类型转换的说法中,错误的是( )。(分数:2.00)A.如果 a 为血型变量,b 为 char 型变量,则 a+b 的值为血型B.如果 a 为 float 型变量,b 为 int 型变量,则 a-b 的值为 float 型C.如果 a 为 double 型变量,b 为 flo
8、at 型变量,则 a*b 的值为 double 型D.如果 a 为血型变量,b 为血型变量,则 a(double)b 的值为 int 型15.下列关于栈的叙述中,不正确的是( )。(分数:2.00)A.在栈中能插入数据B.在栈中能删除数据C.栈是先进先出的线性表D.栈是先进后出的线性表16.下列各项特点中,属于线性表的顺序存储结构的是( )。(分数:2.00)A.线性表中所有元素所占的存储空间是不连续的B.线性表的数据元素在存储空间中是随便存放的C.线性表中所有元素所占的存储空间是连续的D.前后件两个元素在存储空间是随便存放的17.一个关系数据库文件中的各条记录( )。(分数:2.00)A.前
9、后顺序不能任意颠倒,一定要按照输入的顺序排列B.前后顺序可以任意颠倒,不影响库中数据的数据关系C.前后顺序可以任意颠倒,但排列顷序不同,统计处理的结果就可能不同D.前后顺序不能任意颠倒,一定要按照关键词段值的顺序排列18.对于输入输出,在设计和编程时都应该考虑的原则是( )。(分数:2.00)A.对部分输入数据检验数据的合法性B.不允许默认值C.输入一批数据时,最好使用输入结束标志D.输入数据时,不允许使用自由格式19.有以下程序:#include iostreamusing namespace std;int main ( )char s110,s210;char *p=s1,*q=s2;c
10、ins1s2;while (*p ! = /0 )p+;while (*q!=/0)*p+=*q+;*p=/0;couts1end1;return 0;(分数:2.00)A.abcd0ghijB.abcd0ghij0C.abcdD.abcdghij20.对下列程序的描述中,正确的是( )。#includeiostreamusing namespace std;int Fun(int,int);int main()coutFun(5,50)end1;return 0;int Fun(int x,int y)return x*x+y*y;(分数:2.00)A.该函数定义正确,但函数调用方式错误B.
11、该函数调用方式正确,但函数定义错误C.该函数的定义和调用方式都是正确的D.该函数的定义和调用方式都是错误的21.以下程序执行结果是 ( )。#include iostream.hclass Basepublicvirtual void fun() cout“B“; ;class Derivedpublic:Derived() cout“D“; virtual void fun() Base:fun(); cout“C“; int main ()Base *ptr;Derived obj;ptr=p-fun ( );return 0;(分数:3.00)A.DBCB.DCBC.BDCD.CBD22
12、.对待排序文件的初始状态不作任何要求的排序方法有( )。(分数:3.00)A.直接插入和快速排序B.直接插入和归并排序C.归并和快速排序D.归并和直接选择排序23.一个类的友元函数或友元类可以通过成员操作符访问该类的( )。(分数:3.00)A.私有成员B.保护成员C.公有成员D.所有成员24.下面对静态数据成员的描述中,正确的是( )。(分数:3.00)A.静态数据成员可以在类体内进行初始化B.静态数据成员不可以通过类的对象调用C.静态数据成员不能受 private(私有)控制符的作用D.静态数据成员可以直接通过类名调用25.有以下程序:#include iostreamusing name
13、space std;class Aprivate:int x,y;public:void set (int i,int j)x=i;y=j;int get_y()return y;class boxprivate:int length,width;A label;public:void set(int 1,int w, int s,int p)length=1;width=w;label.set(s,p);int get_area()return length*width;int main()box small;small.set(2,4,1,35);coutsmall.get_area()e
14、nd1;return 0;运行后的输出结果是( )。(分数:3.00)A.8B.4C.35D.7026.若有以下程序#include iostreamusing 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()cout a “ , “ b end1;private:int a,b;class B : private Apublic:B(int i,int j) :A(i,j) void fun ( )move (3, 5);void f1 ( )A:sho
15、w();int main ( )B d(3,4);d. fun ( );d.f1();return 0;程序执行后的输出结果是 ( )。(分数:3.00)A.3,4B.6,8C.6,9D.4,327.下列各项中不属于算法基本特征的是( )。(分数:3.00)A.可行性B.递归性C.确定性D.有穷性28.执行语句序列ofstream outfile(“data.dat“);if(.) cout“ok“;else cout“fail“;后,如果文件打开成功,显示“ok”,否则显示“fail”。由此可知,上面 if 语句“.”处的表达是 ( )。(分数:3.00)A.outfile.fail() 或
16、 outfileB.outfile.good()或!outfileC.outfile.good()或 outfileD.outfile.fail()或!outfile29.下列描述中,( )是抽象类的特性。(分数:3.00)A.可以说明虚函数B.可以进行构造函数重载C.可以定义友元函数D.不能说明其对象30.下列关于链式存储的叙述中,正确的是( )。(分数:3.00)A.链式存储结构的空间不可以是不连续的B.数据节点的存储顺序与数据元素之间的逻辑关系必须一致C.链式存储方式只可用于线性结构D.链式存储也可用于非线性结构二、填空题(总题数:12,分数:30.00)31.对于长度为 n 的线性表,
17、若进行顺序查找,则时间复杂度为 【1】 。(分数:2.00)填空项 1:_32.已知某序列为 49,38,65,97,76,13,27,试采用该序列的第一个元素为枢轴进行快速排序,则经过一趟快速排序之后所得到的序列为: 【2】 。(分数:2.00)填空项 1:_33.软件生命周期一般可分为以下阶段:问题定义、可行性研究、 【3】 、设计、编码、 【4】 、运行与维护。(分数:4.00)填空项 1:_34.在选择运算所得到的结果关系中,所含的元组数不合 【5】 原关系中的元组数。(分数:2.00)填空项 1:_35.当输入 10,11,12 时,下面程序运行结果是 【6】 。#include i
18、ostreamusing namespace std;int main()int a,b,c,max;cinabc;max=a;if (maxB) max=b;if (maxC) max=c;coutmaxend1;return 0;(分数:2.00)填空项 1:_36.下面程序的功能是:将字符数组 a 中下标值为偶数的元素从小到大排列,其他元素不变。请填空完成此程序。#include iostream#include stringusing namespace std;int main ( )char a=“changuage“,t,m;int i,j,k;k=strlen(A) ;for
19、(i=0; i=k-2; i+=2)m=i;for (j=i+2; j=k; 【7】 )if (am a jm=j;if( 【8】 )t=ai;ai=am;a m =t;coutaend1;return 0;(分数:4.00)填空项 1:_37.阅读下面程序:#include iostreamusing namespace std;int fun( int a, int b)int c;c = a * b;return c;int main ( )int a = 3, b = 5, c = 4, x = O;x = fun( fun( a, b ), c );coutxend1;return
20、0;其运行结果是 【9】 。(分数:2.00)填空项 1:_38.在 C+语言中,每个类都有一个隐含的指针叫 【10】 指针。该指针指向 【11】 。(分数:4.00)填空项 1:_39.经常和一个运算符连用,构成一个运算符函数名的 C+关键词是 【12】 。(分数:2.00)填空项 1:_40.若有以下程序:#include iostreamusing namespace std;template class TT min(T x,T y)if(xy)return x;elsereturn y;int main()int n1=2,n2=10;double d1=1.5;d2=5.6;cou
21、tmin(n1,n2)“,“;coutmin(d2,d2)end1;return 0;程序运行后的输出结果是 【13】 。(分数:2.00)填空项 1:_41.以下程序运行后的输出结果是 【14】 。#include iostream#include stringusing namespace std;class Y;class Xint x;char *strx;public:X(int a,char *str)x=a;strx=new charstrlen(str)+1;strcpy(strx,str);void show(Y ;class Yprivate:int y;char *str
22、y;public:Y(int b,char *str)y=b;stry=new charstrlen(str)+1;strcpy(stry, str);friend void X:show(Y ;void X:show(Y coutob.stryend1;int main()X a(10,“stringX“);Y b(20,“stringY“);a. show (b) ;return O;(分数:2.00)填空项 1:_42.有如下的程序:#include iostream#include fstreamusing namespace std;int main()ofstream outf(“
23、D:/temp.txt“,ios_base:trunc) ;outf“World Wide Web“;outf.close();ifstream inf(“D:/temp.txt“);char s20;infs;inf.close();couts;return 0;执行后的输出结果是 【15】 。(分数:2.00)填空项 1:_二级 C+笔试-304 答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:30,分数:70.00)1.下面内容不属于使用软件危机的是( )。(分数:2.00)A.软件质量难以保证B.软件的成本不断提高C.软件需求增长缓慢 D.软件不可维护或维护程度
24、非常低解析:解析 所谓软件危机是泛指在计算机软件的开发和维护过程中所遇到的一系列严重问题。选项A、B、D 都属于软件危机的一种表现,软件危机还包括软件需求的增长得不到满足、软件开发成本和进度无法控制和软件开发生产率的提高赶不上硬件的发展和应用需求的增长。2.下列叙述中,正确的是( )。(分数:2.00)A.while 语句构成的循环不能用其他语句构成的循环来代替B.do-while 语句构成的循环只能用 break 语句退出C.用 while 语句构成的循环,只有在 while 后的表达式为非 0 时才执行循环 D.do-while 语句构成的循环,只有在 while 后的表达式为 0 时才结
25、束循环解析:解析 本题考核对 do-while 语句、while 语句基本语法的掌握。选项 A 中,while 语句构成的循环体可由其他语句构成的循环体代替,所以选项 A 不正确。选项 B 中, do-while 语句构成的循环,当while 的条件表达式的值为 0 时,也可结束循环,所以选项 B 也不正确。选项 C 是正确的。选项 D 可参照选项 B,当使用 break 语句时,也可退出循环。故选项 D 也不正确。3.以下程序执行后的输出结果是 ( )。#include iostream.hclass Baselpublic:void fun() cout“Basel“end1; ;clas
26、s Base2public:void fun() cout“Base2“end1; class Derived : public Basel,public Base2;void main()Derived Obj;Obj.fun();(分数:2.00)A.BaselB.Base2C.BaselBase2D.程序产生二义性 解析:解析 本题考核继承中可能出现的二义性问题;题中当派生类 Derived 的对象 obj 访问函数 fun()时,由于无法确定访问的是基类 Basel 中的 fun()函数还是基类 Base2 中 fun()函数,从而对函数 fun()的访问产生二义性。4.有如下程序:#
27、include iostreamusing namespace std;int getSum(int num);int main ()int i;for (i=1; i4; i+)coutgetSum(i);return 0;int getSum(int hum)static int sum=O;sum+=num;return sum;上述程序执行后的输出结果是( )。(分数:2.00)A.136 B.248C.123D.135解析:解析 在函数 getSum()中,局部变量 sum 被声明为 static,并且初始化为 0。该程序使用getSum()函数计算并报告当前计算所得结果。由于 su
28、m 是 static 变量,因此它在函数调用过程中始终保持其值,即使函数调用结束,其空间也不会被释放,下次再调用时,上次运行结果仍然保留。5.数据字典(DD) 是定义以下哪种系统描述工具中的数据的工具( )。(分数:2.00)A.数据流程图 B.系统流程图C.程序流程图D.软件结构图解析:解析 本题考查数据字典的作用,数据字典是对数据流程图中出现的被命名的图形元素的确切解释。6.若有以下程序:void g(int *q)(*q) +;(*q) +;void main()int line 5;int *p=line;for (i=0; i5; i+)*p=i;g(for (i=0; i5; i+
29、)coutlinei;coutend1;该程序运行后的输出结果为( )。(分数:2.00)A.12345 B.01234C.11111D.55555解析:解析 本题考核指针的运用。主函数的 for 循环中向函数 g()传入实参class sampleprivate:int x, y;public:sample(int i,int j)x=i;y=j;void disp()cout“displ“end1;void disp() constcout“disp2“end1;int main ()const sample a(i,2);a.disp ();return 0;该程序运行后的输出结果是(
30、)。(分数:2.00)A.disp1B.disp2 C.disp1 disp2D.程序编译时出错解析:解析 C+中,在定义常对象时必须进行初始化,而且不能被更新。如果将一个对象说明为常对象,则通过该对象只能调用它的常成员函数。题中,对象 a 被定义成类 sample 的常对象,所以通过对象 a 只能调用其常成员函数 disp()。所以程序最后输出 disp2。11.下面的程序段中,有( )处错误和警告。#includestdiohint main()int x;cinxcoutx;(分数:2.00)A.1B.2C.3D.4 解析:解析 本题考核 C+程序的基本结构。第 1 处错误:头文件std
31、ioh应改为iostreamh。因为在 C+语言中,输入输出流的流类库是在iostreamh头文件中定义的。第 2 处错误:主函数缺少左大括号“”。第 3 处错误:语句 cinx 后面缺少“;”。第 4 处错误:由于已设定主函数的返回类型是血型,因此,在程序结束后,必须给出返回值或者将主函数的返回类型更改为 void 型。12.有以下程序:#include iostreamusing namespace std;int f1(int x, int y)return xy ? x:y;int f2(int x, int y)return xy? y:x;int main ( )int a = 4
32、,b = 3,c = 5,d,e,f;d = f1(a,b) ;d = f1(d,c) ;e = f2 (a,b) ;e = f2(e,c) ;f = a+b+c-d-e;coutd“, “e“, “fend1;return 0;执行后的输出结果是 ( )。(分数:2.00)A.3,4,5B.5,3,4 C.5,4,3D.3,5,4解析:解析 本题考核函数的调用和条件运算符(?)。解此题前,先来复习一下条件运算符的运算规则。对于表达式:表达式 1?表达式 2:表达式 3,它的运算方式为:先计算表达式 1 的值,如果其值为真(true),则表达式 2 的值就是整个表达式的最终结果,否则表达式 3
33、 的值就是整个表达式的值。在了解条件运算符的运算规则后,来看函数 f1()和 f2()。根据条件运算符的运算规则,可得到函数 f1()的功能是返回两数中的较大值,函数 f2()的功能足返回两数中的较小值。再分析主函数,由于a=4,b=3,d 经过第 1 次赋值后得到值为 4,即 d=4。d 的第 2 次赋值表达式为“d=f1(d,C) ”,由于此时 d=4、c=5,故经过两次赋值后得到 d=5。同样 e 经过两次赋值后可得 e=3。再把 a=4、b=3、c=5、d=5、e=3 代入表达式 f=a+b+c-d-e,最后得到 f=4。13.下列对派生类的描述中,错误的是( )。(分数:2.00)A
34、.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的默认继承方式是私有派生D.派生类只继承了基类的公有成员和保护成员 解析:解析对于选项 A,在 C+中,一个派生类可以作为另一派生类的基类,所以选项 A 是正确的。对于选项 B,在 C+语言中,可以从一个类派生出另一个类。派生其他类的类称为基类,被派生的类称为派生类。一个派生类可以从一个基类派生,也可以从多个基类派生。所以派生类应至少有一个基类。对于选项 C,在 C+中,当派生类时,如果没有特别指定派生的类型,C+编译器会自动指定其为私有派生。所以选项 C 也是正确的。对于选项 D,在 C+中,派生类中包含了基类的所有成员
35、,但基类的私有成员在派生类中是隐蔽的,不能被访问。所以选项 D 是错误的。14.关于类型转换的说法中,错误的是( )。(分数:2.00)A.如果 a 为血型变量,b 为 char 型变量,则 a+b 的值为血型B.如果 a 为 float 型变量,b 为 int 型变量,则 a-b 的值为 float 型C.如果 a 为 double 型变量,b 为 float 型变量,则 a*b 的值为 double 型D.如果 a 为血型变量,b 为血型变量,则 a(double)b 的值为 int 型 解析:解析 C+中数据类型转换有两类,即隐式类型转换和显式类型转换。隐式类型转换是由编译器自动完成的类
36、型转换。当编译器遇到不同类型的数据参与同一运算时,会自动将它们转换为相同类型后再进行运算。赋值时,会把所赋值的类型转换为与被赋值变量类型一样。隐式类型转换按从低到高的顺序进行。显式类型转换是由程序员显式指出的类型转换,使用显式类型转换的好处是,编译器不必自动进行两次转换,而由程序员负责类型转换的正确性。由此可知选项 D 中 a(double)b 的值应为 double 型。15.下列关于栈的叙述中,不正确的是( )。(分数:2.00)A.在栈中能插入数据B.在栈中能删除数据C.栈是先进先出的线性表 D.栈是先进后出的线性表解析:解析 栈是一种线性表,只不过是一种特殊的线性表。在这种特殊的线性表
37、中,插入和删除运算都只在线性表的一端进行。即在这种线性表中,一端是封闭的,不允许进行插入与删除元素。一端是开口的,允许进行插入与删除元素,选项 A、B 是正确的。栈是一种先进后出的线性表。16.下列各项特点中,属于线性表的顺序存储结构的是( )。(分数:2.00)A.线性表中所有元素所占的存储空间是不连续的B.线性表的数据元素在存储空间中是随便存放的C.线性表中所有元素所占的存储空间是连续的 D.前后件两个元素在存储空间是随便存放的解析:解析 线性表的顺序存储结构要求:线性表中所有元素所占的存储空间是连续的,并且线性表的数据元素在存储空间中是按逻辑顺序依次存放的。因此,选项 A、B 是错误的。
38、在线性表的顺序存储结构中,前后件两个元素在存储空间中是紧邻的,因此,选项 D 也是错误的。17.一个关系数据库文件中的各条记录( )。(分数:2.00)A.前后顺序不能任意颠倒,一定要按照输入的顺序排列B.前后顺序可以任意颠倒,不影响库中数据的数据关系 C.前后顺序可以任意颠倒,但排列顷序不同,统计处理的结果就可能不同D.前后顺序不能任意颠倒,一定要按照关键词段值的顺序排列解析:解析 关系数据库的逻辑性强而物理性少,因此关系数据库中的各条记录前后顺序可以任意颠倒,不影响库中数据的数据关系。18.对于输入输出,在设计和编程时都应该考虑的原则是( )。(分数:2.00)A.对部分输入数据检验数据的
39、合法性B.不允许默认值C.输入一批数据时,最好使用输入结束标志 D.输入数据时,不允许使用自由格式解析:解析 输入输出信息是用户直接关心的,输入输出方式和格式应尽可能方便用户的使用,因为系统能否被用户接受,往往取决于输入输出的风格。好的输入输出风格对所有输入数据检验数据的合法性,允许默认值,并且在输入数据时,允许使用自由格式。19.有以下程序:#include iostreamusing namespace std;int main ( )char s110,s210;char *p=s1,*q=s2;cins1s2;while (*p ! = /0 )p+;while (*q!=/0)*p+
40、=*q+;*p=/0;couts1end1;return 0;(分数:2.00)A.abcd0ghijB.abcd0ghij0C.abcdD.abcdghij 解析:解析 程序定义两个字符串指针 p 和 q,并使指针分别指向字符串数组 s1 和 s2。数组 s1 和 s2 通过输入的字符串赋初值。程序中第 1 个 while 语句,用来计算 s1 的长度,并把指针 p 移到数组 s1 的最后一个元素。第 2 个 while 语句,是将数组 s2 中的字符串合并到数组 s1 的后面。语句“*p/0;”,是合并后的字符串 s1 的结束标志。所以最后 s1 中的字符串为 abcdghij。20.对下
41、列程序的描述中,正确的是( )。#includeiostreamusing namespace std;int Fun(int,int);int main()coutFun(5,50)end1;return 0;int Fun(int x,int y)return x*x+y*y;(分数:2.00)A.该函数定义正确,但函数调用方式错误B.该函数调用方式正确,但函数定义错误C.该函数的定义和调用方式都是正确的 D.该函数的定义和调用方式都是错误的解析:解析函数定义时要给出函数类型、函数名、函数参数表和函数体。本程序的 Fun()都做到了,所以此函数的定义也是正确的。该函数的定义和调用方式都是正
42、确的。21.以下程序执行结果是 ( )。#include iostream.hclass Basepublicvirtual void fun() cout“B“; ;class Derivedpublic:Derived() cout“D“; virtual void fun() Base:fun(); cout“C“; int main ()Base *ptr;Derived obj;ptr=p-fun ( );return 0;(分数:3.00)A.DBC B.DCBC.BDCD.CBD解析:解析 本题考核虚函数的应用。主函数中创建派生类 Derived 的对象。obj 时,调用其构造函
43、数首先输出字符D。然后调用 fun()函数,由于派生 Derived 已对基类的虚函数 fun()进行了重定义,所以语句“p-fun();”调用的是派生类中的函数 fun(),即输出 BC。所以答案为 A 选项。22.对待排序文件的初始状态不作任何要求的排序方法有( )。(分数:3.00)A.直接插入和快速排序 B.直接插入和归并排序C.归并和快速排序D.归并和直接选择排序解析:解析 只有归并排序要求待排序文件“部分排序” (把待排序的文件分成若干个子文件,每个子文件内的记录是己排序的)。23.一个类的友元函数或友元类可以通过成员操作符访问该类的( )。(分数:3.00)A.私有成员B.保护成
44、员C.公有成员D.所有成员 解析:解析在 C+中,如果想让类中的成员数据可以被其他函数访问,可以通过友元函数声明来分享类中的资源。除了友元函数外,还有友元类。类的友元函数对类的属性和方法的访问能力等同于类的成员函数。24.下面对静态数据成员的描述中,正确的是( )。(分数:3.00)A.静态数据成员可以在类体内进行初始化B.静态数据成员不可以通过类的对象调用C.静态数据成员不能受 private(私有)控制符的作用D.静态数据成员可以直接通过类名调用 解析:解析对于选项 A,C+规定对静态数据成员的初始化应该在类体外进行初始化。所以选项 A 是错误的。对于 B 选项,C+规定静态数据成员可由任
45、意访问权限许可的函数或对象访问,所以选项 B 是错误的。对于选项 C,在 C+中,静态数据成员也可以定义为私有的静态数据成员,所以选项 C 的描述是错误的。对于选项 D,在 C+中,静态数据成员是类的所有对象共享的成员,即可以通过类名访问,也可以通过对象访问。但通过类名访问更方便、更高效。所以选项 D 的描述是正确的。25.有以下程序:#include iostreamusing namespace std;class Aprivate:int x,y;public:void set (int i,int j)x=i;y=j;int get_y()return y;class boxpriva
46、te:int length,width;A label;public:void set(int 1,int w, int s,int p)length=1;width=w;label.set(s,p);int get_area()return length*width;int main()box small;small.set(2,4,1,35);coutsmall.get_area()end1;return 0;运行后的输出结果是( )。(分数:3.00)A.8 B.4C.35D.70解析:解析 本题考核成员对象的应用。类 box 的成员函数 set()为设置对象的坐标值和对象的长、宽值。成
47、员函数 set area 返回该对象的面积。程序最后输出为 8。26.若有以下程序#include iostreamusing 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()cout a “ , “ b end1;private:int a,b;class B : private Apublic:B(int i,int j) :A(i,j) void fun ( )move (3, 5);void f1 ( )A:show();int main ( )B d(3,4);d. fun ( );d.f1();return 0;程序执行后的输出结果是 ( )。(分数:3.00)A.3,4B.6,8C.6,9 D.4,3解析:解析 本题考核派生类的应用。本题中,类 B 是类 A 的私有派生类,在类 B 的成员函数 fun()中调用基类 A 的成员函数 move(),并传入实参 3 和 5。在类 B 的成员函数 f1()中调用基类 A 的成员函数show(),来显示基类数据成员 a 和 b 的值。主函数中,定义了派生类 B