1、国家计算机二级(C+)88 及答案解析(总分:460.00,做题时间:120 分钟)一、选择题(每小题 2分,共 70分) 下列各(总题数:35,分数:70.00)1.以下类定义中可能会引起错误的语句是( )。 class A public: A( ) /1 int i; /2 private: int j; /3 A(int i) i+; /4 ; (分数:2.00)A.1B.2C.3D.42.下列运算符中,不能被重载的是(分数:2.00)A. for(i=0;iA.45B.50C.60D.556.在重载一个运算符时,如果其参数表中有一个参数,则说明该运算符是( )。(分数:2.00)A.一
2、元成员运算符B.二元成员运算符C.一元友元运算符D.选项 B)和选项 C)都可能7.下列选项中不全是 C+语言关键字的是( )。(分数:2.00)A.const,break,defaultB.long,void,usingC.virtual,extern,includeD.try,throw,this8.下列运算符中全都可以被友元函数重载的是( )。(分数:2.00)A.=,+,-,/B.,+,(),newC.-,+,*,D.B.+ - + -C. = data;中,cin 是(分数:2.00)A.C+的关键字B.类名C.对象名D.函数名23.下列语句中不是死循环的是( )。(分数:2.00)
3、A.报表页眉B.页面页眉C.组页眉D.以上说法都不对24.下面程序的功能是把 316表示为两个加数的和,使两个加数分别能被 13和 11整除,在划线处应填入的是( )。 #includeiostream.h voidmain( ) inti=0,j,k; doi+;k=316-13*i;while(_); j=k/11; cout“316=13*“i“+11*“j; (分数:2.00)A.k/1lB.k%11C.k/11=0D.k%11=025.为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定义为 ( )。(分数:2.00)A.publicB.protected
4、C.privateD.static26.有以下程序 main() int i,s=0,t=1,2,3,4,5,6,7,8,9; for(i=0;iA.45B.20C.25D.3627.在一个类体的下列声明中,正确的纯虚函数声明是【 】(分数:2.00)A.virtual void vf()0;B.void vf(int)0;C.virtual int vf(int);D.virtual void vf(int) 28.有以下程序: #include main() FILE *fp; int i,k,n; fp=fopen(“data.dat“,“w+“); for(i=1;iA.0 0B.12
5、3 45C.1 4D.1 229.设有数组定义:chararray:“China“;,则数组 array所占的空间为( )。(分数:2.00)A.循环执行 10次B.无限循环C.循环体语句一次也不执行D.循环体浯句执行一次30.若有说明 int a34;,则 a数组元素的非法引用是( )。(分数:2.00)A.a02*1B.a13C.a4-20D.a0431.下列叙述中正确的是_。 (分数:2.00)A.软件测试应该由程序开发者来完成B.程序经调试后一般不需要再测试C.软件维护只包括对程序代码的维护D.以上三种说法都不对32.派生类继承基类的方式有( )。(分数:2.00)A.publicB.
6、privateC.protectedD.以上都对33.在一个派生类对象结束其生命周期时(分数:2.00)A.先调用派生类的析构函数后调用基类的析构函数B.先调用基类的析构函数后调用派生类的析构函数C.如果基数没有定义析构函数,则只调用派生类的析构函数D.如果派生类没有定义析构函数,则只调用基类的析构函数34.设有定义 int x;float y;,则 10+x+y值的数据类型是( )。(分数:2.00)A.intB.doubleC.floatD.不确定35.下面关于模板的描述,错误的是( )。 (分数:2.00)A.层次模型B.关系模型C.网状模型D.以上皆非二、填空题(每空 2分,共 30分
7、)(总题数:13,分数:390.00)36.在结构化分析使用的数据流图(DFD)中,利用 1 对其中的图形元素进行确切解释。(分数:30.00)填空项 1:_37.类模板不同于函数模板,类模板只可用 1 型参数。(分数:30.00)填空项 1:_38.类 test的析构函数是 1。(分数:30.00)填空项 1:_39.在面向对象的程序设计中,将数据和处理数据的操作封装成一个整体就定义了一种事物的类型,称作“类”。类是一种抽象的概念,属于该类的一个实例叫做“ 1”。 (分数:30.00)填空项 1:_40.以下程序运行后的输出结果是 1。 main2 char c; int n=100; fl
8、oat f=10; double x; x=f*=n/=(c=50); printf(“%d %f/n“,n,x); (分数:30.00)填空项 1:_填空项 1:_41.下列程序的输出结果是 1 #include using namespace std; class A int a public: A2:a(9) virtual void print3 const coutprint10; show(d1); show(d2); return 0; (分数:30.00)42.下面程序的输出结果是 1。 #includeiostream.h void main2 int a6=1,2,3,4,
9、5,6; for(int i=0;i填空项 1:_43.软件生命周期可分为多个阶段,一般分为定义阶段、开发阶段和维护阶段。编码和测试属于 1 阶段。 (分数:30.00)填空项 1:_44.如果要把返回值为 void的函数 A声明为类 B的友元函数,则应在类 B的定义中加入的语句是 1。(分数:30.00)填空项 1:_45.以下程序运行后的输出结果是 1 。 fun(int a) int b=0; static int c=3; b+;c+; return(a+b+c); main2 int i,a=5; for(i=0;i填空项 1:_46.已有定义 double *p;,请写出完整的语句
10、,利用 malloc函数使 p指向一个双精度型 的动态存储单元 1。(分数:30.00)填空项 1:_47.语句 cout /n还可表示为 1。(分数:30.00)填空项 1:_48.执行下列语句后,c3 中的值为 1 int c1=1,c2=2,c3;c3=10/c2 * c1; (分数:30.00)填空项 1:_国家计算机二级(C+)88 答案解析(总分:460.00,做题时间:120 分钟)一、选择题(每小题 2分,共 70分) 下列各(总题数:35,分数:70.00)1.以下类定义中可能会引起错误的语句是( )。 class A public: A( ) /1 int i; /2 pr
11、ivate: int j; /3 A(int i) i+; /4 ; (分数:2.00)A.1B.2C.3D.4 解析:本题考查关于 C+语言类的定义方法。在 c+语言中类定义中的构造函数是私有的,但是其却调用了其中的公有变量,在实例化时会出现错误。2.下列运算符中,不能被重载的是(分数:2.00)A. for(i=0;iA.45B.50C.60 D.55解析:此题考核的知识点是函数调用及静态变量的应用,静态变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值,以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。调 用 fun()函数执行 for循环语句,fun(a,5
12、),i=0、1、2、3、4 ,sum=0+a0+a1+a2+a3+a4=15;接下来执行 fun(a,5) ,因 为 sum 定 义为 静态变 量, 即再次 调用 时 sum 保 留上 次函数 调用 结束时 的值 ,所以 sum=15+a0+a1+a2 +a3=45;返回 sum的值,主函数 s=15+45=60。6.在重载一个运算符时,如果其参数表中有一个参数,则说明该运算符是( )。(分数:2.00)A.一元成员运算符B.二元成员运算符C.一元友元运算符D.选项 B)和选项 C)都可能 解析:C+语言中用成员函数重载时,重载一目运算符没有参数,重载二目运算符要有一个参数。 7.下列选项中不
13、全是 C+语言关键字的是( )。(分数:2.00)A.const,break,defaultB.long,void,usingC.virtual,extern,include D.try,throw,this解析:本题考查 C+语言的关键字。要熟练掌握 C+语言中的关键字。注意:include 不是 C+语言的关键字。8.下列运算符中全都可以被友元函数重载的是( )。(分数:2.00)A.=,+,-,/B.,+,(),newC.-,+,*,D.,只能用友元函数重载的是。9.下列关于多态性的描述,错误的是( )。(分数:2.00)A.C+语言中的多态性分为编译时的多态性和运行时的多态性B.编译时
14、的多态性可通过函数重载实现C.运行时的多态性可通过模板和虚函数实现 D.实现运行时多态性的机制称为动态绑定解析:编译时的多态性是通过函数重载和模板体现的,运行时的多态性是通过虚函数体现的。10.下列字符串中可以用作 C+语言标识符的是( )。(分数:2.00)A.1234 B.foo barC.virtualD.34var解析:C+语言标识符只能由数字,字母和下划线组成,并且只能以字母和下划线为开头。11.若有以下说明和定义 union dt int a;char b;double c;data; 以下叙述中错误的是_。 (分数:2.00)A.data 的每个成员起始地址都相同B.变量 dat
15、a 所占的内存字节数与成员 c 所占字节数相等C.程序段 data.a=5;printf(“%f/n“,data.;输出结果为 5.000000 D.data 可以作为函数的实参解析: union 是表示共用体的关键字,成员 a,b,c 共占用同一个内存空间, data 的每个成员起始地址都相 同;共用体变量所占的内存长度等于最长的成员的长度,故变量 data 所占的内存字节数与成员 c 所占字节 数相等;执行“data.a=5;printf(“%f/n“,data.c);” printf 函数只是将内存中的数据以不同的类型输出,而不能将 内存中的整型数据自动转换为等值的浮点数,故 C 是错误
16、的。12.下列运算不能重载为友元函数的是_。(分数:2.00)A.= ( ) -B.+ - + -C. = data;中,cin 是(分数:2.00)A.C+的关键字B.类名C.对象名 D.函数名解析:在语句 cindata;中,cin 为对象名。23.下列语句中不是死循环的是( )。(分数:2.00)A.报表页眉B.页面页眉 C.组页眉D.以上说法都不对解析:SelStart 返回用户在文本框中所选文本的起始点或插入位置,属性的有效值在 0和文本框中总字符数之间。24.下面程序的功能是把 316表示为两个加数的和,使两个加数分别能被 13和 11整除,在划线处应填入的是( )。 #inclu
17、deiostream.h voidmain( ) inti=0,j,k; doi+;k=316-13*i;while(_); j=k/11; cout“316=13*“i“+11*“j; (分数:2.00)A.k/1lB.k%11 C.k/11=0D.k%11=0解析:do-while 语句的一般形式是: do 语句 while(表达式); 特点是:“直到型”循环结构。先执行一次“语句”,判“表达式”,当“表达式”为非 0,再执行“语句”,直到“表达式”的值为 0时停止执行语句。在一般情况下,用 while和 do-while语句解决同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但
18、当 while后面的“表达式”一开始就为“假”时,两种循环的结果不同。这是因为此时 while循环的循环不被执行,而 do-while循环的循环体被执行一次。本题的关键是两个加数分别能被 13 和 11整除,在 i=0时,直接将 316赋值给 k,当 k%11的值为 0时,则不必执行循环,将执行j=k/11语句,输出结果,所以该表达式合理的条件是 k5%11。 25.为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定义为 ( )。(分数:2.00)A.public B.protectedC.privateD.static解析:本题考查点为类成员的访问权限,publ
19、ic 关键字修饰的类成员可 以被类的对象通过成员操作符“”直接访问,protected 和 private则不能,而 static不能单 独修饰类的成员。26.有以下程序 main() int i,s=0,t=1,2,3,4,5,6,7,8,9; for(i=0;iA.45B.20C.25 D.36解析:此题考核的是指针与数组间的应用,数组可以通过指针实现对数组元素的操作,*(t+i)相当于 ti。执行 for()循环语句,i 分别为 0、2、4、6、8,有数组可知 t0=1;t2=3;t4=5;t6=7;t8=9 进行求和 运算结果为 25。27.在一个类体的下列声明中,正确的纯虚函数声明是
20、【 】(分数:2.00)A.virtual void vf()0; B.void vf(int)0;C.virtual int vf(int);D.virtual void vf(int) 解析:本题考核纯虚函数的声明。声明纯虚函数的一般格式为:virtual类型函数名(参数表)0;28.有以下程序: #include main() FILE *fp; int i,k,n; fp=fopen(“data.dat“,“w+“); for(i=1;iA.0 0B.123 45C.1 4D.1 2 解析:语句“fprintf(fp,“%d “,i);”的作用是将变量 i 的值按“%d”的格式输出到
21、fp 指向的文件上;“rewind(fp)” 的作用是使指针重新返回文件的开头;“fscanf(fp,“%d%d“, int n=100; float f=10; double x; x=f*=n/=(c=50); printf(“%d %f/n“,n,x); (分数:30.00)填空项 1:_ (正确答案:2)填空项 1:_ (正确答案:20.000000)解析:由于赋值运算符按照“自右而左”的结合顺序,故本题中赋值表达式“x=f*=n/=(c=50)”的求解步骤如下:首先,进行“n/=(c=50)”的运算,相当于 n=n/c=100/50=2;其次,进行“f*=n”的运算,相当于“f=f*
22、n”,故 f=20.000000;最后,得出 x 的值为 20.000000。41.下列程序的输出结果是 1 #include using namespace std; class A int a public: A2:a(9) virtual void print3 const coutprint10; show(d1); show(d2); return 0; (分数:30.00)解析:42.下面程序的输出结果是 1。 #includeiostream.h void main2 int a6=1,2,3,4,5,6; for(int i=0;i填空项 1:_ (正确答案:1 2 3 4 5
23、)解析:本题考查的是考生使用简单循环输出数组元素的能力,因为结束条件是 i43.软件生命周期可分为多个阶段,一般分为定义阶段、开发阶段和维护阶段。编码和测试属于 1 阶段。 (分数:30.00)填空项 1:_ (正确答案:开发)解析:软件开发阶段可分为:概要设计、详细设计、软件测试,而编码属于详细设计阶段的主要任务。 44.如果要把返回值为 void的函数 A声明为类 B的友元函数,则应在类 B的定义中加入的语句是 1。(分数:30.00)填空项 1:_ (正确答案:friend void A-|_|-;)解析:C+中类的友元函数在声明时应在该函数前面加上关键字 friend,同样如果要声明一
24、个类为另一个类的友元类也要在前面类名前加上 friend。 45.以下程序运行后的输出结果是 1 。 fun(int a) int b=0; static int c=3; b+;c+; return(a+b+c); main2 int i,a=5; for(i=0;i填空项 1:_ (正确答案:10111212)解析:静态局部变量是在编译时赋初值的,在程序运行时它已有初值。46.已有定义 double *p;,请写出完整的语句,利用 malloc函数使 p指向一个双精度型 的动态存储单元 1。(分数:30.00)填空项 1:_ (正确答案:p=(double *)malloc(sizeof(
25、double))解析:malloc 函数的作用是在内存开辟指定大小的存储空间,并将此存储空间的地址作为函数值带回,它 的原型为 void * malloc(unsigned int size) ,函数值为指针,这个指针是指向 void 类型,如果要将此返回地 址赋给一个指向特定类型的指指针变量,则应进行强制类型转换,如本题答案中是用强制类型转换的方法 使指针 p 的基类型改变为 double 类型。47.语句 cout /n还可表示为 1。(分数:30.00)填空项 1:_ (正确答案:cout end1;)解析:“/n”表示换行,end1 也可表示换行。end1 和“/n”可以通用。48.执行下列语句后,c3 中的值为 1 int c1=1,c2=2,c3;c3=10/c2 * c1; (分数:30.00)填空项 1:_ (正确答案:0)解析:在赋值运算中,如果表达式中变量和常量的数据类型不一致就会自动进行类型转换。系统会计算10/c2,由于 10 是实型,所以均先转化为双精度型 0500000,再与 c1 转化后的双精度数相乘得0500000。但其要赋值给整型变量 c3,故要进行强制转换,得 c3的值为 0。