1、二级 C+-206 及答案解析(总分:80.50,做题时间:90 分钟)一、选择题(总题数:35,分数:55.50)1.下列字符串中可以用作 C+语言标识符的是_。(分数:2.50)A._1234B.foobarC.virtualD.34var2.有如下程序: #includeiostream usmg namespace std; class Instrument public: virtual void Display()=0; ; class Piano:public Instrument public: void Display()/*函数体程序略*/) ; int main() In
2、strument s; Instrument *p=0; /.; return 0; 下列叙述中正确的是_。(分数:2.00)A.语句“Insturment *p=0;”编译时出错B.语句“Instrument s;”编译时出错C.类 Piano 中的 Display 函数不是虚函数D.类 Instrument 是一个虚基类3.有如下类定义: class Foo public: Foo(int v): value(v) / Foo() / private: Foo() / int value=0;/ ; 其中存在语法错误的行是_。(分数:1.00)A.B.C.D.4.有如下程序: #inclu
3、de iostream using namespace std; class Base public: void output() cout1; virtual void Print() cout“B“; ; class Derived:public Base public: void output() cout2; void Print() cout“D“; ; int main() Base *ptr=new Derived; ptr-output(); ptr-Print(); delete ptr; return(); 程序的输出结果是(分数:2.00)A.1BB.1DC.2BD.2D
4、5.以下程序的运行结是_。 #includeiostream using namespace std ; class Base char c; public : Base( char c0):c( c0) Base( )coutc; ; class Derived:public Base char c: public: Derived( char c0): Base(c0+1) ,c(c0) Derived()coute; ; int main() Derived obj(“x“); return 0: A) xy B) yx c)x D) y (分数:2.00)A.B.C.D.6.语句 in
5、t*p= 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; coutPoint:numberendl; deleteptr; return 0; 执行这个程序的输出结果是_。(分数:1.00)A.3B.4C.6D.78.下列有关类成员的叙述中,正确的是_。(分数:1
6、.00)A.友元函数是类的成员函数B.类成员的默认访问权限是私有的C.类成员函数必须声明为公有的D.类的静态数据成员不能是常成员9.将运算符“+”重载为非成员函数,下列原型声明中,错误的是 _ 。(分数:2.00)A.MyClock operator+(MyClock,long);B.MyClock operator+(MyClock,MyClock);C.MyClock operator+(long,long);D.MyClock operator+(long,MyClock);10.下列关于函数的描述中,错误的是_。(分数:2.50)A.函数可以没有返回值B.函数可以没有参数C.函数可以是
7、一个类的成员D.函数不能被定义为模板11.下列关系运算中,能使经运算后得到的新关系中属性个数多于原来关系中属性个数的是 _ 。(分数:2.00)A.选择B.连接C.投影D并12.已知二叉树后序遍历序列是 dabec,中序遍历序列是 debac,它的前序遍历序列是(分数:1.00)A.acbedB.decabC.deabcD.cedba13.以下函数实现的功能是 void fun(char*s) char*p,*q,temp; p=s; q=s+strlen(s)-1; while(pq) temp=*p; *p=*q; *p=temp; p+; q-; (分数:1.00)A.将一个字符串首尾颠
8、倒B.计算字符串的长度C.统计字符串中的空格个数D.将字符串中的小写字母变成大写字母14.执行语句 for(i=1;i+4;);,后变量 i 的值是(分数:1.00)A.3B.4C.5D.不定15.为了使模块尽可能独立,要求_。(分数:1.00)A.模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强B.模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱C.模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱D.模块的内聚程度要尽量低,且各模块间的耦合程度要尽量强16.下列关于派生类的描述中,错误的是 _ 。(分数:1.00)A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C
9、.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类中保持不变17.下面程序的输出结果是( )。 #include iostream using namespace std; void main() int s; for(int k=2;k6;k+=2) s=1; for(int j=k; j6;j+) s+=j; coutsend1;(分数:2.00)A.9B.1C.11D.1018.下面类的定义,有 _ 处错误。 class MyClass public: void MyClass(); MyClass(int value); private
10、: int i0;(分数:2.00)A.1B.2C.3D.419.有如下程序: #includeiostream 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; Fun fun1; const Fun fun2; _ return 0; 若程序的输出结果是: 123 则程序中下画线处遗漏的语句是_。(分数:1.00)A.coutfun1.value(
11、)Fun:ifun2.value();B.coutFun:ifun1.value()fun2.value();C.coutfun1.value()fun2.value()Fun:i;D.coutfun2.value()Fun:ifun1.value();20.为了取代 C 中带参数的宏,在 C+中使用_。(分数:1.00)A.重载函数B.内联函数C.递归函数D.友元函数21.有如下程序: # include ioslreclm Using namespace std; class Base public: Base(int x=0):valB(x)coutvalB; Base()coutval
12、B; Private: int valB; ; class, Derived: public Base public: Dcrived(int x=0,int y=0):Base(x),valD(y) coutvalD; Derived()coutvalD; private: int valD; ; int main() Derived obj12(2,3); return 0; 运行时的输出结果是 _ ,(分数:2.50)A.2332B.2323C.3232D.322322.设有表示学生选课的三张表,学生 S(学号,姓名,性别,年龄,身份证号),课程 C(课号,课名),选课SC(学号,课号,
13、成绩),则表 SC 的关键字(键或码)为(分数:2.00)A.课号,成绩B.学号,成绩C.学号,课号D.学号,姓名,成绩23.有如下程序: #includeiostream using namespace std; class TestClass public: virtual void funl() cout“fun1TestClass“; virtual void fun2() cout“fun2TestClass“;); class TestClassl:public TestClass void fun() cout“fun1TestClassl“; int main() Tc stC
14、lass obj1,*p; TestClass1 obj2; p=obj2; p-fun1(); p-fun2(); return 0; 该程序执行后的输出结果是_。(分数:1.00)A.fun1TestClass1 fun2TcstClassB.fun1TestClass1 fun2TestClass1C.fun1TestClass fun2TestClassD.fun1TestClass fun2TestClass124.有如下程序: #includeiostream using namespace std; class VAC public: int f()constreturn 3;
15、int f()return 5; ; int main() VAC v1; const VAC v2; coutv1.f()v2.f(); return 0; 执行这个程序的输出结果是_。(分数:1.00)A.53B.35C.55D.3325.下列选项中不全是 C+语言关键字的是(分数:2.00)A.const,break,defaultB.long,void,usingC.virtual,exterm,includeD.try,throw,this26.有如下程序: #includeiostream using namespace std; class Test public: Test()
16、 n+=2; Test() n-=3; static int getNum()return n; private: static int n; ; int Test:n=1; int main() Test* p=new Test; delete p; cout“n=“Test:getNum()endl; return 0; 执行该程序的输出结果是_。(分数:1.00)A.n=0B.n=1C.n=2D.n=327.有如下程序: #includeiostream using namespace std; class Test public: Test() n+=2; Test() n-=3; s
17、tatic int getNum()return n; private: static int n; ; int Test:n=1; int main() Test* p=new Test; delete p; cout“n=“Test:getNum()endl; return 0; 执行该程序的输出结果是_。(分数:1.00)A.n=0B.n=1C.n=2D.n=328.对下面的程序,正确的说法是 _ 。 main() int a,b=1,c=2; a=b+c,a+b,c+3; c=(c)? a+:b-; cout a+b,c;(分数:2.00)A.无错误B.第三行有错误C.第四行有错误D.
18、第五行有错误29.有以下程序: #includeiostream using namespace std; class Complex public: Complex(double r=0,double i=0):re(r),im(i) double real() constreturn re; double imag() constreturn im; Complex operator+(Complex c)const return Complex(re+c.re,im+c.im); private: double re,im; ; int main() Complex a=Complex(
19、1,1)+Complex(5); couta.real()“+“a.imag()“i“endl; return 0; 程序执行后的输出结果是_。(分数:1.00)A.6+6iB.6+1iC.1+6iD.1+1i30.下列关于虚基类的描述中,错误的是 _ 。(分数:2.00)A.使用虚基类可以消除由多继承产生的二义性B.构造派生类对象时,虚基类的构造函数只被调用一次C.声明“class B:virtual public A”说明类 B 为虚基类D.建立派生类对象时,首先调用虚基类的构造函数31.在对函数进行原型声明时,下列语法成分中不需要的是_。(分数:1.00)A.函数返回类型B.函数参数列表
20、C.函数名D.函数体32.下列对于软件测试的描述中正确的是_。(分数:2.50)A.软件测试的目的是证明程序是否正确B.软件测试的目的是使程序运行结果正确C.软件测试的目的是尽可能多地发现程序中的错误D.软件测试的目的是使程序符合结构化原则33.有如下程序: #includeiostream using namespace std; class Base public: void fun1()cout“Baseha/n“; virtual void fun2()cout“Base/n“; ; class Derived:public Base public: void fun1()cout“D
21、erived/n“; void fun2()cout“Derived/n“; ; void f(Baseb.fun2(); int main() Derived obj; f(obj); return 0; 执行这个程序的输出结果是_。(分数:2.00)A.BaseBaseB.BaseDerivedC.DerivedBaseD.DerivedDerived34.有如下程序: #includeiostream using namespace std; class CA public: virtual int f()return 1; ; class GB:public GA public: vi
22、rtual int f()return 2; ; void show(GA g)coutg.f(); void display(GA int main() GA a;show(a);display(a); CB b;show(b);display(b); return 0; 执行这个程序的输出结果是_。(分数:1.00)A.1111B.1211C.1112D.121235.下列叙述中错误的是_。(分数:2.50)A.用户定义的函数中可以没有 return 语句B.用户定义的函数中可以有多个 return 语句,以便可以调用一次返回多个函数值C.用户定义的函数中若没有 return 语句,则应当
23、定义函数为 void 类型D.函数的 return 语句中可以没有表达式二、填空题(总题数:15,分数:25.00)36.执行下列语句序列: im x=1, coutx“-“yend1; 输出结果为 1。 (分数:2.00)37.标识虚函数的关键字是 1。 (分数:2.00)38.对象根据所接受的消息而做出动作,同样的消息被不同的对象所接受时可能导致完全不同的行为,这种现象称为 1。 (分数:2.00)39.以下程序输出的结果是 _ 1_ 。 #includeiostream.h void main( ) int a=5,b=4,c=3,d; d=(abC) ; coutd; (分数:1.00
24、)40.以下函数模板 max 的功能是:返回数组 a 中最大元素的值。请将横线处缺失部分补充完整。 templatetypename TT max(T a,int n) Tm=a0; for(int i=1;in;i+) if(aim) _ 1_ ; return m; (分数:1.00)41.数据结构分为逻辑结构和存储结构,循环队列属于 _ 1_ 结构。 (分数:2.00)42.在下面的程序的横线处填上适当的语句,使该程序的输出为 12。 #include iostream using namespace std; class Base public: int a; Base(int i)
25、a=i; ; class Derived : public Base int a; public: Derived(int x) : Base(x),b(x+1) void show() 1; /输出基类数据成员 a 的值 coutbend1; ; int main() Derived d(1); d.show(); return 0; (分数:1.00)43.按照软件测试的一般步骤,集成测试应在 1 测试之后进行。 (分数:2.00)44.下列程序的输出结果是 1。 #includeiostream.h class base int x,y; public: base(int i,int j
26、)x=i;y=j; virtual int add( )return x+y; ; class three:public base int z; public: three(int i,int j,int k):base(i,j)z=k;) int add( )return(base:add( )+z); ; void main( ) three*q=new three(10,20,30); coutq-add( )endl; (分数:2.00)45.已知如下程序的输出结果是 23,请将画线处缺失的部分补充完整。 #includeiostream using namespace std; cl
27、ass MyClass public: void Print( )consteout23; ; int main( ) MyClass*P=new MyClass( ); 1.Print( ); return 0; (分数:2.00)46.若有函数 fun(x,y),并且已经使函数指针变量 p 指向函数 fun,则使用 p 调用函数 fun 的方法是 1。 (分数:2.00)47.已有函数 fun(a,b),为了使函数指针变量 P 指向函数 fun,则使用的赋值语句是 1。 (分数:2.00)48.如果一个模板声明时有类型形参表,则多个参数之间必须使用 1 隔开,每个参数都必须重复使用关键字
28、2。 (分数:1.00)49.数据管理技术发展过程经过人工管理、文件系统和数据库系统三个阶段,其中数据独立性最高的阶段是 1。 (分数:2.00)50.要想把类的一般成员函数说明为类的常成员函数,则应该使用关键词 _ 1_ 说明成员函数。 (分数:1.00)二级 C+-206 答案解析(总分:80.50,做题时间:90 分钟)一、选择题(总题数:35,分数:55.50)1.下列字符串中可以用作 C+语言标识符的是_。(分数:2.50)A._1234 B.foobarC.virtualD.34var解析:解析 C+语言标识符只能由数字、字母和下画线组成,并且只能以字母和下画线为开头。2.有如下程
29、序: #includeiostream usmg namespace std; class Instrument public: virtual void Display()=0; ; class Piano:public Instrument public: void Display()/*函数体程序略*/) ; int main() Instrument s; Instrument *p=0; /.; return 0; 下列叙述中正确的是_。(分数:2.00)A.语句“Insturment *p=0;”编译时出错B.语句“Instrument s;”编译时出错 C.类 Piano 中的
30、Display 函数不是虚函数D.类 Instrument 是一个虚基类解析:解析 由于函数 Display()是一个纯虚函数,所以类 Instrument 是抽象类,而抽象类是不能定义对象的,因而选项 B 为正确选项。3.有如下类定义: class Foo public: Foo(int v): value(v) / Foo() / private: Foo() / int value=0;/ ; 其中存在语法错误的行是_。(分数:1.00)A.B.C.D. 解析:解析 本题考查对象的初始化,类的数据成员是不能在声明类时初始化的,所以本题答案为 D。4.有如下程序: #include ios
31、tream using namespace std; class Base public: void output() cout1; virtual void Print() cout“B“; ; class Derived:public Base public: void output() cout2; void Print() cout“D“; ; int main() Base *ptr=new Derived; ptr-output(); ptr-Print(); delete ptr; return(); 程序的输出结果是(分数:2.00)A.1BB.1D C.2BD.2D解析:5.
32、以下程序的运行结是_。 #includeiostream using namespace std ; class Base char c; public : Base( char c0):c( c0) Base( )coutc; ; class Derived:public Base char c: public: Derived( char c0): Base(c0+1) ,c(c0) Derived()coute; ; int main() Derived obj(“x“); return 0: A) xy B) yx c)x D) y (分数:2.00)A. B.C.D.解析:解析 主函
33、数结束时,派生类对象 obj 将被销毁,先调用派生类的析构函数输出 x,然后调用基类的析构函数输出 y。6.语句 int*p= 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; coutPoint:numberendl; deleteptr; return 0; 执
34、行这个程序的输出结果是_。(分数:1.00)A.3B.4C.6 D.7解析:解析 本题考查默认构造函数,题目中定义一个对象 A、B 以及对象数组 Point3,又定义了对象 C,共执行 6 次构造函数,number 变为了 6,所以本题答案为 C。8.下列有关类成员的叙述中,正确的是_。(分数:1.00)A.友元函数是类的成员函数B.类成员的默认访问权限是私有的 C.类成员函数必须声明为公有的D.类的静态数据成员不能是常成员解析:解析 友元函数是指某些虽然不是类成员却能访问类的所有成员的函数,故友元函数不是类的成员函数。类成员的默认访问权限是私有的,类的成员函数可以是 3 种权限中的一种,静态
35、数据成员可以为常成员。故本题答案为 B。9.将运算符“+”重载为非成员函数,下列原型声明中,错误的是 _ 。(分数:2.00)A.MyClock operator+(MyClock,long);B.MyClock operator+(MyClock,MyClock);C.MyClock operator+(long,long); D.MyClock operator+(long,MyClock);解析:解析 首先非成员函数一般都是友元函数,相比成员函数第一个操作数是对象本身以 this 指针的形式隐含在参数列表中,非成员函数调用必须显性的列出参数;选项 C 中没有 MyClock 类型,故选
36、C。10.下列关于函数的描述中,错误的是_。(分数:2.50)A.函数可以没有返回值B.函数可以没有参数C.函数可以是一个类的成员D.函数不能被定义为模板 解析:解析 函数可以被定义为模板:“template模板形参表返回值类型函数名(模板函数形参表)/函数定义体),”其中模板形参表是由一个或多个模板形参组成,每个模板形参可以有这几种形式:typename参数名,class参数名,类型修饰参数名;前两种是等价的 typename 和 class 可以互换,它们的参数为虚拟类型参数;最后一种参数是常规参数。11.下列关系运算中,能使经运算后得到的新关系中属性个数多于原来关系中属性个数的是 _ 。
37、(分数:2.00)A.选择B.连接 C.投影D并解析:12.已知二叉树后序遍历序列是 dabec,中序遍历序列是 debac,它的前序遍历序列是(分数:1.00)A.acbedB.decabC.deabcD.cedba 解析:解析 依据后序遍历序列可确定根结点为 c;再依据中序遍历序列可知其左子树由 deba 构成,右子树为空;又由左子树的后序遍历序列可知其根结点为 e,由中序遍历序列可知其左子树为 d,右子树由 ba 构成,如下图所示。求得该二叉树的前序遍历序列为选项 D)。 13.以下函数实现的功能是 void fun(char*s) char*p,*q,temp; p=s; q=s+st
38、rlen(s)-1; while(pq) temp=*p; *p=*q; *p=temp; p+; q-; (分数:1.00)A.将一个字符串首尾颠倒 B.计算字符串的长度C.统计字符串中的空格个数D.将字符串中的小写字母变成大写字母解析:解析 本题考核 while 循环语句和指针的使用。在该函数中,循环开始时,指针 p 指向字符串的第 1 个字符,指针 q 指向字符串的最后一个字符,首先交换这两个字符:然后,指针 p 前进一个字符位置(指向下一个字符),指针 q 后退一个字符位置(指向前一个字符);经过若干次循环,条件 pq 将为假(即指针 p 和指针 q 相遇),循环结束。从而实现了将一个
39、字符串首尾颠倒的功能。14.执行语句 for(i=1;i+4;);,后变量 i 的值是(分数:1.00)A.3B.4C.5 D.不定解析:解析 for 语句中的表达式可以部分或全部省略,但两个“;”不能省略,若 3 个表达式均省略,会因为缺少条件判断,导致循环无限执行,而形成死循环。本题中当 i 的值为 5 的时候,循环终止。15.为了使模块尽可能独立,要求_。(分数:1.00)A.模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强B.模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱 C.模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱D.模块的内聚程度要尽量低,且各模块间的耦合程度
40、要尽量强解析:解析 耦合是指模块之间的关联程度,而内聚是指模块内部各部分的聚合程度。模块之间的关联程度越小,模块内部的聚合程度越高,越容易维护。在程序设计中应追求高内聚低耦合。16.下列关于派生类的描述中,错误的是 _ 。(分数:1.00)A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类中保持不变 解析:解析 基类与派生类的关系如下: 基类是对派生类的抽象,派生类是对基类的具体化。基类抽取了它的派生类的公共特征,而派生类通过增加信息将抽象的基类变为某种有用的类型,派生类是基类定
41、义的延续。 派生类是基类的组合。 公有派生类的对象可以作为基类的对象处理。 由此可知选项 A、B 和 C 都是正确的。而在继承中,采用不同的继承方式,将限制派生类对基类成员的访问。所以选项 D 是错误的。17.下面程序的输出结果是( )。 #include iostream using namespace std; void main() int s; for(int k=2;k6;k+=2) s=1; for(int j=k; j6;j+) s+=j; coutsend1;(分数:2.00)A.9B.1C.11D.10 解析:18.下面类的定义,有 _ 处错误。 class MyClass
42、public: void MyClass(); MyClass(int value); private: int i0;(分数:2.00)A.1B.2C.3 D.4解析:解析 上述类的定义共有 3 处错误。(1) 类的成员变量不能在定义时进行初始化;(2) 类的:构造函数不能有返回值(包括 void 类型);(3) 类的析构函数不能有参数。19.有如下程序: #includeiostream using namespace std; int i=1; class Fun public: static int i; int value()return i-1; int value()constr
43、eturn i+1; ; int Fun:i=2; int main() int i=3; Fun fun1; const Fun fun2; _ return 0; 若程序的输出结果是: 123 则程序中下画线处遗漏的语句是_。(分数:1.00)A.coutfun1.value()Fun:ifun2.value(); B.coutFun:ifun1.value()fun2.value();C.coutfun1.value()fun2.value()Fun:i;D.coutfun2.value()Fun:ifun1.value();解析:解析 本题考查构造函数、常成员函数和静态数据成员。外部同
44、名的变量赋值,不能改变类的静态变量值,所以 Fun 对象里的 i 值为 2,所以本题答案为 A。20.为了取代 C 中带参数的宏,在 C+中使用_。(分数:1.00)A.重载函数B.内联函数 C.递归函数D.友元函数解析:解析 一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换,即类似于宏。21.有如下程序: # include ioslreclm Using namespace std; class Base public: Base(int x=0):valB(x)coutvalB; Base()coutva
45、lB; Private: int valB; ; class, Derived: public Base public: Dcrived(int x=0,int y=0):Base(x),valD(y) coutvalD; Derived()coutvalD; private: int valD; ; int main() Derived obj12(2,3); return 0; 运行时的输出结果是 _ ,(分数:2.50)A.2332 B.2323C.3232D.3223解析:解析 本题使用析构函数。22.设有表示学生选课的三张表,学生 S(学号,姓名,性别,年龄,身份证号),课程 C(课
46、号,课名),选课SC(学号,课号,成绩),则表 SC 的关键字(键或码)为(分数:2.00)A.课号,成绩B.学号,成绩C.学号,课号 D.学号,姓名,成绩解析:解析 本题考查数据库关键字和表之间关系的相关知识。所谓关键字就是指表中的某个属性的值具有能唯一标识关系中元组。23.有如下程序: #includeiostream using namespace std; class TestClass public: virtual void funl() cout“fun1TestClass“; virtual void fun2() cout“fun2TestClass“;); class TestClassl:public TestClass void fun() cout“fun1TestClassl“; int main() Tc stClass obj1,*p; TestClass1 obj2; p=obj2; p-fun1(); p-fun2(); return 0; 该程序执行后的输出结果是_。(分数:1.00)A.fun1Tes