全国计算机等级考试二级笔试试卷公共基础知识及C++语言程序设计.docx
全国计算机等级考试二级笔试试卷公共基础知识及C+语言程序设计(04年9月)(考试时间90分钟,满分100)分)一、选择题(1)(35)每小题2分,共70分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在 答题卡相应位置上,答在试卷上不得分。(5)下面概念中,不属于面向对象方法的是A)对象B)继承C)类D)J过程调用(11)关于面向对象的程序设计方法,下列说法正确的是A)“封装性,指的是将不同类型的相关数据组合在一起,作为一个整体进行处理B) “多态性”指的是对象的状态会根据运行时要求自动变化C)基类的私有成员在派生类的对象中不可访问,也不占内存空间D) J在面向对象的程序设计中,结构化程序设计方法仍有着重要作用(21)有以下类定义class MyClass(public:MyClass() cout« 1;;则执行语句MyClass a, b2, *p;后,程序的输出结果是A)ll B)V111 C)llll D)lllll(22)关于友元,下列说法错误的是A)。如果类A是类B的友元,那么类B也是类A的友元B)如果函数fun()被说明为类A的友元,那么在fun。中可以访问类A的私有成员C)友元关系不能被继承D)如果类A是类B的友元,那么类A的所有成员函数都是类B的友元(23)关于动态存储分配,下列说法正确的是A)new和delete是C+语言中专门用于动态内存分配和释放的函数B)J动态分配的内存空间也可以被初始化C)当系统内存不够时,会自动回收不再使用的内存单元,因此程序中不必用delete释放内存 空间D)当动态分配内存失败时,系统会立刻崩溃,因此一定要慎用new(24)有以下程序#i nc 1 ude<i ostream>using namespace std;class MyClasspublic:MyClass(int n)number = n; 拷贝构造函数 MyClass(MyClass &other) number=other.number; -MyClass() private:int number;;MyClass fun(MyClass p)(MyClass temp(p);return temp; int main()(MyClass objl(10), obj2(0);MyClass obj3(objl);obj2=fun(obj3);return 0;)程序执行时,MyClass类的拷贝构造函数被调用的次数是A)5 B) V4 C)3D)2(25)在公有派生的情况下,派生类中定义的成员函数只能访问原基类的A)公有成员和私有成员B)私有成员和保护成员C)J公有成员和保护成员D)私有成员、保护成员和公有成员(26)在C+中用来实现运行时多态性的是A)重载函数B)析构函数C)构造函数D)J虚函数(27)一个类可以同时继承多个类,称为多继承。下列关于多继承和虚基类的表述中,错误的 是A)每个派生类的构造函数都要为虚基类构造函数提供实参B)多继承时有可能出现对基类成员访问的二义性问题C) J使用虚基类可以解决二义性问题并实现运行时的多态性D)建立最派生类对象时,虚基类的构造函数会首先被调用(28)在个类体的下列声明中,正确的纯虚函数声明是A) V virtual void vf()=O; B) void vf(int)=O;C) virtual int vf(int);D) virtual void vf(int) (29)在下面的运算符重载函数的原型中,错误的是A) V Volume operator - (double, double);B) double Volume:operator- (double);C) Volume Volume: :operator - (Volume);D) Volume operator - (Volume, Volume);(30)下列是模板声明的开始部分,其中正确的是A) template<T>B) template<class T1 ,T2>C) J template<class Tl, class T2>D) template<class T1 ;class T2>(32)C+流中重载的运算符>>是一个()A)用于输出操作的非成员函数B)J用于输入操作的非成员函数C)用于输出操作的成员函数D)用于输入操作的成员函数(33)有以下类定义class Point public:Point(int x = 0, int y = 0) _.x = x; _.y = y; void Move(int xOff, int yOff) _x += xOff; _.y += yOff; void Print() const cout« *(*« _x « V « _y « y « endl; private:int _x, _y;);下列语句中会发生编译错误的是A) Point pt; pt.Print();B) const Point pt; pt.Print();C) Point pt; pt.Move(l, 2);D) V const Point pt; pt.Move(l, 2);(34)有以下类定义class MyClass ( private:int id;char gender,char *phone;public:MyClass():id(0),gender(,#'),phone(NULL) MyClass(int no, char ge='# char *ph= NUL1.) id=no;gende=ge;phone=ph; ;下列类对象定义语句中错误的是A) MyClass myObj;B) V MyClass myObj(ll, H13301111155");C) MyClass myObj(12, 'm');D) MyClass myObj(12);(35)有以下程序#include <iostream>using namespace std;class Complex (public:Complex(double r =0, double i =0):re(r), im(i) double real() const return re; double imag() const return im;Complex operator +(Complex c) const return Complex(re+c.re, im+c.im); ) private:double re, im;);int main() (Complex a = Complex(l, 1) + Complex(5);cout « a.realQ « '+'« a.imagO «*i'« endl;return 0;程序执行后的输出结果是A) 6+6i B) V6+li C) l+6i D) 1+li二、填空题(每空2分,共30分)请将每一个空的正确答案写在答题卡川-口5序号的横线上,答在试卷上不得分。注意: 以命令关键字填空的必须拼写完整。(7)从实现的角度划分,C+所支持的两种多态性分别是171编译时的多态性和运行时的 多态性。(8)将一个函数声明为一个类的友元函数必须使用关键字81 friend。(9)请按下面注释的提示,将类B的构造函数定义补充完整。 class Aint a;public:A(int aa=O) a=aa; :class B: public A int b;Ac;public:用aa初始化基类A,用aa+1初始化类对象成员cB(int aa): 9 1 A(aa).c(aa+1) 或 c(aa+l), A(aa)_ b=aa+2; );(ID下列程序的输出结果是11 042。#include <iostream>using namespace std;class Test public:Test() cnt+; Test。ent-; )static int Count() return ent; private:static int ent;);int Test:cnt = 0;int main() (cout« Test:CountO «* *;Test tl, t2;Test* pT3 = new Test;Test* pT4 = new Test;cout« Test:CountO «* *;delete pT4;delete pT3;cout« Test:Count() « endl;return 0;(12)下面是用来计算n的阶乘的递归函数,请将该函数的定义补充完整。(注:阶乘的定义是 n!=n*(n-l)*.*2*l)unsigned fact(unsigned n) if (n<= 1) return 1;return I 12 1 n*fact(n-1)一, )(13)下列程序的输出结果是“31 3314。#include <iostream> using namespace std; template<tytename T>T fun(Ta,Tb) return (a<=b)?:b;) int main() (cout« fun(3, 6) « 7 « fun (3.14F, 6.28F) « endl;return 0; )(14)与成员访问表达式p->name等价的表达式是114 (*p).name »(15)下列程序的输出结果是1151 25。#include <iostream> using namespace std;class base public:int n;base(int x) n = x;virtual void set(int m) n = m; cout« n «* );class deriveA:public base public:deriveA(int x):base(x) void set(mt m) n += m; cout « n «*' );class deriveB:public base public:deriveB(int x):base(x) void set(int m) n +=m; cout «n vv 'int main() derive A dl(l);deriveB d2(3);base *pbase;phase = &dl;pbase->aet( 1);phase = &d2; pbase->set(2); return 0;2007年4月计算机等级考试C+考试及答案一、选择题(每小题2分,共70分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的。请将正确选项涂写在答 题卡相应位置上,答在试卷上不得分。(4)下面选项中不属于面向对象程序设计特征的是.A)继承性B)多态性C) J类比性D)封装性(11)为了取代C中带参数的宏,在C+中使用A)重载函数B) J内联函数C)递归函数D)友元函数(12)下列关于类定义的说法中,正确的是A),类定义中包括数据成员和函数成员的声明B)类成员的缺省访问权限是保护的C)数据成员必须被声明为私有的D)成员函数只能在类体外进行定义(13)下列关于派生类构造函数和析构函数的说法中,错误的是A)派生类的构造函数会隐含调用基类的构造函数B)如果基类中没有缺省构造函数,那么派生类必须定义构造函数C)在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数D) J在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数(14)通过运算符重载,可以改变运算符原有的A) J操作数类型B)操作数个数C)优先级D)结合性(15)有如下函数模板:template <classT>T souare (Tx)(retumx * x ;)基中T是A)函数形参B)函数实参C) J模板形参D)模板实参(16)使用输入输出操作符setw,可以控制A)输出精度B)。输出宽度C)对齐方式D)填充字符(20)有如下程序段inti =0, j=l;int&r=i; / r=j; int*p=&i; *p=&r; II®基中会产生编译错误的语句是A) JB)C)D)(22)有如下程序:#include<iostream> using namespace std; class A public static int a;void init ( ) a= 1;A (int a=2) init () ;a+;) ; int A:;a=0 Aobj;Ini main () ( cout«obj.a; retumO;) 运行时输出的结果是 A) OB) 1 C) J2D) 3(23)下列有关继承和派生的叙述中,正确的是A)派生类不能访问基类的保护成员B)作为虚基类的类不能被实例化C) J派生类应当向基类的构造函数传递参数D)虚函数必须在派生类中重新实现(24)下列运算符中,不能被重载的是A) && B)! =C) V.D) +(25)下列函数模板的定义中,合法的是A) V template<typename T>Tabs (T x) return x<0-x: x; B) template class <T>Tabs (Tx) retumx<0 -x;x; C) templateT<class T.>abs (T x) return x<0 -x;x; D) template T abs (T x) returm x<0 -x;x;(26)在语句 cin»data;中,cin 是A) C+的关键字B)类名C) J对象名D)函数名(27)有如下程序:#include<iostream>using namespace std;class test private:int a;public:test()(cout«',constructor,'«endl;)test(int a)( cout«a«endl;)test(const test&_test) (a=_test.a;cout«ncopy constructor"«endl;)-test()cout«',destructor,«endl;);int main()(test A(3);return 0;)运行时输出的结果是A) 3B) constructordestruclorC) copy constructorD) V3dstructor destruclor(28)若有如下类声明class My Class public:MyClass () cout«l;;执行下列语句MyClass a,b2,*P2;以后,程序的输出结果是A) 11 B) V 111 C) 1111 D1111I(29)有如下程序:#include<iostream>using namespace std;class point public:static int number;public:point()(number+;point。(number;);int point:number=0;int main()point *ptr;point A,B;point *ptr_point=new point3;ptr=ptr_point;point C;cout«point:number«endl;deleteptr;return 0;运行时输出的结果是A) 3 B) 40 6D) V7(30)如果不使用多态机制,那么通过基类的指针虽然可以指向派生类对象,但是只能访问 从基类继承的成员,有如卜程序,没有使用多态机制。#include<iostream>using namespace std;class Baseint a,b;public:Bace (int x jnt y) a=x; b=y;Void show ( ) cout«a«,«b«endl;clsaa Derived:public Base int c ,d;public:Derived (int x,int y,int z,int m) :Base (x,y) c=z; d=m; Void show () cout«c«,d«endl; ;int main () (Base Bl (50,50) ,*pb;Derived DI (10,20,30,40);Pb=&Dl;Pb->show ();Return 0;运行时输出的结果是A) 710, 20 B) 30, 40 0 20, 30 D) 50, 50(31)有如下程序:#include<iostream> using namespace std;ciass A ( public;A (int i ) x= i;Void sispa ( ) cout«x«,;Private: int x ; );class B;publicA ( public;B (inti) :A (i+10) x=i;voud dispb () dispa () ;cout«x<,endl; Private:Int x;; int main () (Bb (2);b.dispb ()return 0:运行时输出的结果是A) 10, 2B) 12, IOC) V12, 2D) 2, 2(32)虚函数支持多态调用,一个基类的指针可以指向派生类的时象,而且通过这样的指针 调用虚函数时,被调用的是指针所指的实际对象的虚函数,而非虚函数不支持多态调用。 有如下程序:#include<iostream> using namespace std; class Base ( public:virtual void f ( ) cout«,fO+,;J void g ( ) cout«,gO+, );class Derived:public Base ( public: voidf () cout«,f+,;J void g ( ) cout«,g+,;J ); int main () (Derived d;Base*p=&d;p->f O ;p->g ();return 0: )运行时输出的结果是A) f+g+B) VfO+g+C) f+gO+D) fO+gO+(33)下面程序中对一维坐标点类Point进行运算符重载 #include<iostream> using namespace std;class point public: point (int val) x=val; point & operator+ () x+;retum*this; printoperator+ (int) pointold=*this,+ (*this) ;retumold; int GetX ( ) const return x; private: int x; );int main () (point a (10);cout« (+a) .GetX ();cout«a+.GetX ();return ();)编译和运行情况是A)运行时输出1011B) J运行时输出1111C)运行时输出1112D)编译有错(34)有如下程序:#include<iostream>using namespace std;int main ()char str100,*p;coutvv”please input a string:"cin»str;p=str;for (int i =0;*p!="'0''p+, i +);cout« i «endl;return 0;)运行这个程序时,若输入字符串为abcdefg abed则输出结果是A) 7B) V12C) 13D) 100(35)有如下程序:#include<iostream>using namespace std:class Sample(friend long fun (Sample s);public:Sample (long a ) x=a;Private:long x;;long fun (Sample s)(if (s.x<2) return 1;return s.x*fun (Sample (s.x-a);int sum=Ofor (int i =0; i <6; i +) sum+=fun (Sample ( i ) ;) cout«sum;return 0;运行时输出的结果是A) 120B) 160 -J 154 D) 34二、填空题(每空2分,共30分)请将每一个空的正确答案写在答题卡1】【15】序号的横线上,答在试卷上不得分。(8)已知一个函数的原型是:int fn (double x);若要以5.27为实参调用该函数,应使用表达式【8】fn(5.27)。(9)有如下定义:class MAint value;public:MA (int n=0) :valut (n) ;MA*ta,tb;其中MA类的对象名标识符是【9】tb o(10)如下类定义中包含了构造函数和拷贝数的原型声明请在横线处写正确的内容,使拷贝 构造函数的声明完整。Class my Class Private:Int data:Public:MyClass (int value);构造函数MyClass (const 10 myclass& another Object); 拷贝构造函数 )(11)用来派生新类的称为【11】基类,而派生出的新类称为它的子类或派生类。(12)有如下程序:#include<iostream>using namespace std;clsaa CApublic:CAD cout« A*;;class CB ;private CApublic;CB () cout«B,;);int main ( ) cout«B,;;int main ( ) CA a;CB b;retumO;)这个程序的输出结果是【12】AAB。(13)若将一个二元运算符重载为类的成员函数,其形参个数应该是13 1个。(14)有如下程序:#include<iostream>using namespace std;class DAint k;public:DA (int x=l) :k (x) DA ( ) cout«k ;);int main ( ) DAd=DA (3) ,DA (3) ,DA (3) ;DA* p=new DA2;deletep;retumO;)这个程序的输出结果是【14】 11333 .(15) C+语言中的多态性分为编译时的多态性和【15】运行时的多态性。2007年9全国计算机等级考试二级笔试试卷C+语言程序设计(考试时间90分钟,满分100分)(12)对于一个类定义,下列叙述中错误的是A如果没有定义拷贝构造函数,编译器将生成一个拷贝构造函数BV如果没有定义缺省的构造函数,编译器将一定生成一个缺省的构造函数C如果没有定义构造函数,编译器将生成一个缺省的构造函数和一个拷贝构造函数D如果已经定义了构造函数和拷贝构造函数,编译器不会生成任何构造函数(13)若派生类以public方式继承基类,则原基类的protected成员和public成员在派生类 中的访问类型分别是A public 和 publicB public 和 protectedC protected 和 public D V protected 和 protected(14)卜,列运算符函数中肯定不属于类FunNumber的成员函数的是A int operator-(FunNumber)B FunNumber operator-()C FunNumber operator-(int)D V int operator - (FunNumber) (15) C+中的模板包括A对象模板和函数模板B对象模板和类模板C J函数模板和类模板D变量模板和对象模板(16)如果调用C+流进行输入输出,下面的叙述中正确的是A J只能借助于流对象进行输入输出B只能进行格式化输入输出C只能借助于cin和cout进行输入输出D只能使用运算符和进行输入输出(17)下列富豪中不属于C+关键字的是A friend B namespace C continue D -J byte(21)关于函数重载,下列叙述中错误的是A重载函数的函数名必须相同B重载函数必须在函数个数或类型上有所不同C J重载函数的返回值类型必须相同D重载函数的函数体可以有所不同(22)有如下头文件IntflO;Static int f2();Class MAPublicInt f3();Static int f4(););在所描述的函数中,具有隐含的this指针的是AfiBf2CV f3Df4(23)派生类的成员函数不能访问基类的A共有成员和保护成员B共有成员C。私有成员D保护成员(24)下列关于运算符重载的描述中,正确的是A J运算符重载为成员函数时,若参数表中五参数,重载的是一元运算符B 一元运算符只能作为成员函数重载C二元运算符重载为非成员函数时,参数表中有一个参数D C+中可以前载所有的运算符(25)下列关于类模板的模板参数的叙述中,错误的是A模板参数可以作为数据成员的类型B模板参数可以作为成员函数的返回类型C模板参数可以作为成员函数的参数类型D J模板函数不能作为成员函数的局部变量的类型(26)已知一程序运行后执行的第一个输出操作是Cout«setw( 10)«setfill(*)« 1234则此操作的输出结构是A 1234B V*1234C *1234 D 1234*(27)有如下程序#include <iostrcam>Using namespace std;Class myclassPublic:MyClass() +count;-MyClass() -count;Static int getcount() return count;PrivateStatic int count;;Int MyClass:count=0;Int main()Myclass obj;Cout«obj,getCount();MyClass*ptr=new MyClass;Cout«MyClass: :getcount();Delete ptr;Cout«MyClass: :gercount();Return();)程序的输出结果是A V121B232C221 D 122(28)有如下程序 ttinclude <iostrean> Using namespace std; Class Myclass Public;Myclassconst(x):ual(x)<>Uoid print() const <cout« construal- ,«ual«t ;> Uoid print() <cout« ual- ,«ual«t ;>Priuate;Int ual;>;Int main()Const myclass obj1(10);Myclass obj2(20);Obj1.print();0bj2.print(); Return ();>程序的输出结果是A val=lO const:val=20B const:val= 10 const:val=20C J const: val= 10val=20D val=10val=20(29)有如下程序#include <iostream>Using name space std;Class partPublic;Part(int x=():val(x)coutval;-part() cout«val;Private;Int val;);Class whole Public;Whole(int x,int y,int z=0):p2(x),pl (y),val(z) cout«val;)Whole() count, val;Private;Part pl,p2;Int val;);Int maintWhole obj( 1,2,3);Restum();程序输出的结果是A 123321 B 213312C213 DJ(30)有如下程序:#include <iostream>Using namespace std;Class basePublic:Base(int x=0)cout«x;;Class derived : public basePublic:Derivedrin(x=y) cout«x;Priblic:Base val;;Int main()Derived d(!);Retum();)程序的输出结果是AO B 1 CV 01D001(31)若有如下类定义:Classs B Voidfun()Protected;Double varl;Public:Voidfun2();Class D:public BProtected;Void fun3();已知obj是类D的对象,下列语句中不违反成员访问控制的权限的是 Aobj.funl(); Bobj.varl; C Vobj.fun2(); D obj.fun3();(32)有如下程序:#include<iostream>Using namespace sid;Class basePublic;Void oulput() cout« 1;Virtual void print() cout«B;;Class derived:public basePublic:Void output()cout«2;Void print()cout«,D,;);Int main()Base * passnew derived;Ptr->output();Ptr->print();Delete ptr;Retum();程序的输出结果是A IB B ID C2B DV 2D下列是重载乘法运算的函数原型声明,其中错误的是A J myclass operator*(double,double);B myclass operator*(double,myclass);C myclass operator*(myclass,double);D myclass operator*( myclass , myclass);)如下函数的作用是网倍行距输出文件,Uoid double_space(ifstrean&F,oFstrean&t)Char c;While ()<If (c= &n' )t.put(c),)孤处缺失的部分是A与t.put(c)B f.put(c)与tget(c)工十工口+C t.ger(c )F.get(c)D tput(c)与F.get(35)有如下程序:#include <iostream>Using namespace std:Class BPublic:Virtual void show() cout«,b,?;;Class D:public B Public:Void show()cout«D;);Void fun 1 (B*ptr) ptr->show();Void fun2(B &ref)ref.show();Void fun3(B b)b.show();Int main()B b,*p=new D;Dd;Funl(p);Fun2(b);Fun3(d);Retum();)程序的输出结果是ADBD B BBD C DBB D V DBD二、填空题(每空2分,共三十分)(7) .执行下列语句后,变量sum的值是_6.Int sum =0;For (int j=I;j<=I;j+)For (int j=I;j<=I;j+)Sum+;(8) .已知有函数f的定义如下:Int f()Static int -6;s-2;Return s)则在某程序中第二次执行函