1、国家计算机二级(C+)80 及答案解析(总分:460.00,做题时间:120 分钟)一、选择题(每小题 2分,共 70分) 下列各(总题数:35,分数:70.00)1.以下程序的输出结果是( )。 #includeiostream.h voidreverse(inta,intn) inti,t; for(i=0;in/2;i+) t=ai;ai=an-1-i;an-1-i=t; voidmain( ) int b10:=1,2,3,4,5,6,7,8,9,10;inti,s=0; reverse(b,8); for(i=6;i10;i+)s+=bi; coutS; (分数:2.00)A.(x=
2、y=6,x+y,X+1)B.(x=y=6,x+y,y+1)C.(x=6,x+1,y=6,x+y)D.(y=6,y+1,x+y,x+1)2.下列程序的运行结果为( )。 # include iostreamh int i=0; classA public: A( ) i + + ; ; void main( ) A a,b3,* c; C=b; cout i endl; (分数:2.00)A.2B.3C.4D.53.有如下的运算符重载函数定义:double operator+(int i,int k)return double(i+1);但定义有错误,对这个错误是准确的描述是【 】(分数:2.0
3、0)A.+只能作为成员函数重载,而这里的+是作为非成员函数重载的B.两个 int型参数的和也应该是 int型,而这里将+的返回类型声明为 doubleC.没有将运算符重载函数声明为某个类的友元D.C+已经提供了求两个 int型数据之和的运算符+,不能再定义同样的运算符4.有如下程序 #include 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; F
4、un Fun1 const Fun fun2; return 0; 若程序的输出结果是: 123 则程序中下划线处遗漏的语句是_。(分数:2.00)A.coutname,p-num); printf(“%s %d/n“,p-name,p-num); 程序运行后的输出结果是_。(分数:2.00)A.SunDan 20042B.SunDan 20044C.LiSiGuo 20042D.YangSan 2004121.数据的存储结构是指_。 (分数:2.00)A.存储在外存中的数据B.数据所占的存储空间量C.数据在计算机中的顺序存储方式D.数据的逻辑结构在计算机中的表示22.不能重载的运算符是( )
5、。(分数:2.00)A.一般成员函数的初始化B.类的初始化C.对象的初始化D.删除类创建的对象23.下面程序的功能是把 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=024.关于关键字 class 和 typename,下列表述中正确的是_。(分数:2.00)A.程序中的 type
6、name 都可以替换为 classB.程序中的 class 都可以替换为 typenameC.在模板形参表中只能用 typename 来声明参数的类型D.在模板形参表中只能用 class 或 typename 来声明参数的类型25.下列运算符不能重载为友元函数的是【 】(分数:2.00)A.= ( ) -B.+ - +-C. = funcl(); p-func2(); retum0; 运行程序,屏幕上将显示输出_。 (分数:2.00)A.B1B2B.A1A2C.B1A2D.A1B2二、填空题(每空 2分,共 30分)(总题数:13,分数:390.00)36.对于下面定义的类 MyClass,请
7、在函数 f1中添加对象成员把 n的值修改为 50。 class MyClass public: MyClass(int x)n=x; void SetNum (int nl) n=nl; private: int n; ; int f( ) MyClass * ptr=new MyClass(45);2 (分数:30.00)填空项 1:_37.派生类构造函数的执行顺序是先执行 1 的构造函数,然后执行成员对象的构造 函数,最后执行 2 的构造函数。 (分数:30.00)填空项 1:_38.友元类的所有成员函数都是另一个类的 1。(分数:30.00)填空项 1:_39.执行下列语句后,c3 中的
8、值为 1 int c1=1,c2=2,c3;c3=10/c2 * c1; (分数:30.00)填空项 1:_40.已知程序的结果为 123,请填空。 #includeiostream.h templateclassT classA public: Tx,y,z; voiddisplay( )coutx“y“z; ; voidmain( ) Aintal; 1 2 3 al.display( ); (分数:30.00)填空项 1:_41.以下程序运行后的输出结果是 1。 main2 int a=1,b=2,c=3; if(c=a) printf(“%d/n“,c); else printf(“%
9、d/n“,b); (分数:30.00)填空项 1:_42.如果要把返回值为 void的函数 A声明为类 B的友元函数,则应在类 B的定义中加入的语句是 1。(分数:30.00)填空项 1:_43.请将如下程序补充完整,使得输出结果为:bbaa #include using namespace std; class A public: 1coutname,p-num); printf(“%s %d/n“,p-name,p-num); 程序运行后的输出结果是_。(分数:2.00)A.SunDan 20042 B.SunDan 20044C.LiSiGuo 20042D.YangSan 20041解
10、析:本题主函数中定义了结构体类型的指针变量 p,并使其指向了结构体类型的数组 s1,并通过调用函数 f 改变了指针变量 p 所指向的结构体中成员变量 name 的值,但并未改变其 num 的值。这是因为函数 f 中的形参 name 是一个字符型指针变量,它指向了主函数中指针变量 p 所指向的结构体的成员变量 name, 所以对函数 f 中的形参*name 的改变也就是对主函数中 p-name 的改变,而函数 f 中对形参 num 的改变并 不会影响主函数中 p-num 的值,因为此时传递给 num 的是一个值,而不是地址。21.数据的存储结构是指_。 (分数:2.00)A.存储在外存中的数据B
11、.数据所占的存储空间量C.数据在计算机中的顺序存储方式D.数据的逻辑结构在计算机中的表示 解析:数据的逻辑结构在计算机存储空间中的存放形式形式称为数据的存储结构(也称数据的物理结构)。22.不能重载的运算符是( )。(分数:2.00)A.一般成员函数的初始化B.类的初始化C.对象的初始化D.删除类创建的对象 解析:此题主要考查方法重载,方法的重载是指多个方法可以享有相同 的名字,但参数的数量或类型必须不相同(采用不同的形式参数列表)。选项 B)不符合方法重载的要求。23.下面程序的功能是把 316表示为两个加数的和,使两个加数分别能被 13和 11整除,在划线处应填入的是( )。 #inclu
12、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语句解决同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但
13、当 while后面的“表达式”一开始就为“假”时,两种循环的结果不同。这是因为此时 while循环的循环不被执行,而 do-while循环的循环体被执行一次。本题的关键是两个加数分别能被 13 和 11整除,在 i=0时,直接将 316赋值给 k,当 k%11的值为 0时,则不必执行循环,将执行j=k/11语句,输出结果,所以该表达式合理的条件是 k5%11。 24.关于关键字 class 和 typename,下列表述中正确的是_。(分数:2.00)A.程序中的 typename 都可以替换为 classB.程序中的 class 都可以替换为 typenameC.在模板形参表中只能用 typ
14、ename 来声明参数的类型D.在模板形参表中只能用 class 或 typename 来声明参数的类型解析:25.下列运算符不能重载为友元函数的是【 】(分数:2.00)A.= ( ) - B.+ - +-C. = ,赋值运算符,( )和 是不能够重载为友元函数的运算符。对双目运算符,友元函数有两个参数;对单目运算符,友元函数有一个参数。26.有以下程序: #define f(x) (x*x) main() int i1,i2; i1=f(8)/f(4); i2=f(4+4)/f(2+2); printf(“%d,%d/n“,i1,i2); 程序运行后的输出结果是_。 (分数:2.00)A.
15、64,28B.4,4C.4,3 D.64,64解析:对带参数的宏的展开只是将语句中宏名后面括号内的实参字符串代替#define 命令行中的形参。本题 中“i1=f(8)/f(4)”用“#define f(x) (x*x)”代替得 i1=(8*8)/(4*4),结果为 4;“i2=f(4+4)/f(2+2)”用“#define f(x) (x*x)”代替得 i2= (4+4*4+4)/(2+2*2+2),求得结果为 3。故本题输出的值为 4,3。27.设变量 a是 int型,f 是 double型,i 是 float型,则表达式 10 + a + i * f 值的数据类型是( )。(分数:2.0
16、0)A.intB.floatC.double D.不确定解析:根据混合运算规则,如果有一个数据是 double型,则其他数据类型先转化为 double型,运算的结果最终也是 double型。为保证精度的不丢失,表达式的数据类型是变量和常量中精确度最高的变量类型。28.执行语句 for(i=1;i+ 4;);,后变量 i的值是(分数:2.00)A.SELECT姓名 FROM车间; WHERE 工资3000 AND 车间=“W1“OR 车间=“W2“B.SELECT姓名 FROM车间; WHERE 工资3000 AND(车间=“W1“OR 车间=“W2“)C.SELECT姓名 FROM车间; WH
17、ERE 工资3000 OR 车间=“W1“OR 车间=“W2“D.SELECT姓名 FROM车间; WHERE 工资3000 AND(车间=“W1“OR 车间=“W2“) 解析:List 组件的该构造方法的第一个参数的意思是它的初始显式行 数,如果该值为 0则显示 4行,第二个参数是指定该组件是否可以多选,如果值为 true则 是可以多选,false 是不可多选,如果不指定则缺省是不能多选。29.this指针是 C+语言实现什么的一种机制?(分数:2.00)A.抽象B.封装 C.继承D.重载解析:this 指针是 C+语言实现封装的一种机制,它将对象和该对象调用的成员函数连接在一起,在外部看来
18、,每一个对象都拥有自己的函数成员。30.对于模板定义关键字 class和 typename说法不正确的是( )。(分数:2.00)A.每次调用此过程,该过程中的局部变量都会被重新初始化B.在本过程中使用到的,在其他过程中定义的变量也为 Statci型C.每次调用此过程时,该过程中的局部变量的值保持在上一次调用后的值 D.定义了该过程中定义的局部变量为“自动“变量解析:Style 属性用来决定控件类型及列表框部分行为,其值取 0,1,2。 0-Dropdown Combo Box:此时组合框称为“下拉式组合框”,看上去像一个下拉列表框,但是可以输入文本或从下拉列表框中选择表项。 1-Simple
19、 Combo Box:此时组合框称为“简单组合框”,它由一个文本编辑区和一个标准列表框组成。 2-Dropdown List Box:此时组合框称为“下拉式列表框”,它的外观和下拉式组合框一样,右端也有一个箭头,可供“拉下”或“收起”列表框,可以从下拉列表框选择表项,也可以键入表项的文本作选择,但不接收其他文本输入。 31.下列程序的运行结果是( )。 #includeiostreamh void fun(int *a,iht *B) int *k; k=a;a=b;b=k; void main( ) inta=3,b=6,*x= static int number; public: poin
20、t()number+;) Point()number-;) ; int Point;number=0; void main() Point *ptr; Point A,B; Point *ptr_point=new Point3; ptr=ptr_point Point C; coutfuncl(); p-func2(); retum0; 运行程序,屏幕上将显示输出_。 (分数:2.00)A.B1B2B.A1A2C.B1A2D.A1B2解析:二、填空题(每空 2分,共 30分)(总题数:13,分数:390.00)36.对于下面定义的类 MyClass,请在函数 f1中添加对象成员把 n的值修改
21、为 50。 class MyClass public: MyClass(int x)n=x; void SetNum (int nl) n=nl; private: int n; ; int f( ) MyClass * ptr=new MyClass(45);2 (分数:30.00)填空项 1:_ (正确答案:ptr-SetNum(50);)解析:本题考查的是考生使用对象指针调用成员函数的能力,指针调用成员函数应该使用符号“-”。37.派生类构造函数的执行顺序是先执行 1 的构造函数,然后执行成员对象的构造 函数,最后执行 2 的构造函数。 (分数:30.00)填空项 1:_ (正确答案:基
22、类)解析:本题主要考查的是派生类构造函数的执行顺序,在 C+语言中构造函数的执行顺序是先基类后派生类,而析构函数的执行顺序正好相反,是先调用派生类后调用基类。 38.友元类的所有成员函数都是另一个类的 1。(分数:30.00)填空项 1:_ (正确答案:友元函数)解析:C+语言中友元类中的函数都是另一个类的友元函数。39.执行下列语句后,c3 中的值为 1 int c1=1,c2=2,c3;c3=10/c2 * c1; (分数:30.00)填空项 1:_ (正确答案:0)解析:在赋值运算中,如果表达式中变量和常量的数据类型不一致就会自动进行类型转换。系统会计算10/c2,由于 10 是实型,所
23、以均先转化为双精度型 0500000,再与 c1 转化后的双精度数相乘得0500000。但其要赋值给整型变量 c3,故要进行强制转换,得 c3的值为 0。 40.已知程序的结果为 123,请填空。 #includeiostream.h templateclassT classA public: Tx,y,z; voiddisplay( )coutx“y“z; ; voidmain( ) Aintal; 1 2 3 al.display( ); (分数:30.00)填空项 1:_ (正确答案:a1.x=1;)解析:通过程序的结果知道数据类型是 int,所以调用时声明模板实参为 int的,再对 x
24、,y,z 进行赋值。41.以下程序运行后的输出结果是 1。 main2 int a=1,b=2,c=3; if(c=a) printf(“%d/n“,c); else printf(“%d/n“,b); (分数:30.00)填空项 1:_ (正确答案:1)解析:此题需特别注意的是 if 的判断条件是“c=a”,而不是“c=a”,由于 a=1,故条件 c=1 为真,所以 输出的 c 的值为 1。42.如果要把返回值为 void的函数 A声明为类 B的友元函数,则应在类 B的定义中加入的语句是 1。(分数:30.00)填空项 1:_ (正确答案:friend void A-|_|-;)解析:C+中
25、类的友元函数在声明时应在该函数前面加上关键字 friend,同样如果要声明一个类为另一个类的友元类也要在前面类名前加上 friend。 43.请将如下程序补充完整,使得输出结果为:bbaa #include using namespace std; class A public: 1cout2cout3 B *p=new B delete P, return 0; (分数:30.00)填空项 1:_ (正确答案:-A-|_|-)解析:44.C+语句 const char * const p= “hello“;,所定义的指针 p和它所指的内容都不能被 1。(分数:30.00)填空项 1:_ (正
26、确答案:改变)解析:本题考查的是定义常量的关键字 const,由 sonst定义的变量的值不可以再改变,所以定义时必须进行初始化。45.继承的方式有公有继承、私有继承和 13 种。(分数:30.00)填空项 1:_ (正确答案:保护继承)解析:继承性是面向对象程序设计中最重要的机制,用户可以根据不同的需要选择 3种不同的继承方式。46.软件生命周期可分为多个阶段,一般分为定义阶段、开发阶段和维护阶段。编码和测试属于 1 阶段。 (分数:30.00)填空项 1:_ (正确答案:开发)解析:软件开发阶段可分为:概要设计、详细设计、软件测试,而编码属于详细设计阶段的主要任务。 47.coutput(A);,还可以表示为 1。(分数:30.00)填空项 1:_ (正确答案:coutA;)解析:本题考查的是 C+语言的流输出操作。cout 是 c+语言定义好的输出流对 象,其中包括成员函数put(char c),其功能是输出一个字符到屏幕,实际上 C+语言中 已经重载了操作符“ ”作为流输出操作符。48.静态成员函数可以直接访问类的 1 成员,不能直接访问类的 2 成员。(分数:30.00)填空项 1:_ (正确答案:静态)解析:静态成员函数可以直接访问该类中的静态数据成员,而不能访问该类中的非静态数据成员。