1、二级 C+-171 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:10,分数:30.00)1.已知类 X 成功地重载了-、=、+和这几个运算符,则其中肯定属于成员函数的运算符是_。(分数:3.00)A.+和=B.和后置-C.=和D.前置-和2.在下列成对的表达式中,运算符“/”的意义相同的一对是_。(分数:3.00)A.8/3 和 8.0/3.0B.8/3.0 和 8/3C.8.0/3 和 8/3D.8.0/3.0 和 8.0/33.在重载一个运算符函数时,其参数表中没有任何参数,这说明该运算符是_。(分数:3.00)A.一元非成员运算符B.一元成员运算符C.二元非
2、成员运算符D.二元成员运算符4.如果表达式-x/y 中的“-”和“/”都是作为友元函数重载的运算符,采用运算符函数调用格式时,该表达式应表示为_。(分数:3.00)A.operator/(x.operator-(),y)B.operator/(operator-(x),y)C.operator-().operator/(y)D.operator/(operator-(x)5.如果表达式 y*x+中,“*”是作为成员函数重载的运算符,“+”是作为友元函数重载的运算符,采用运算符函数调用格式时,该表达式应表示为_。(分数:3.00)A.operator+(0).operator*(y)B.oper
3、ator*(x.operator+(0),y)C.operator*(operator+(x,0)D.operator*(operator+(x,0),y)6.已知类 Myst 有一个只需要一个 double 型参数的构造函数,且将运算符“-”重载为友元函数。要使语句序列 Myst x(3.2), y(5.5), z(0.0); z=8.9-y; y=x-6.3; 能够正常运行,运算符函数 operator-应在类中声明为_。(分数:3.00)A.friend Myst operator-(MystB.friend Myst operator-(Myst, Myst);C.friend Mys
4、t operator-(Myst, MystD.friend Myst operator-(Myst7.关于关键字 class 和 typename,下列表述正确的是_。(分数:3.00)A.程序中所有的 class 都可以替换为 typenameB.程序中所有的 typename 都可以替换为 classC.A 和 B 都可以D.A 和 B 都不可以8.关于在调用模板函数时模板实参的使用,下列表述中正确的是_。(分数:3.00)A.对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略B.对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,
5、则都可以省略C.对于虚拟类型参数所对应的模板实参,若能够省略则必须省略D.对于常规参数所对应的模板实参,任何情况下都不能省略9.关于类模板,下列表述中不正确的是_。(分数:3.00)A.类模板中声明的类称为模板类B.类模板只能有虚拟类型参数C.类模板本身在编译中不会生成任何代码D.类模板的成员函数都是模板函数10.有如下函数模板定义: templateclass T T func(T x,T y)return x*x+y*y; 在下列对 func 的调用中不正确的是_。(分数:3.00)A.func(3,5)B.func(3,5)C.func(3,5.5)D.funcint(3,5.5)二、填
6、空题(总题数:28,分数:61.00)11.类继承中,默认的继承方式是 1。 (分数:3.00)12.如果类 Alpha 继承了类 Beta,则类 Alpha 称为 1 类,类 Beta 称为 2 类。 (分数:2.00)13.对基类数据成员的初始化必须在派生类构造函数中的 1 处执行。 (分数:2.00)14.设置虚基类的目的是 1,可通过 2 标识虚基类。 (分数:2.00)15.已知下面的程序框架,按注释中的提示补充细节。 #include iostream using namespace std; class planet protected: double distance; /行星
7、距太阳的距离 int revolve; /行星的公转周期 public: planet(douhle d,int r) distance=d; revolve=r; ; class earth:public planet double circumference; /地球绕太阳公转的轨道周长 public: /定义构造函数 earth(double d,int r),并计算地球绕太阳公转的轨道周长。 /假定:circumference=2d3.1416 1 /定义 show()函数显示所有信息 2 ; int main() earth ob(9300000,365); ob.show(); r
8、eturn 0; (分数:2.00)16.多态性可分为两类: 1 和 2。 (分数:2.00)17.对虚函数的调用有两种方式: 1 和 2。 (分数:2.00)18.实现编译时多态性的机制称为 1,实现运行时多态性的机制称为 2。 (分数:2.00)19.在 C+中,编译时的多态性是通过 1 和模板体现的。 (分数:2.00)20.在 C+中,运行时的多态性是通过 1 体现的。 (分数:2.00)21.含有纯虚函数的类称为 1。 (分数:2.00)22.一个纯虚函数声明中最后三个字符是 1。 (分数:2.00)23.重载的运算符仍然保持其原来的操作数个数、优先级和 1 不变。 (分数:2.00
9、)24.经常和一个运算符连用,构成一个运算符函数名的 C+关键字是 1。 (分数:2.00)25.如果表达式 x=y*z 中的“*”是作为成员函数重载的运算符,采用运算符函数调用格式时,该表达式应表示为 1。 (分数:2.00)26.表达式 x=operator-(y,z)还可以表示为 1。 (分数:2.00)27.如果表达式-x 中的“-”是重载的类成员函数运算符,采用运算符函数调用格式时,该表达式应表示为 1。 (分数:2.00)28.表达式 operator+(x,int)还可以表示为 1。 (分数:2.00)29.下面是“复数”类 complex 的定义,其中作为友元函数重载的运算符“
10、-”的功能是将参数对象的实部减 1,然后返回对该对象的引用;请补充完整下列代码: class complex int real; /实部 int imag; /虚部 public: complex(int r=0,int i=0):real(r),imag(i) void show()coutreal(imag0?“-“:“+“)imag“i“; 1 operator-(complex ; 2 operator-(complex return 3; (分数:2.00)30.下面是“二维向量”vector2D 的定义,其中作为成员函数重载的运算符“+”的功能是将两向量的分量 x 和 y 对应相加
11、,然后返回作为相加结果的新对象;请补充完整下列代码: class vector2D double x; /x 分量 double y; /y 分量 public: vector2D (double x0=0, double y0=0):x(x0),y(y0) void show() cout“(“x“,“y“)“; vector2D operator+(vector2D); ; vector2D 1 operator+(vector2D a) return vector2D( 2); (分数:2.00)31.已知: int DBL(int n)return n+n; 和 long DBL(lo
12、ng n)return n+n; 是一个函数模板的两个实例,则该函数模板的定义是 1。 (分数:2.50)32.在下面程序横线处填上适当内容,以使该程序执行结果为: 25 24 23 22 21 0 7.5 6.4 5.3 4.2 3.1 #include iostream using namespace std; templateclass T void f( 1) 2; for(int i=0;in/2;i+) t=ai,ai=an-1-i,an-1-i=t; int main() int a5=21,22,23,24,25; double d6=3.1,4.2,5.3,6.4,7.5;
13、f(a,5);f(d,6); for(int i=0;i5;i+) coutai“; coutendl; for(i=0;i6;i+) coutdi“; Coutendl; return 0; (分数:2.50)33.在下面程序横线处填上适当内容,以使该程序执行结果为: The pair is(21,55) The pair is(21.7,85.4) #include iostream using namespace std; templateclass T class pair public: T x,y; void show() cout“The pair is(“x “,“ y“)“e
14、ndl; ; int main() 1; c1. show(); 2 c2. show(); return 0; (分数:2.50)34.有如下程序: #include iostream using namespace std; templatetypename T T total(T * data) T s=0; while(*data)s+=*data+; return s; int main() int x=2,4,6,8,0,12,14,16,18; couttotal(x); return 0; 执行上面程序的输出是 1。 (分数:2.50)35.在下面程序横线处填上适当内容,以使该
15、程序执行结果为:5.5。 #include iostream using namespace std; templatetypename T T average(T *data) T s=0; 1; ; while(datai) s+=datai+; return 2; ; int main() double x=2.5,4.5,6.5,8.5,0.0,12.5,14.5,16.5,18.5; coutaverage(x); return 0; (分数:2.50)36.在下面程序横线处填上适当内容,以使程序的输出为:9 8 7 6。 #include iostream using namesp
16、ace std; templateclass T void f( 1, 2) 3; for(int i=0;in/2;i+) t=ai,ai=an-1-i,an-1-i=t, int main() int x=6,7,8,9; f(x,4); for(int i=0;i4;i+)coutxi; return 0; (分数:2.50)37.有如下的类模板定义: template typename TYPE class MyClass TYPE n; public: MyClass(TYPE k); . ; 其中构造函数 MyClass 用 k 的值初始化数据成员 n。因此在模板类体外,构造函数
17、MyClass 应定义为 1。 (分数:2.50)38.在下面程序横线处填上适当内容,以使程序的输出为:5 5 5 9 9。 #include iostream using namespace std; templateclass TYPE class HisClass TYPE data; public: HisClass(TYPE a,TYPE bdh TYPE c); TYPE getData() return data; ; templateclass TYPE 1 HisClass(TYPE a,TYPE b,TYPE c) 2; else if(bc) data=b; else d
18、ata=c; int main() HisClassint x1(3,4 ,5),x2(5,3 ,4),x3(4,5,3),x4(7,9,8),x5(8,7,9); coutx1.gelData()x2.getData()x3.getData() x4.getData()x5.getData(); return 0; (分数:2.50)三、阅读程序题(总题数:3,分数:9.00)39.写出下列程序的运行结果。 #include iostream using namespace std; class Person public: Person() cout“Constructor of Pers
19、on“endl; Person() cout“Destructor of Person“endl; ; class Student: public Person public: Student() cout“Constructor of Student“ endl; Student() cout“Destructor of Student“endl; ; class Teacher: public Person public: Teacher() cout“Constructor of Teacher“endl; Teacher() cout“Destructor of Teacher“end
20、l; ; int main() Student s; Teacher t; return0; (分数:3.00)_40.写出下列程序的运行结果。 #include iostream using namespace std; class Data public: Data (int x) Data:x=x; cout“ Data cons. “endl; Data() cout“Data des.“endl; private: int x; ; class Base public: Base(int x) :d1(x) cout“Base cons.“endl; Base() cout“Base
21、 des.“endl; private: Data d1; ; class Derived:public Base public: Derived (int x): Base(x),d2(x) cout“Derived cons.“ endl; Derived() cout“Derived des.“endl; private: Data d2; ; int main() Derived obj(5); return0; (分数:3.00)_41.写出下列程序的运行结果。 #include iostream using namespace std; class Base public: Bas
22、e(int x,int y) a=x; b=y; void Show() cout“ Base: “a“,“bendl; private: int a.b: ; class Derived: public Base public: Derived(int x,int y,int z):Base(x,y),c(z) void Show() cout“Derived:“cendl; private: int c: ; int main() Base b(50,50),*pb; Derived d(10,20,30); pb= pb-Show(); pb= pb-Show(); return 0;
23、(分数:3.00)_二级 C+-171 答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:10,分数:30.00)1.已知类 X 成功地重载了-、=、+和这几个运算符,则其中肯定属于成员函数的运算符是_。(分数:3.00)A.+和=B.和后置-C.=和 D.前置-和解析:2.在下列成对的表达式中,运算符“/”的意义相同的一对是_。(分数:3.00)A.8/3 和 8.0/3.0B.8/3.0 和 8/3C.8.0/3 和 8/3D.8.0/3.0 和 8.0/3 解析:3.在重载一个运算符函数时,其参数表中没有任何参数,这说明该运算符是_。(分数:3.00)A.一元非成员
24、运算符B.一元成员运算符 C.二元非成员运算符D.二元成员运算符解析:4.如果表达式-x/y 中的“-”和“/”都是作为友元函数重载的运算符,采用运算符函数调用格式时,该表达式应表示为_。(分数:3.00)A.operator/(x.operator-(),y)B.operator/(operator-(x),y) C.operator-().operator/(y)D.operator/(operator-(x)解析:5.如果表达式 y*x+中,“*”是作为成员函数重载的运算符,“+”是作为友元函数重载的运算符,采用运算符函数调用格式时,该表达式应表示为_。(分数:3.00)A.operat
25、or+(0).operator*(y)B.operator*(x.operator+(0),y)C.operator*(operator+(x,0) D.operator*(operator+(x,0),y)解析:6.已知类 Myst 有一个只需要一个 double 型参数的构造函数,且将运算符“-”重载为友元函数。要使语句序列 Myst x(3.2), y(5.5), z(0.0); z=8.9-y; y=x-6.3; 能够正常运行,运算符函数 operator-应在类中声明为_。(分数:3.00)A.friend Myst operator-(MystB.friend Myst opera
26、tor-(Myst, Myst); C.friend Myst operator-(Myst, MystD.friend Myst operator-(Myst解析:7.关于关键字 class 和 typename,下列表述正确的是_。(分数:3.00)A.程序中所有的 class 都可以替换为 typenameB.程序中所有的 typename 都可以替换为 class C.A 和 B 都可以D.A 和 B 都不可以解析:8.关于在调用模板函数时模板实参的使用,下列表述中正确的是_。(分数:3.00)A.对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略B
27、.对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略C.对于虚拟类型参数所对应的模板实参,若能够省略则必须省略D.对于常规参数所对应的模板实参,任何情况下都不能省略 解析:9.关于类模板,下列表述中不正确的是_。(分数:3.00)A.类模板中声明的类称为模板类B.类模板只能有虚拟类型参数 C.类模板本身在编译中不会生成任何代码D.类模板的成员函数都是模板函数解析:10.有如下函数模板定义: templateclass T T func(T x,T y)return x*x+y*y; 在下列对 func 的调用中不正确的是_。(分数:3.00)A.func(3,
28、5)B.func(3,5)C.func(3,5.5) D.funcint(3,5.5)解析:二、填空题(总题数:28,分数:61.00)11.类继承中,默认的继承方式是 1。 (分数:3.00)解析:私有继承(private)12.如果类 Alpha 继承了类 Beta,则类 Alpha 称为 1 类,类 Beta 称为 2 类。 (分数:2.00)解析:派生、基13.对基类数据成员的初始化必须在派生类构造函数中的 1 处执行。 (分数:2.00)解析:初始化列表14.设置虚基类的目的是 1,可通过 2 标识虚基类。 (分数:2.00)解析:解决二义性问题、关键字 virtual15.已知下面
29、的程序框架,按注释中的提示补充细节。 #include iostream using namespace std; class planet protected: double distance; /行星距太阳的距离 int revolve; /行星的公转周期 public: planet(douhle d,int r) distance=d; revolve=r; ; class earth:public planet double circumference; /地球绕太阳公转的轨道周长 public: /定义构造函数 earth(double d,int r),并计算地球绕太阳公转的轨道
30、周长。 /假定:circumference=2d3.1416 1 /定义 show()函数显示所有信息 2 ; int main() earth ob(9300000,365); ob.show(); return 0; (分数:2.00)解析:earth(double d,int r):planet(d,r) circumference=2*d*3.1416; void show() cout“distance is“distance“miles,and revolve is“ revolve“days.“endl; cout“circumference is“circumferenceen
31、dl; 16.多态性可分为两类: 1 和 2。 (分数:2.00)解析:编译时的多态性、运行时的多态性17.对虚函数的调用有两种方式: 1 和 2。 (分数:2.00)解析:非多态调用、多态调用18.实现编译时多态性的机制称为 1,实现运行时多态性的机制称为 2。 (分数:2.00)解析:静态绑定、动态绑定19.在 C+中,编译时的多态性是通过 1 和模板体现的。 (分数:2.00)解析:函数重载20.在 C+中,运行时的多态性是通过 1 体现的。 (分数:2.00)解析:虚函数21.含有纯虚函数的类称为 1。 (分数:2.00)解析:抽象类22.一个纯虚函数声明中最后三个字符是 1。 (分数
32、:2.00)解析:=0;23.重载的运算符仍然保持其原来的操作数个数、优先级和 1 不变。 (分数:2.00)解析:结合性24.经常和一个运算符连用,构成一个运算符函数名的 C+关键字是 1。 (分数:2.00)解析:operator25.如果表达式 x=y*z 中的“*”是作为成员函数重载的运算符,采用运算符函数调用格式时,该表达式应表示为 1。 (分数:2.00)解析:x=y.operator*(z)26.表达式 x=operator-(y,z)还可以表示为 1。 (分数:2.00)解析:x=y-z27.如果表达式-x 中的“-”是重载的类成员函数运算符,采用运算符函数调用格式时,该表达式
33、应表示为 1。 (分数:2.00)解析:x.operator-()28.表达式 operator+(x,int)还可以表示为 1。 (分数:2.00)解析:x+29.下面是“复数”类 complex 的定义,其中作为友元函数重载的运算符“-”的功能是将参数对象的实部减 1,然后返回对该对象的引用;请补充完整下列代码: class complex int real; /实部 int imag; /虚部 public: complex(int r=0,int i=0):real(r),imag(i) void show()coutreal(imag0?“-“:“+“)imag“i“; 1 oper
34、ator-(complex ; 2 operator-(complex return 3; (分数:2.00)解析:friend complex /x 分量 double y; /y 分量 public: vector2D (double x0=0, double y0=0):x(x0),y(y0) void show() cout“(“x“,“y“)“; vector2D operator+(vector2D); ; vector2D 1 operator+(vector2D a) return vector2D( 2); (分数:2.00)解析:vector2D: x+a.x,y+a.y3
35、1.已知: int DBL(int n)return n+n; 和 long DBL(long n)return n+n; 是一个函数模板的两个实例,则该函数模板的定义是 1。 (分数:2.50)解析:templatetypename T T DBL(T n)return n+n,32.在下面程序横线处填上适当内容,以使该程序执行结果为: 25 24 23 22 21 0 7.5 6.4 5.3 4.2 3.1 #include iostream using namespace std; templateclass T void f( 1) 2; for(int i=0;in/2;i+) t=
36、ai,ai=an-1-i,an-1-i=t; int main() int a5=21,22,23,24,25; double d6=3.1,4.2,5.3,6.4,7.5; f(a,5);f(d,6); for(int i=0;i5;i+) coutai“; coutendl; for(i=0;i6;i+) coutdi“; Coutendl; return 0; (分数:2.50)解析:T a,int n T t;33.在下面程序横线处填上适当内容,以使该程序执行结果为: The pair is(21,55) The pair is(21.7,85.4) #include iostream
37、 using namespace std; templateclass T class pair public: T x,y; void show() cout“The pair is(“x “,“ y“)“endl; ; int main() 1; c1. show(); 2 c2. show(); return 0; (分数:2.50)解析:pairint c1; c1. x= 21; c1.y=25 pairdouble c2; c2.x=21.7; c2.y= 5.434.有如下程序: #include iostream using namespace std; templatetyp
38、ename T T total(T * data) T s=0; while(*data)s+=*data+; return s; int main() int x=2,4,6,8,0,12,14,16,18; couttotal(x); return 0; 执行上面程序的输出是 1。 (分数:2.50)解析:2035.在下面程序横线处填上适当内容,以使该程序执行结果为:5.5。 #include iostream using namespace std; templatetypename T T average(T *data) T s=0; 1; ; while(datai) s+=dat
39、ai+; return 2; ; int main() double x=2.5,4.5,6.5,8.5,0.0,12.5,14.5,16.5,18.5; coutaverage(x); return 0; (分数:2.50)解析:int i=0 s/(i+1)36.在下面程序横线处填上适当内容,以使程序的输出为:9 8 7 6。 #include iostream using namespace std; templateclass T void f( 1, 2) 3; for(int i=0;in/2;i+) t=ai,ai=an-1-i,an-1-i=t, int main() int
40、x=6,7,8,9; f(x,4); for(int i=0;i4;i+)coutxi; return 0; (分数:2.50)解析:T a, int n T t37.有如下的类模板定义: template typename TYPE class MyClass TYPE n; public: MyClass(TYPE k); . ; 其中构造函数 MyClass 用 k 的值初始化数据成员 n。因此在模板类体外,构造函数 MyClass 应定义为 1。 (分数:2.50)解析:templatetypename TYPE MyClassTYPE:MyClass (TYPE k):n(k)38.
41、在下面程序横线处填上适当内容,以使程序的输出为:5 5 5 9 9。 #include iostream using namespace std; templateclass TYPE class HisClass TYPE data; public: HisClass(TYPE a,TYPE bdh TYPE c); TYPE getData() return data; ; templateclass TYPE 1 HisClass(TYPE a,TYPE b,TYPE c) 2; else if(bc) data=b; else data=c; int main() HisClassin
42、t x1(3,4 ,5),x2(5,3 ,4),x3(4,5,3),x4(7,9,8),x5(8,7,9); coutx1.gelData()x2.getData()x3.getData() x4.getData()x5.getData(); return 0; (分数:2.50)解析:HisClassTYPE: if(ab class Person public: Person() cout“Constructor of Person“endl; Person() cout“Destructor of Person“endl; ; class Student: public Person p
43、ublic: Student() cout“Constructor of Student“ endl; Student() cout“Destructor of Student“endl; ; class Teacher: public Person public: Teacher() cout“Constructor of Teacher“endl; Teacher() cout“Destructor of Teacher“endl; ; int main() Student s; Teacher t; return0; (分数:3.00)_正确答案:()解析:Constructor of
44、Person Constructor of Student Constructor of Person Constructor of Teacher Destructor of Teacher Destructor of Person Destructor of Student Destructor of Person40.写出下列程序的运行结果。 #include iostream using namespace std; class Data public: Data (int x) Data:x=x; cout“ Data cons. “endl; Data() cout“Data de
45、s.“endl; private: int x; ; class Base public: Base(int x) :d1(x) cout“Base cons.“endl; Base() cout“Base des.“endl; private: Data d1; ; class Derived:public Base public: Derived (int x): Base(x),d2(x) cout“Derived cons.“ endl; Derived() cout“Derived des.“endl; private: Data d2; ; int main() Derived obj(5); return0; (分数:3.00)_