1、国家计算机二级(C+)70 及答案解析(总分:460.00,做题时间:120 分钟)一、选择题(每小题 2分,共 70分) 下列各(总题数:35,分数:70.00)1.下列不是描述类的成员函数的是( )。(分数:2.00)A.构造函数B.析构函数C.友元函数D.拷贝构造函数2.C+语言函数中不能由系统自动生成的是( )。(分数:2.00)A.析构函数B.构造函数C.内联函数D.拷贝构造函数3.不能作为重载函数的调用的依据是( )。(分数:2.00)A.参数个数B.参数类型C.函数类型D.函数名称4.C+语言对 C语言做了很多改进,C+语言相对于 C语言的最根本的变化是( )。(分数:2.00)
2、A.增加了一些新的运算符B.允许函数重载,并允许设置缺省参数C.规定函数说明符必须用原型D.引进了类和对象的概念5.有如下头文件: int fl(); static int f2(); class MA public: int f3(); static int f4();在所描述的函数中,具有隐含的 this指针的是(分数:2.00)A.f1B.f2C.f3D.f46.以下关键字不能用来声明类的访问权限的是_。(分数:2.00)A.publicB.staticC.protectedD.private7.在 ER图中,用来表示实体之间联系的图形是(分数:2.00)A.矩形B.椭圆形C.菱形D.平
3、行四边形8.为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定义为 ( )。(分数:2.00)A.publicB.protectedC.privateD.static9.下列程序段的输出结果是( )。 #includeiostreamh void fun(int * X,int * y) cout * X * y; * X=3; * y=4; void main( ) int x=1,y=2; fun( t=*x;*x=*y;*y=t; main() char *s1=“abc“,*s2=“123“; swap(s1,s2); printf(“%s,%s/n“,s
4、1,s2); 程序执行后的输出结果是_。 (分数:2.00)A.123,abcB.abc,123C.1bc,a23D.321,cba18.要想使 2378965421 的输出为 237887 应用的语句是( )。(分数:2.00)A.cout 2378965421;B.cout fixed 2378965421:C.cout 2378965421 -0001:D.cout fixed 2378965421 -0001;19.有以下程序 void fun1(char *p) char *q; q=p; while(*q!= /0) (*q)+;q+; main() char a=“Program
5、 “,*p; p=fun1(p); printf(“%s/n“,a); 程序执行后的输出结果是_。 (分数:2.00)A.ProhsbnB.PrphsbnC.ProgsbnD.Program20.有以下程序段: typedef struct NODE int num; struct NODE *next; OLD; 以下叙述中正确的是_。 (分数:2.00)A.以上的说明形式非法B.NODE 是一个结构体类型C.OLD 是一个结构体类型D.OLD 是一个结构体变量21.有以下程序 int f1(int x,int y)return xy?x:y; int f2(int x,int y)retu
6、rn xy?y:x; main() int a=4,b=3,c=5,d=2,e,f,g; e=f2(f1(a,b),f1(c,d); f=f1(f2(a,b),f2(c,d); g=a+b+c+d-e-f; printf(“%d,%d,%d/n“,e,f,g); 程序运行后的输出结果是_。 (分数:2.00)A.4,3,7B.3,4,7C.5,2,7D.2,5,722.以下程序的输出结果是( )。 #includeiostreamh longfun(intn) longs; if(n=1|n=2)s=2; elses:n-fun(n-1); returns; voidmain( ) coutf
7、un(3); (分数:2.00)A.1B.2C.3D.423.数字字符 0 的 ASCII 值为 48,若有以下程序 main() char a=1,b=2 ; printf(“%c,“,b+); printf(“%d/n“,b-a); 程序运行后的输出结果是_。 (分数:2.00)A.3,2B.50,2C.2,2D.2,5024.如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是( )。(分数:2.00)A.一元运算符B.二元运算符C.选项 A)和选项 B)都可能D.重载错误25.在一个派生类对象结束其生命周期时(分数:2.00)A.先调用派生类的析构函数后调用基类的析构函
8、数B.先调用基类的析构函数后调用派生类的析构函数C.如果基数没有定义析构函数,则只调用派生类的析构函数D.如果派生类没有定义析构函数,则只调用基类的析构函数26.有如下定义: int a51,3,5,7,9, * p=a;下列表达式中不能得到数值 5的是(分数:2.00)A.a2B.a3C.*(p+2)D.*p+427.下面程序的执行结果是( )。 #include“ iostreamh“ void main( ) int * p,r; p=new in; * p=20; r=sizeof(* p); cout r end1; delete p; (分数:2.00)A.程序错误B.内存为 20
9、地址的大小C.20D.428.函数 fun的返回值是( )。 fun(char*a,char*b) intnum=0,n=0; while(*(a+num)!=/0)num+; while(bn)*(a+num)=bn;num+;n+; returnnum; (分数:2.00)A.j=i;B.j=(long)i;C.i=(int)j;D.i=j;29.下面关于 C+语言的描述错误的是( )。 (分数:2.00)A.0B.15C.25D.3030.设 int a=10,b= 11,c=12;,表达式( a + b) c b= =c 的值是( )。(分数:2.00)A.2B.0C.-2D.131.
10、建立派生类对象时,3 种构造函数分别是 a(基类的构造函数)、b(成员对象的构造函数)、c(派生类的构造函数)这 3种构造函数的调用顺序为( )。(分数:2.00)A.abcB.acbC.cabD.cba32.C+中运算符优先级由高到低排列正确的是( )。(分数:2.00)A.:+ + | |B. * | | ,C.sizeof % + :D., void main( ) int a=10,b=20; couta“ “b; swap( int i; for(i=0;i填空项 1:_38.请在如下程序中的空格处填写正确的语句: #include using namespace std; clas
11、s Base public: void fun1coutnext=b;D.(*p).next=q;解析:要把结点 b连接到结点 a之后,必须把 b的地址给 a的 next指针,选项 A)中,指针变量 q保存的就是变量 b的地址,选项 B)中的 p是指针变量,应该是 p-next=b;在选项 D)中,用*运算符取出结构体变量,并且保存的就是 b的地址,所以正确。 13.关于关键字 class和 typename,下列表述中正确的是【 】(分数:2.00)A.程序中的 typename都可以替换为 class B.程序中的 class都可以替换为 typenameC.在模板形参表中只能用 type
12、name来声明参数的类型D.在模板形参表中只能用 class或 typename来声明参数的类型解析:声明一个函数模板的格式是:template 模板形参表声明 * ,:,?: B.+,-,new,delete,=C.sizeof,new,delete,+,-D.sizeof,new,delete,+,-解析:本题考查 C+浯言中不能够重载的操作符。C+语言中的不能重载的操作符是.,. * ,- * ,:和?:。 15.下列程序是用来判断数组中特定元素的位置所在,则输出结果为( )。 #includeconioh #includeiostreamh int fun(in *s,int t,in
13、t *k) int i; * k=0; for(i=0;i t;i+) if(s *k si) *k=i; return S *k; void main( ) int a10= 876,675,896,101,301,401,980,431,451,777 ,k; fun(a,10, t=*x;*x=*y;*y=t; main() char *s1=“abc“,*s2=“123“; swap(s1,s2); printf(“%s,%s/n“,s1,s2); 程序执行后的输出结果是_。 (分数:2.00)A.123,abcB.abc,123C.1bc,a23 D.321,cba解析:此题考核的知
14、识点是指针变量值的交换。C 语言中,字符串常量在内存中是以字符数组的形式进行 存放的,因此字符指针 x 和 y 指向的是各字符串的首地址,也就是字符串第一个字符的地址,则*x 与*y 交 换的是字符串的第一个字符,即字符“a”与“1”的交换,而字符串中其它字符保持不变,所以答案选 C。18.要想使 2378965421 的输出为 237887 应用的语句是( )。(分数:2.00)A.cout 2378965421;B.cout fixed 2378965421:C.cout 2378965421 -0001: D.cout fixed 2378965421 -0001;解析:C+语言中默认小
15、数的输出位一共是 6位,fixed 的意义是在小数点后保留 6位。19.有以下程序 void fun1(char *p) char *q; q=p; while(*q!= /0) (*q)+;q+; main() char a=“Program “,*p; p=fun1(p); printf(“%s/n“,a); 程序执行后的输出结果是_。 (分数:2.00)A.Prohsbn B.PrphsbnC.ProgsbnD.Program解析:此题考核的知识点是指向数组的指针作为函数的参数及指针的运算,如果形参数组中的元素发生变 化,实参也将发生相应变化。指针 p 指向数组的第三位地址(即字符“g”
16、的地址),q=p 也就相当于指针 q 指向数组的第三位地址。表达式(*q)+,首先根据()的优先级得到 a3的值“g”,再进行加 1 运算,所以 g 也就变成了 h;表达式 q+是将地址加 1,也就是指向下一个地址 a4。然后再执行 while()语句,直到遇 到/0结束循环,返回形参。20.有以下程序段: typedef struct NODE int num; struct NODE *next; OLD; 以下叙述中正确的是_。 (分数:2.00)A.以上的说明形式非法B.NODE 是一个结构体类型C.OLD 是一个结构体类型 D.OLD 是一个结构体变量解析:typedef 关键字用于
17、声明一个新的类型名代替已有的类型名。本题中如果没有用 typedef 进行定义的 话,则 struct NODE 为结构体类型,现在用 typedef 定义后,相当于用 OLD 代表了 struct NODE 这一结构体 类型,故 OLD 为结构体类型。21.有以下程序 int f1(int x,int y)return xy?x:y; int f2(int x,int y)return xy?y:x; main() int a=4,b=3,c=5,d=2,e,f,g; e=f2(f1(a,b),f1(c,d); f=f1(f2(a,b),f2(c,d); g=a+b+c+d-e-f; pri
18、ntf(“%d,%d,%d/n“,e,f,g); 程序运行后的输出结果是_。 (分数:2.00)A.4,3,7 B.3,4,7C.5,2,7D.2,5,7解析: 函数 f1 的功能是返回两个数中比较大的值,f2 的功能是返回两个数中比较小的值。22.以下程序的输出结果是( )。 #includeiostreamh longfun(intn) longs; if(n=1|n=2)s=2; elses:n-fun(n-1); returns; voidmain( ) coutfun(3); (分数:2.00)A.1 B.2C.3D.4解析:题中 fun函数进行了递归调用,第 1次调用:fun(3)
19、n=3 s=3-fun(2),第二次调用时:fun(2)n=2 s=2,返回第一次调用后,s=3-2=1。23.数字字符 0 的 ASCII 值为 48,若有以下程序 main() char a=1,b=2 ; printf(“%c,“,b+); printf(“%d/n“,b-a); 程序运行后的输出结果是_。 (分数:2.00)A.3,2B.50,2C.2,2 D.2,50解析:执行语句“printf(“%c,“,b+);”后, b 的值变成字符 3,执行“printf(“%d/n“,b-a);”,即3-1。24.如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是( )。
20、(分数:2.00)A.一元运算符B.二元运算符C.选项 A)和选项 B)都可能D.重载错误 解析:C+中用友元函数重载运算符至少有一个参数,重载一目运算符要有一个参数,重载二目运算符要有两个参数。25.在一个派生类对象结束其生命周期时(分数:2.00)A.先调用派生类的析构函数后调用基类的析构函数B.先调用基类的析构函数后调用派生类的析构函数C.如果基数没有定义析构函数,则只调用派生类的析构函数D.如果派生类没有定义析构函数,则只调用基类的析构函数解析:26.有如下定义: int a51,3,5,7,9, * p=a;下列表达式中不能得到数值 5的是(分数:2.00)A.a2B.a3 C.*(
21、p+2)D.*p+4解析:27.下面程序的执行结果是( )。 #include“ iostreamh“ void main( ) int * p,r; p=new in; * p=20; r=sizeof(* p); cout r end1; delete p; (分数:2.00)A.程序错误B.内存为 20地址的大小C.20D.4 解析:本题考查指针和运算符 sizeof的运用。理解 sizeof的用法,它可以运算出各种数据类型所占内存空间的多少。注意:选项 C)中是指针 p所指向的内存地址中内容是 20。28.函数 fun的返回值是( )。 fun(char*a,char*b) intnu
22、m=0,n=0; while(*(a+num)!=/0)num+; while(bn)*(a+num)=bn;num+;n+; returnnum; (分数:2.00)A.j=i;B.j=(long)i;C.i=(int)j;D.i=j; 解析:+,-运算符不能用于常量表达式。29.下面关于 C+语言的描述错误的是( )。 (分数:2.00)A.0B.15C.25 D.30解析:macro2 中的 Close关闭的是教师工资窗体,一次只能关闭一个窗体。30.设 int a=10,b= 11,c=12;,表达式( a + b) c b= =c 的值是( )。(分数:2.00)A.2B.0 C.-
23、2D.1解析:本题考查的是运算符的优先级,应该先计算 a+b的值为 21,然后 与 c比较大小的值为 0,根据“”的运算规则,整个表达式的值为 0。31.建立派生类对象时,3 种构造函数分别是 a(基类的构造函数)、b(成员对象的构造函数)、c(派生类的构造函数)这 3种构造函数的调用顺序为( )。(分数:2.00)A.abc B.acbC.cabD.cba解析:本题考查的是在继承中派生类的对象调用构造函数的顺序,应该 是先调用基类的构造函数,然后是成员中的对象对应类的构造函数,最后是派生类自己 的构造函数。32.C+中运算符优先级由高到低排列正确的是( )。(分数:2.00)A.:+ + |
24、 | B. * | | ,C.sizeof % + :D., void main( ) int a=10,b=20; couta“ “b; swap( int i; for(i=0;i填空项 1:_ (正确答案:abcbcc)解析:字符数组 ch 的值abc分别复制到了二维数组 x 的每一行,使得二维数组中每一行的值均为abc,再 通过第二个 for 循环打印出每一行上所要求输出的字符串。38.请在如下程序中的空格处填写正确的语句: #include using namespace std; class Base public: void fun1coutvalue)解析:this 指针是一个
25、隐含的指针,它隐含于每个类的非静态成员函数中,它明确地表示出了成员函数当前操作的数据所属的对象。46.C+语言程序的注释可以出现在程序中的任何地方,一个注释以 1 作为开始和结束的标记。(分数:30.00)填空项 1:_ (正确答案:/ * * /)解析:C+语言程序的注释可以出现在程序中的任何地方,一个注释以“/ *,”开始, 以“* /”为结束。47.下列程序的输出结果是 1。 #includeiostream using namespace std; class base public: int n; base (int x)nx; virtual void set (int m)nm;
26、coutn; ; class deriveA:public base public: dericeA(int x):base(x) void set(int m)nm;coutn; ; Class deriveB:public base public: deriveB(int x):base(x) void set(int m)nm;coutn; ; int main2 deriveA d1(1); deriveB.d2(3);base*pbase; pbase&d1; pbaseset(1); pbase&d2; pbaseset(2); return 0; (分数:30.00)填空项 1:
27、_ (正确答案:25)解析:本题考核虚函数的定义和调用。在 C中,一个基类指针(或引用)可以用来指向它的派生类对象,而且通过这样的指针(或引用)调用虚函数时,被调用的是该指针(或引用)实际所指向的对象类的那个重定义版本。题中基类成员函数 set-|_|-被定义成虚函数,而且其派生类 deriveA和deriveB都有函数 set-|_|-的重定义版本,所以通过指针 pbase的两次调用分别调用的是派生类 deriveA和 deriveB中定义的版本,即输出 25。48.以下程序的输出结果是 1。 #includeiostreamh void main2 int a=0; a+ =(a=8); cout a; (分数:30.00)填空项 1:_ (正确答案:16)解析:解答本题的关键是要分析清楚表达式 a+=(a=8)中,a 的值已经被赋为 8,而不是 0。