1、面向对象程序设计C+期末考试试卷(B)班级: 姓名: 学号: 分数: 题号一二三四总分得分试卷说明:本套试题共四个大题,全部题目都答在答题纸上,写在其他地方均无效。(答题纸在本套试卷的第8页上)一、单项选择题(每小题2分,共40分)1、关于C+与C语言关系的描述中,( D )是错误的。 AC语言是C+语言的一个子集 BC语言与C+语言是兼容的 CC+语言对C语言进行了一些改进 DC+语言和C语言都是面向对象的2、已知:int m=10; 下列表示引用的方法中,( A )是正确的。Aint &x=m; Bint &y=10; Cint &z; Dfloat &t=&m;3、考虑下面的函数原型声明
2、:void testDefaulParam(int a,int b=7,char z=*);下面函数调用中,不合法的是( C )。AtestDefaulParam(5); BtestDefaulParam(5,8);CtestDefaulParam(5,#); DtestDefaulParam(0,0,*);4、系统在调用重载函数时往往根据一些条件确定哪个重载函数被调用,在下列选项中,不能作为依据的是( A )。A函数的返回值类型 B参数的类型 C函数名称 D参数个数5、下列有关C+类的说法中,不正确的是( D )。A类是一种用户自定义的数据类型B只有类中的成员函数或类的友元函数才能存取类中的
3、私有成员C在类中,如果不做特别说明,所有成员的访问权限均为私有的D在类中,如果不做特别说明,所有成员的访问权限均为公用的6、已知X类,则当程序执行到语句X array3;时,调用了( D )次构造函数。A0 B1 C2 D37、有关析构函数的说法,不正确的是( B )。A析构函数有且仅有一个B析构函数和构造函数一样可以有形参C析构函数的功能是在系统释放对象之前作一些内存清理工作D析构函数无任何函数类型8、类定义的内容允许被其对象无限制地存取的是( C )。Aprivate 部分 B protected 部分 Cpublic 部分 D以上都不对9、关于常数据成员的说法,不正确的是( )。A常数据
4、成员的定义形式与一般常变量的定义形式相同,只不过常数据成员的定义必须出现在类体中B常数据成员必须进行初始化,并且不能被更新C常数据成员通过构造函数的成员初始化列表进行初始化D常数据成员可以在定义时直接初始化10、运用运算符delete删除一个动态对象时( )。A系统首先为该动态对象调用构造函数,再释放其占用的内存B系统首先释放该动态对象占用的内存,再为其调用构造函数C系统首先为该动态对象调用析构函数,再释放其占用的内存D系统首先释放动态对象占用的内存,再为其调用析构函数11、可以在类外用p.a的形式访问派生类对象p的基类成员a,其中a是( D )。A私有继承的公用成员 B公用继承的私有成员C公
5、用继承的保护成员 D公用继承的公用成员12、在公用继承方式下,有关派生类对象和基类对象的关系,不正确的叙述是( )。A派生类的对象可以赋给基类的对象B派生类的对象可以初始化基类的引用C派生类的对象可以直接访问基类中的成员D派生类的对象的地址可以赋给指向基类的指针13、设置虚基类的目的是( B )。A简化程序 B消除二义性 C提高运行效率 D减少目标代码14、在C+中,用于实现动态多态性的是( D )。A内联函数 B重载函数 C模板函数 D虚函数15、不能说明为虚函数的是( )。A析构函数 B构造函数 C类的成员函数 D以上都不对16、如果一个类至少有一个纯虚函数,那么就称该类为( )。A抽象类
6、 B派生类 C纯基类 D以上都不对17、下面关于友元的描述中,错误的是( )。A友元函数可以访问该类的私有数据成员B一个类的友元类中的成员函数都是这个类的友元函数C友元可以提高程序的运行效率D类与类之间的友元关系可以继承18、下列运算符中,( )运算符在C+中不能被重载。A& B C: Dnew19、模板的使用实际上是将类模板实例化成一个( )。A函数 B对象 C类 D抽象类20、假定MyClass为一个类,则该类的拷贝构造函数的声明语句为( )。AMyClass(MyClass x) BMyClass&(MyClass x)CMyClass(MyClass &x) DMyClass(MyCl
7、ass *x)二、填空题(前16个空,每空1分,后2个空,每空2分,共20分)1、类和对象的关系可表述为:类是对象的 ,而对象则是类的 。2、在C+中,三种继承方式的说明符号为 、 和 ,如果不加说明,则默认的继承方式为 。3、如果只想保留公共基类的一个复制,就必须使用关键字 把这个公共基类声明为虚基类。4、若要把void fun()定义为类A的友元函数,则应在类A的定义中加入语句 。5、类的静态成员分为 和 。6、运算符重载要求保持其原来的操作数个数、 、 和语法结构。7、通过关键字 可以声明模板,通过关键字 指定函数模板的类型参数,有几个类型参数就有几个类型关键字。8、列出C+中两种用户自
8、定义的数据类型: 、 。9、构造函数的作用是 。10、后置自增运算符“+”重载为类的成员函数(设类名为A)的形式为 。三、阅读下面3个程序,写出程序运行时输出的结果:(共13分)1、#includeusing namespace std;void fun(int &a,int &b) int p; p=a; a=b; b=p;void exchange(int &a,int &b,int &c) if(ab)fun(a,b); if(ac)fun(a,c); if(bc)fun(b,c);int main() int a=12,b=89,c=56; exchange(a,b,c); couta
9、=a,b=b,c=cendl; return 0;2、#include using namespace std;class Date public: Date(int,int,int); Date(int,int); Date(int); Date(); void display(); private: int month, day, year; ; Date:Date(int m,int d,int y):month(m),day(d),year(y) Date:Date(int m,int d):month(m),day(d) year=2009; Date:Date(int m):mon
10、th(m)day=1; year=2010; Date:Date() month=1; day=1; year=2010; void Date:display()coutmonth/day/yearendl; int main() Date d1(12,31,2009); Date d2(12,31); Date d3(1); Date d4; d1.display(); d2.display(); d3.display(); d4.display(); return 0; 3、#include using namespace std;class A public: A()coutconstr
11、ucting A endl; A()coutdestructing A endl;class B: public A public: B()coutconstructing B endl; B()coutdestructing B endl;class C : public B public: C()coutconstructing C endl; C()coutdestructing C endl;int main() C c1; return 0;四、编程题(共27分)1、(10分) 已知复数类Complex的声明如下:class Complexpublic: Complex(); /无参
12、构造函数 Complex(double ); /转换构造函数Complex(double, double);/有两个形参的构造函数 friend Complex operator+(Complex&, Complex&); /对“+”运算符进行重载 friend ostream& operator(ostream&, Complex&); /对“(istream&, Complex&); /对“”运算符进行重载private: double real,imag;要求:(1)写出该类的所有构造函数的类外定义代码。 (2)写出对运算符“+”、“”进行重载的运算符重载函数的定义。2、(17分)下列S
13、hape类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。class Shapepublic:virtual double area()=0;double total(Shape *s , int n) double sum=0.0; for(int i=0; iarea( );return sum; 要求:(1)从Shape类派生圆类(Circle)、正方形类(Square),圆类新增数据成员半径(radius),正方形类新增数据成员边长(a),圆类和正方形类都有构造函数,修改、显示数据成员值的函数,求面积函数。 (
14、2)写出main()函数,计算半径为5.5的圆和边长为9.9的正方形的面积和(必须通过调用total函数计算)。面向对象程序设计C+期末考试试卷(B)标准答案班级: 姓名: 学号: 分数: 题号一二三四总分得分一、单项选择题(每小题2分,共40分)1-5D A C A D 6-10D B C D C 11-15D C B D B 16-20A D C C C二、填空题(前16个空,每空1分,后2个空,每空2分,共20分)1 抽象 、 实例 2 public 、 private _ _、 protected 、 private _ _3 virtual _ 4 friend void fun(A
15、 &a) _5 静态数据成员 、 静态成员函数 6 结合性 、 优先级_ _7 Template 、 class(或typename) 8 类 、 结构体 _9 在创建对象时初始化对象的数据成员 _10 A operator+(int) _三、阅读程序(共13分)1、a=89,b=56,c=122、12/31/2009 12/31/2009 1/1/2010 1/1/20103、constructing Aconstructing Bconstructing Cdestructing Cdestructing Bdestructing A四、编程题(共27分)1、(10分)Complex:Co
16、mplex()real=0;imag=0;Complex:Complex(double r)real=r;Complex:Complex(double r,double i)real=r;imag=i;Complex operator+(Complex &c1,Complex &c2) Complex c; c.real=c1.real+c2.real; c.imag=c1.imag+c2.imag; return c;ostream& operator (ostream& output,Complex& c) output(c.real+c.imagi) (istream& input,Co
17、mplex& c) coutc.realc.imag; return input;2、(17分)class Circle:public Shapepublic: Circle(double r)radius=r; void set() coutPlease input the value of the circle:radius; void show() coutthe radius of the circle=radiusa=a; void set() coutPlease input the value of a:a; void show() couta=aendl; double are
18、a()return a*a;private: double a;int main()Circle C(5.5);C.show();Square S(9.9);S.show();Shape *s=&C,&S;couttotal=total(s,2)endl;return 0;面向对象程序设计C+期末考试试卷 一、选择题(每小题3分,共48分。)01、下列关于C+函数的叙述中,正确的是( C )。 A)每个函数至少要具有一个参数 B)每个函数都必须返回一个值 C)函数在被调用之前必须先声明 D)函数不能自己调用自己02、下列关于类和对象的叙述中,错误的是( A )。 A)一个类只能有一个对象 B)
19、对象是类的具体实例 C)类是对某一类对象的抽象 D)类和对象的关系是一种数据类型与变量的关系03、在C+中,用于实现运行时多态性的是(D )。 A)内联函数 B)重载函数 C)模板函数 D)虚函数04、下列关于运算符重载的叙述中,正确的是(B )。 A)通过运算符重载,可以定义新的运算符 B)有的运算符只能作为成员函数重载 C)若重载运算符+,则相应的运算符函数名是+ D)重载二元运算符时,必须声明两个形参05、对于语句 coutxendl;错误的是描述是(D )。 A)“cout”是一个输出流对象 B)“endl”的作用是输出回车换行 C)“x”是一个变量 D)“”称作提取运算符06、有如下
20、类声明,则类MyDERIVED中保护的数据成员和成员函数的个数是( )。 class MyBASE private: int k; public: void set(int n) k=n; int get( )const return k; ; class MyDERIVED: protected MyBASE protected: int j; public: void set(int m, int n) MyBASE:set(m); j=n; int get( ) const return MyBASE:get( )+j; ;A)4 B)3 C)2 D)107、已知在一个类体中包含如下函数
21、原型: Volume operator-(Volume)const;,下列关于这个函数的叙述中,错误的是( B )。 A)这是运算符-的重载运算符函数 B)这个函数所重载的运算符是一个一元运算符 C)这是一个成员函数 D)这个函数不改变类的任何数据成员的值08、执行如下的程序段后,输出结果是( C )。 cout.fill(*); cout.width(6); cout.fill(#); cout 123 endl; A)#123 B)123# C)*123 D)123*09、在下列函数原型中,可以作为类AA构造函数的是(B )。 A)void AA(int); B)int AA(); C)A
22、A(int)const; D)AA(int);10、下面四个选项中,( A)是用来声明虚函数的。 A)virtual B)public C)include D)using namespace11、实现运行时的多态性要使用( D )。 A)重载函数 B)构造函数 C)析构函数 D)虚函数12、要实现动态联编,必须通过( )调用虚函数。 A)对象指针 B)成员名限定 C)对象名 D)派生类名13、以下( C )成员函数表示纯虚函数。 A)virtual int vf(int); B)void vf(int)=0; C)virtual void vf()=0; D)virtual void vf(i
23、nt)14、有如下类声明:class XA private: int x; public: XA(int n) x=n; ; class XB: public XA private: int y; public: XB(int a,int b); ; 在构造函数XB的下列定义中,正确的是( )。 A)XB:XB(int a,int b): x(a),y(b) B)XB:XB(int a,int b): XA(a),y(b) C)XB:XB(int a,int b): x(a),XB(b) D)XB:XB(int a,int b): XA(a),XB(b) 15、在表达式 x+y*z中, + 是
24、作为成员函数重载的运算符,* 是作为非成员函数重载的运算符。则 operator+ 有 个参数,operator* 有 参数。( ) A)2、2 B)2、1 C)1、2 D)1、116、应在下列程序划线处填入的正确语句是( )。 class Base public: void fun()coutBase:funendl; ;class Derived:public Base void fun() /显示调用基类的函数fun() coutDerived:funfun();二、填空题(每空2分,共20分。)17、继承、多态性18、友元19、私有20、private或私有21、成员、友元22、wid
25、th/setw23、抽象类17、面向对象程序设计有四个主要特点,即抽象、封装、_多态性_和_继承性_。18、非成员函数应声明为类的_友元_函数才能访问这个类的private成员。19、派生类中的成员不能直接访问基类中的_私有、成员。20、在用class定义一个类时,数据成员和成员函数的默认访问权限是私有。21、运算符重载函数可能是类的_友元_函数,也可以是类的_成员_函数,还可以是普通函数。22、用流对象的成员函数控制输出格式时,用于设置字段宽度的流成员函数的名称是_width_,与之作用相同的控制符名称是_setw_。23、含有纯虚函数的类称为_抽象类。三、程序的填空、程序的执行(每题4分,
26、共20分。)24、以下程序是定义一个计数器类counter,对其重载运算符“+”,请填空。class counter private: int n; public: counter() n=0; counter(int i)n=i; _ /运算符重载函数 counter t; t.n=n+c.n; return t; void disp() coutn=nendl;void main() counter c1(5),c2(10),c3; c3=c1+c2; c1.disp(); c2.disp(); c3.disp(); 25、下列程序的输出结果为2,请将程序补充完整。class Base p
27、ublic: _ void fun() cout1; ;class Derived: public Base public: void fun( ) coutfun( ); delete p; return 0; 26、写出执行下面程序的输出结果。void fun(int &x, int y) int t=x; x=y; y=t; int main( ) int a2 = 23, 42; fun(a1,a0); std:couta0,a1std:endl; return 0; 27、写出执行下面程序的输出结果。class A public: A() coutA; ;class B public
28、: B() coutB; ;class C : public A B b; public: C() coutC; ;int main( ) C obj; return 0; 28、写出执行下面程序的输出结果。class Base private: char c; public: Base(char n):c(n) virtual Base()coutC; ; class Der:public Base private: char c; public: Der(char n):Base(n+1),c(n) Der()coutC; ; int main() Der(X); return 0; 四、
29、编程题(12分)29、编写一个程序计算“三角形、正方形、圆形”三种图形的面积,要求:a)抽象出一个基类base;b)在其中说明一个虚函数用来求面积;c)利用派生类定义“三角形、正方形、圆形”;d)编写主函数并测试。参考答案一、选择题(每小题3分,共48分。)01-05 C A D B D06-10 B B A D A11-16 D A C B C C三、程序的填空、程序的执行(每题4分,共20分。)24、counter operator + (counter c)25、virtual26、23,2327、ABC28、XY四、编程题(12分)29、#include using namespace
30、 std;class base public: virtual float area() const return 0; ;class triangle: public base protected: float bian,height; public: triangle(float a=0, float h=0) bian=a; height=h; virtual float area() const return bian*height/2; ;class square: public base protected: float bian; public: square(float a=0
31、) bian=a; virtual float area() const return bian*bian; ;class circle: public base protected: float radius; public: circle(float r=0) radius=r; virtual float area() const return 3.14*radius*radius; ;int main() triangle t(3,4); square s(5); circle c(2); base *p; p=&t; couttriangles area:area()endl; p=
32、&s; coutsquares area:area()endl; p=&c; coutcircles area:area()str; 执行时,从键盘输入:Microsoft Visual Studio 6.0!所得的结果是str=( )。A. Microsoft Visual Studio 6.0! B. MicrosoftC. Microsoft Visual D. Microsoft Visual Studio 6.04、考虑下面的函数原型声明:void testDefaulParam(int a,int b=7,char z=*);下面函数调用中,不合法的是( )。A. testDefa
33、ulParam(5); B. testDefaulParam(5,8);C. testDefaulParam(5,#); D. testDefaulParam(0,0,*);5、下列语句中,将函数int sum(int x, int y)正确重载的是( )。A. float sum(int x, int y); B. int sum(int a, int b);C. float sum(float x, float y); D. double sum(int y, int x);6、下列表示引用的方法中,( )是正确的。已知:int a=1000;A. int &x=a; B. char &y
34、; C. int &z=1000; D. float &t=&a;7、在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用( )。A. 内联函数 B. 重载函数 C. 递归调用 D. 嵌套调用8、下列有关C+类的说法中,不正确的是( )。A. 类是一种用户自定义的数据类型B. 只有类中的成员函数或类的友元函数才能存取类中的私有成员C. 在类中,如果不做特别说明,所有成员的访问权限均为私有的D. 在类中,如果不做特别说明,所有成员的访问权限均为公用的9、已知X类,则当程序执行到语句:X array3;时,调用了( )次构造函数。A. 0 B. 1 C. 2 D. 310、下面说法中,正确的是( )A. 一个类只能定义一个构造函数,但可以定义多个析构函数B. 一个类只能定义一个析构函数,但可以定义多个构造函数C. 构造函数与析构函数同名,只要名字前加了一个求反符号()D. 构造函数可以指定返回类型,而析构函数不能指定任何返回类型,即使是void类型也不可以11、已知:print( )函数是一个类的常成员函数,它无返回值,下列表示中,( )是正确的。 A. void print( ) const; B. const void print( ); C. void const print( ); D. void print(const);12、下面描述