面向对象程序设计(总练习与答案)_第1页
面向对象程序设计(总练习与答案)_第2页
面向对象程序设计(总练习与答案)_第3页
面向对象程序设计(总练习与答案)_第4页
面向对象程序设计(总练习与答案)_第5页
已阅读5页,还剩260页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大学考试试题纸(A卷)

(2007-2008学年第1学期)

一、简答题(每小题5分,共20分)

1、什么是类?什么是对象?对象与类的关系是什么?

2、构造函数和析构函数的主要作用是什么?他们各有什么特性?

3、有哪几种继承方式?每种方式的派生类对基类成员的继承性如何?

4、简要叙述友元运算符函数和成员运算符函数有什么不同点?

二、选择题(每小题2分,共20分)

1.假设已经有定义constchar*pName="Student”;下面的语句借误的是。

A.pName[3]='T;B.pName="score”;

C.pName=newchar[5];D.pName=newchar(,p');

2.在下面有关对构造函数的描述中,错误的是。

A.构造函数可以带有返回值

B.构造函数的名字与类名完全相同

C.构造函数可以带有参数

构造函数可以缺省

3.在下面有关析构函数特征的描述中,正确的是。

A.一个类中可以定义多个析构函数

B.析构函数名与类名完全相同

C.析构函数不能指定返回类型

D.析构函数可以有一个或多个参数

4.假定AB为一个类,则执行“ABa(4),b[3],*p[2]丁语句时,自动调用该类构造函数的次数

为。

A.3B.4C.6D.9

5.假定要对类AB定义加号操作符重载成员函数,实现两个AB类对象的加法,并返回相加结果,

则该成员函数的声明语句为。

A.ABoperator+(AB&a,AB&b)B.ABoperalor+(AB&a)

C.operator+(ABa)D.AB&operator+()

6.假设定义了函数模版:

template<classT>

Tmax(Tx,Ty){return(x>y)?x:y;}

并定义了:inti;chare;那么下列错误的调用该模版的是。

A.max(i,i);B.max(c,c);

C.max(int(c),i);D.max(c,i);

7.模版的主要用途是为了。

A.提高代码的运行效率

B.实现多态性

C.提高代码的重用性

D.加强类的封装性

8.下列说法错误的是。

A.中明为指向基类对象的指针可以指向它的公有派生的对象,但不允许指向它的私有派生的对象

B.允许将一个声明为指向基类的指针指向其公有派生类的对象,但是不能将一个声明为指向派生类

对象的指针指向其基类的一个对象。

C.声明为指向基类对象的指针,当其指向公有派生类对象时,只能用它来直接访问派生类中从基类

继承来的成员,而不能直接访问公有派生类中定义的成员

D.以上说法都不对

9.现有程序如下:

#includc<iostream.h>

#include<iomanip.h>

voidmain(){

intkk=1234;

cout«setfill(4*,)<<setw(6)<<kk«endl;

cout«kk«cndl;

)

以上程序的运行结果是。

A.1234B.**1234C.**1234D.以上都不对

12341234**1234

10.在公有继承的情况下,基类成员在派生类中的访问权限。

A.受限制B.保持不变C.受保护D.不受保护

三、填空题(每空1分,共10分)

1、定类AB中有个公有属性的静态数据成员bb,在类外不通过对象名访问该成员bb的写法

为⑴O

2、通常情况下,当创建派生类对象时,首先执行(2)的构造函数,随后再执行(3)的

构造函数,当撤销派生类对象时,则先执行(4)的析构函数,随后再执行(5)的析构

函数。

3、ios类中有几个成员函数可以用来对输入输出进行格式化控制,格式控制主要是通过对(6)的

操作来完成的。

4、所谓赋值兼容规则是指在需要基类对象的任何地方都可以使用(7)来替代。

纯虚函数是•个在基类中说明却没定义的虚函数,但要求在它的派生类中必须定义自己的版本,或

重新说明为纯虚函数。那么,纯虚函数的定义形式为(8)o

5、分别写出类AB的单目运算符的前缓方式和后缀方式的友元函数重载一般形

式:(9)、(10)o

四、写出下面程序的运行结果(每小题5分,共20分)

1、#include<iostream.h>

classBase{

public:

Base(){cout«"Constructingbaseclass\n";}

-Base(){cout«"Destructingbaseclass\n":)

);

classDerive:publicBase{

public:

Derive(){cout«"Constructingderivedclass\n";};

-Derive(){cout«"Destructingderivedclass\n”;};

private:

Basea;

);

voidmain(){

Deriveop;

)

2^#include<iostream.h>

classBasef

public:

voidshow(){

cout«"ThisisBaseclass"«endl;

)

);

classDerive:publicBasc)

public:

voidshow(){

cout«"ThisisDerivedclass"«endl;

)

};

voidmain(){

Baseobj,*pBase;

DeriveD_obj;

pBase=&obj;

pBase->show();

pBase=&D_obj;

pBase->show();

)

3、#include<iostream.h>

intarr[]={23,25,27,29,31);

int&get_value(inli){

returnarr[i];

)

voidmain(){

inti;

cout«get_value(3)«endl;

get_value(2)=50;

for(i=0;i<5;i++)

cout«get_vaIue(i)«^^“;

)

4^#include<iostream.h>

classcomplex{

public:

complex(intr,inti):real(r),imag(i){)

friendcomplexoperator++(complex&);

friendcomplexoperator"(complex);

voidprint(){

cout«"("«real«",,'«imag«"),'«endl;

private:

intrcaljmag;

);

complexoperator++(complex&o){

o.real++;

o.imag++;

returno;

complexoperator—(complexo){

o.real-;

o.imag—;

returno;

voidmain(){

complexa(l,2),b(3,4);

++a;

a.print();

--b;

b.print();

五、编程题(每小题10分,共30分)

1、建立一个Student类,含有私有的学号(字符型)、姓名(字符型)、年龄(整型)数据成员。用

new自动为Student的对象分配内存,并将学号“0504020101”,姓名“张三”,年龄20存入内存的相

应域中,把该的信息显示出来。

2、建立普通的基类building,用来存储一座楼房的层数、房间数以及它的总面积数。建立派生类house,

继承building,并存储下面的内容:卧室与浴室的数量,另外,建立派生类office,继承building,

并存储灭火器与电话的书面。在主程序中,分别建立对象显示各对象所有的数据成员。

3、为Date类重载运算符,实现在某一个日期上(年、月、日)加一个天数。

试题参考答案及评分细则

(2007-2008学年第1学期)

一、简答题(每小题5分,共20分)

1.答:类就是相同的数据和相同的一组对象的集合,即,类是对具有相同数据结构和相同操作的一

类对象的描述;对象是描述其属性的数据以及对这些数据施加的•组操作封装在•起构成的统•体,

对象可以认为是:数据+操作;类和对象之间的关系是抽象和具体的关系。

2.答:构造函数主要用于为对象分配空间,进行初始化。构造函数除了具有一般成员函数的特征外,

还具有•些特殊的性质:(1)构造函数的名字必须与类名相同(2)构造函数可以有任意类型的参数,

但不能指定返回类型。它有隐含的返回值,该值由系统内部使用。(3)构造函数是特殊的成员函数,

函数体可写在类体内,也可写在类体外。(4)构造函数可以重载,即一个类中可以定义多个参数个数或

参数类型不同的构造函数。(5)构造函数被声明为公有函数,但它不能像其他成员函数那样被显式地

调用,它是在定义对象的同时被调用的。

析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于撤消对象时的一些清理

任务,如释放分配给对象的内存空间等。析构函数有以下一些特点:3)析构函数与构造函数名字相

同,但它前面必须加一个波浪号(~);(2)析构函数没有参数,也没有返回值,而且不能重载。因此在一

个类中只能有一个析构函数;(3)当撤消对象时,编译系统会自动地调用析构函数。

3.答:三种继承方式(公有public、保护protected、私有private);继承性可参见教材P143。

4.答:(1)对双目运算符而言,成员运算符函数带有一个参数,而友元运算符函数带有两个参数;对单

目运算符而言,成员运算符函数不带参数,而友元运算符函数带一个参数。(2)双目运算符一般可

以被重载为友元运算符函数或成员运算符函数,但某些情况,必须使用友元函数。

二、选择题(每小题2分,共20分)

1—10.AABBBCCDBB

三、填空题(每空1分,共10分)

(1)AB::bb(2)基类(3)派生类(4)派生类(5)基类(6)状态标志字(7)公有派生类

对象(8)virtual函数类型函数名(参数表)=0;(9)ABoperator++();(10)ABoperator++(int);

四、写出下面程序的运行结果(每小题5分,共20分)

1.

Constructingbaseclass

Constructingbaseclass

Constructingderivedclass

Destructingderivedclass

Destructingbaseclass

Destructingbaseclass

2.ThisisBaseclass

ThisisBaseclass

3.29

2325502931

4.(2,3)

(3,4)

五、编程题(每小题10分,共30分)

2006-2007学年第1学期

2005级《C++面向对象程序设计》期末考试试题(A卷)

◊本试卷满分100分;

令请将答案写在答题纸上,写明题号,不必抄题,字迹工整、清晰;

令请在答题纸和试题纸上都写上你的班级,学号和姓名,交卷时请将试题纸、答题纸和草纸

•并交上来。

・、单选题(共10分,每题I分)

1.C++中解决命名冲突的机制是:D

(A)虚基类(B)虚函数(C)函数重载(D)名字空间

2.若类A的•个对象所占的内存空间中包含虚函数表的入口地址,则:C

(A)类A不能有静态数据成员(B)类A中公有的成员函数一定是虚的

(C)类A中至少有一个成员函数是虚的(D)类A的析构函数•定是虚的

3.任意•个类,析构函数的个数最多是:B

(A)不限个数(B)1(C)2(D)3

4.下列关于this指针的说法,哪个是正确的:

(A)this指针一定指向常量型数据(B)this指向的数据不可更改

(0静态成员函数中也可以访问this指针(D)this指针本身可直接作为成员函数的返回值

5.在类定义中,为说明成员的访问权限,private,protected,public可以出现次数为:A

(A)次数没有具体限定(B)每种至多一次

(C)public至少一次(D)每种至少一次

6.下面哪种定义方式是正确的,并且使得p可以作为函数voidf(A*constpp);的实参:A

(A)A*p二newA;(B)Aa;A*p=a;

(C)constA*p=newA;(D)Aa;constA*p=a;

7.obj是类A的■个对象,执行语句constA&aA=obj;,则下列说法正确的是:C

(A)类A的拷贝构造函数会被调用(B)类A的赋值函数会被调用

(C)&aA的值就是&obj(D)语句。bj.f();等价于语句aA.f();

8.下面关于访问类A的私有数据成员的说法,错误的是:C

(A)类A的友元函数可以访问类A的私有成员。

(B)类A的友元类中的非静态成员函数可以访问类A的私有成员。

(0类A的嵌套类中的非静态成员函数可以访问类A的私有成员。

(D)类A中的非静态成员函数可以访问类A的私有成员。

9.类A中有唯一的一个成员函数f,且f是公有的静态或非静态成员函数,对于类A的一个对

象a,执行语句a.f(100);成功,那么f的函数原型不可以是:B

(A)A&f(int,int=50);(B)voidf(int&);

(C)constA*f(constint);(D)Af(constint&);

10.卜.面关于类的成员函数描述不正确的是:A

(A)静态成员函数内可以直接访问类的非静态成员数据

(B)静态成员函数内可以直接访问类的静态成员数据

(0非静态成员函数可以直接访问类的非静态成员数据

(D)非静态成员函数可以直接访问类的静态成员数据(全局成员)

二、判断正误,对于你认为错误的论述,说明原因或举出反例。(每题2分,共20分)

1.重载流操作符<〈和〉时,如果第一个参数的类型为。stream和istream,那么这个重载函数既

可以用于标准输入输出流,也可以用于文件流上。

对,ostream和istream是标准输入输出流、文件流、字符串流的基类

2.在同一个类中,可以定义重载的成员函数voidf(int);和virtualvoidf(int);o

错,这属于重复定义

3.抽象类不会产生实例,所以不需要有构造函数。

错,被派生时需要它的构造函数

4.类A有一个非静态的成员函数f,其函数原型是:voidA::f()const,则该函数被调用时',一

定是通过类A或类A的某后裔类的一个用const修饰符说明的常量对象调用的。

错,常函数可以由变量对象或常量对象调用

5.异常必须在其产生的当前函数中捕获,而不能在外层函数中捕获该异常。

错,可以在外层捕获,并且这是最常见的用法

6.只要程序中没有Aal=a2;和Aal(a2);形式的代码,类A的拷贝构造函数就不会被调用。

错,参数传递或函数返回时也调用拷贝构造函数

7.在protected继承方式下,派生类对象的指针不能直接转换成指向基类对象的指针。

对,否则基类中的公有成员由不可见变为可见,权限被放大

8.若静态成员函数中调用了一个函数f,那么f一定不是虚函数。

对,静态成员函数不能是虚函数,因为虚函数入口需要在保存在对象中的虚函数

表中,而静态成员函数不属于对象,

9.若要实例化一个含有引用型数据成员的类,那么只能使用构造函数初始化列表来初始化该数据

成员。

对,没有别的办法

10.构造函数的函数体中,不能使用return语句;但在实现该类的自动类型转化函数时,必须有

return语句。

三、回答下列各题(每题4分,共20分)

1.举例说明static关键字的用法和相应目的(至少3种)。

f(){staticinta;…}函数体内的静态变量,每次调用该函数时值保持不变

staticinta;全局的静态变量,约束作用域为所在文件

classA{staticinta;…};A的静态成员,类似全局变量,需用A::a访问

2.举例说明类的数据成员在哪些情况下必须在初始化列表中进行初始化(至少3种)。

基类不提供无参的构造函数

成员对象不提供无参的构造函数

有常量成员或引用成员

3.举例说明虚拟继承的作用和目的。

虚拟继承的目的是使基类在派生类中只保留一个副本

从而避免二义性

4.举例说明成员函数A&f()const;和成员函数A&f();的区别。

A&f()const是常函数,隐含的this指针是常指针,因此在f中不能修改对象成员的值。

举例略

5.有类A的对象a,任意给出一种解决方案,使得程序支持下面的表达式:

a=10+a;

classA{

A(int);〃转换构造函数

friendconstAoperator+(constA,constA);〃重载+

};

四、指出卜.列程序代码中存在的错误或不足,说明原因。(每题5分,共10分)

ttinclude<iostream.h>classB:publicAvoidmain()

classA{{{

public:public:A*p=newB;

virtual〜A(){)virtualvoidg()p->f();

virtualvoidf(){cout«*B::g()*«endp->g();

{cout<<z,A::f()*«endl;1;}p->k();

)virtualvoidk()deletep;

virtualvoidg())

{cout<<"B::k()"<Xendl;}

{cout«*A::g()*«endl;});

};

答:函数k在A中没有定义,执行p->k();时要根据p的类型在A中查k的信息

2.

#include<iostream.h>classA{

#include<string.h>public:

classA;"A(){}

classB:publicA{virtualvoidoutput())

public:};

B(constchar*info){voidmainO

m_buf=newchar[256];{

strcpy(mbuf,info);}A*pa=newB("hello!”)

~B(){delete[]m_buf;}pa->output();

virtualvoidoutput(){cout<<deletepa;

mbuf;})

private:

char*m_buf;};

答:A的析构函数应定义为虚函数,否则B的析构函数不会被调用,m_buf也不会被释放

五、写出下面程序的运行结果(每题5分,共10分)

1.

^include<iostream.h>classB:publicA{voidmain()

classA{public:(

public:"B(){—count;(

A():count(1){}Out();}Bb;

virtual~A(){}virtualA*Copy()const{A*al=&b;

virtualA*Copy()const=B*p=newB(*this);al->0ut();

0;++p->count;al=al->Copy();

virtualvoidOut()constreturnp;al->0ut();

=0;}deleteal;

protected:virtualvoidOut()const}

intcount;{cout«count«endl;})

);};

答:

1

2

1

0

2.

ttinclude〈iostream.h>classB:publieA{

classA{public:

public:B(A&a):obj(a),A(l){)

A(intn):num(n){Out();}voidOut(){obj.Out();}

A(constA&rhs):num(rhs.num)private:

(Out();}Aobj;

voidOut(){cout«num«endl;});

public:voidmain(){

intnum;Aa(8);

};Bbl(a);

Bb2(bl);

b2.Out();

)

答:

8

1

8

1

8

8

六、阅读下面两个类的定义和部分实现弋码,完成3个I'nJ题。(共10分)

#inc1ude<iostream.h>classB{intmain()

classA{public:{

public:B(intn);Bbid);

A(intn):value(n){}voidDisplay()constbl.Display();

voidDisplay()const{aA.Display();}Bb2(2);

{cout«*Value=private:b2.Display();

/,<<value<<endl;}AaA;return0;

private:};}

intvalue;

);

1.[3分]实现类B的构造函数,使得程序的输出为:

Value=1

Value=2

答:B(intn):aA(n)

2.[3分]若main函数中增加了语句Bb3(bl);针对本例,说明是否有必要以公有方式自定义并实

现类B的拷贝构造函数,为什么?

答:不需要,因为类B及基类A中不存在引用或指针成员,使用默认的拷贝构造函数就可以。

3.[4分]在不改动类A和main函数的前提下,以继承的方式重新定义并实现类B,使得程序的输

出结果不变。

答:

classB:publicA{

public:

B(intn):A(n);

voidDisplay()const

{A::Display();}

);

七、(共20分,每问题10分)某程序员为了灵活地对各种的给定的曲线函数f(x)画出其曲线图形,

设计并部分实现了一个曲线类curve,该类的成员数据中,count代表坐标点的个数,pxs代表的数

组存放这些坐标点的横坐标,pys代表的数组存放利用f(x)计算得到的这些坐标点的纵坐标。由于

不同曲线的计算公式f(x)是不同的,该程序员希望曲线函数的种类可以通过继承curve类的方式任

意增加,增加一个新的f(x)时不改变curve类中的内容,也不改变利用curve类进行图形绘制的算

法。已部分完成的curve类定义和实现如下:

classcurve{

public:

voidsetPxs(){/*把获取的横坐标数据存放在pxs代表的数组中,并为count置值*/)

double*getPxs()const(returnpxs;}

intgetCount()const{returncount;)

double*getPys()const;

private:

double*pxs;

double*pys;

intcount

);

1、请按照该程序员的设计意图给出成员函数gelPys的完整实现。实现过程中,可以为curve类增

加其它成员。可以假设setPxs函数已经完整实现,不需要考虑曲线的绘制和显示。

答:

classcurve{

public:

voidsetPxs(){/*把获取的横坐标数据存放在pxs代表的数组中,并为count置值*/}

double*getPxs()const{returnpxs;}

intgetCount()const{returncount;)

double*getPys()const;

virtualdoublef(double)=0;

private:

double*pxs;

double*pys;

intcount

};

double*curve::getPys()const

(

if(pys==NULL)pys=newdouble[count];

for(inti=0;i<count;i++)

pys[i]=f(pxs[i]);

returnpys;

)

注:严格来讲,还应在析构函数中释放pxs和pys,但这部分不作为要考的语法点,

故此处略掉

2^以曲线函数:f(x)=3*x*x+2*x+l.为例,从curve派生一个类curvel,并用文字说明其它的函数

(如:main函数)如何利用基类curve中的getPys函数获取该曲线的纵坐标值。

答:

classcurve1:publiccurve

(

virtualdoublef(doublex){return3*x*x+2*x+l;}

};

《面向对象程序设计C++》期末考试试卷(A)

班级:姓名:学号:分数:

试卷说明:本套试题共四个大题,全部题目都答在答题纸上,写在其他地方均无效。

(答题纸在本套试卷的第10页上)

一、选择题(每小题2分,共40分)

1、C++是()o

A.面向对象的程序设计语言

B.面向过程的程序设计语言

C.既支持面向对象的程序设计又支持面向过程的程序设计的混合型语言

D.非结构化的程序设计语言

2、面向对象程序设计思想的主要特征中不包括()。

A.封装性B.多态性C.继承性D.功能分解,逐步求精

3、若定义:stringstr;当语句cin>>str;执行时,从键盘输入:

MicrosoftVisualStudio6.0!

所得的结果是st厂()o

A.MicrosoftVisualStudio6.0!B.Microsoft

C.MicrosoftVisualD.MicrosoftVisualStudio6.0

4、考虑下面的函数原型声明:voidtestDefaulParam(inta,intb=7,charz='*');

下面函数调用中,不合法的是()。

A.testDcfaulParam(5);B.testDefaulParam(5,8);

C.testDefaulParam(5,J#*);D.testDefaulParam(O,0,***);

5、卜列语句中,将函数intsum(intx,inty)正确重载的是()。

A.floatsum(intx,inty);B.intsum(inta,intb);

C.floatsum(floatx,floaty);D.doublesum(inty,intx);

6、下列表示引用的方法中,()是正确的。

已知:inta=1000;

A.int&x二a;B.char&y;C.int&z=1000;D.float&t=&a;

7、在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用()。

A.内联函数B.重载函数C.递归调用D.嵌套调用

8、下列有关C++类的说法中,不正确的是()o

A.类是一种用户自定义的数据类型

B.只有类中的成员函数或类的友元函数才能存取类中的私有成员

C.在类中,如果不做特别说明,所有成员的访问权限均为私有的

D.在类中,如果不做特别说明,所有成员的访问权限均为公用的

9、已知X类,则当程序执行到语句:Xarray[3]m『,调用了()次构造函数。

A.0B.1C.2D.3

10、下面说法中,正确的是()

A.一个类只能定义一个构造函数,但可以定义多个析构函数

B.一个类只能定义一个析构函数,但可以定义多个构造函数

C.构造函数与析构函数同名,只要名字前加了一个求反符号(〜)

D,构造函数可以指定返回类型,而析构函数不能指定任何返回类型,即使是void类型也不可以

11、已知:print()函数是一个类的常成员函数,它无返回值,卜列表示中,()是正确的。

A.voidprint()const;B.constvoidprint();

C.voidconstprint();D.voidprint(const);

12、下面描述中,表达错误的是()

A.公用继承时基类中的public成员在派生类中仍是public的

B.公用继承时基类中的private成员在派生类中仍是private的

C.公用继承时基类中的protected成员在派生类中仍是protected的

D.私有继承时基类中的public成员在派生类中是private^

13、设置虚基类的目的是()。

A.简化程序B.消除二义性C.提高运行效率D.减少目标代码

14、下面()的叙述不符合赋值兼容规则。

A,派生类的对象可以赋值给基类的对象

B.基类的对象可以赋值给派生类的对象

C.派生类的对象可以初始化基类的对象

D,派生类的对象的地址可以赋值给指向基类的指针

15、关于虚函数的描述中,()是正确的。

A.虚函数是一个static类型的成员函数

B.虚函数是一个非成员函数

C.基类中说明了虚函数后,派生类中与其对应的函数可不必说明为虚函数

D.派生类的虚函数与基类的虚函数具有不同的参数个数和类型

16、卜面关于友元的描述中,错误的是()。

A.友元函数可以访问该类的私有数据成员

B.•个类的友元类中的成员函数都是这个类的友元函数

C.友元可以提高程序的运行效率

D.类与类之间的友元关系可以继承

17、下列关于静态数据成员的说法,不正确的是()o

A.类中定义的公用静态数据成员,可以通过类的对象来访问

B.类中定义的所有静态数据成员,都必须在类外初始化

C.静态数据成员不是所有对象所共用的

D.普通的成员函数可以直接访问类中的静态数据成员

18、如果表达式++i*k中的“++”和“*”都是重载的友元运算符,若采用运算符函数调用格式,则

表达式还可以表示为()。

A.operator*(i.operator++(),k)B.operator*(operator++(i),k)

C.i.operator++().operator*(k)D.k.operator*(operator++(i))

19、下面对模板的声明,正确的是()o

A.template<T>B.template<classTl,T2>

C.template<classTl,classT2>D.template<classT1;classT2>

20、下列的各类函数中,()不是类的成员函数

A.构造函数B.析构函数C.友元函数D.复制构造函数

二、填空题(前14个空,每空1分,后3个空,每空2分,共20分)

1、类和对象的关系可表述为:类是对象的,而对象则是类的。

2、静态成员函数没有隐含的,所以,在C++程序中,静态成员函数主要用来访问静态数据

成员,而不访问非静态成员。

3、在图1中,A,B,C,D,E,F均是类,其中属于单继承的派生类有,属于多继承的派生

类有,类F的基类行,类A的派生类有o

ABC

图1类的继承层次图

4、如果只想保留公共基类的一个复制,就必须使用关键字把这个公共基类声明为虚基

类。

5、从实现的角度来讲,多态性可以划分为两类:和。

6、如果一个类包含一个或多个纯虚函数,则该类称为o

7、若要把voidfun()定义为类A的友元函数,则应在类A的定义中加入语句。

8、列出C++中的两种代码复用方式:和..

9、析构函数的作用是o

10、假定A是一个类名,则该类的拷贝构造函数的原型说明语句为:。

11、后置自增运算符“++”重载为类的成员函数(设类名为A)的形式为:。

三、阅读下面4个程序,写出程序运行时输出的结果。(共13分)

1、

#include<iostream>

usingnamespacestd;

voidfun(int&a,int&b)

{intp;

p=a;a=b;b=p;

)

voidexchange(int&a,int&b,int&c)

{if(a<b)fun(a,b);

if(a<c)fun(a,c);

if(b<c)fun(b,c);

)

intmainO

{inta=12,b=89,c=56;

exchcinge(a,b,c);

cout«*a=*<<a<<*,b=*«b«/*,c=//«c«endl;

return0;

)

2、

^include<iostream>

usingnamespacestd;

classA{

public:

A(){cout«"A〃;}

};

classB{

public:

B(){cout}

};

classC:publicA{

public:

C(){cout«"C";)

private:

Bb;

};

intmain(){

Cobj;

return0;

)

3、

ttinclude<iostream>

usingnamespacestd;

classA

(public:

A(){cout«z,A::A()called.\nz,;}

virtual〜A(){cout〈<"A::〜A()called.\n*;}

};

classB:publicA

(public:

B(inti)

{cout«z,B::B()called.\nz,;

buf=newchar[i];

)

virtual〜B()

{delete[]buf;

cout<X'B::'B()called.\n^;

)

private:

char*buf;

};

intmain()

{A*a=newB(15);

deletea;

return0;

)

4、

ttinclude<iostream>

usingnamespacestd;

classA

{public:

voidf0{cout<<z/CallA'sfunctionf()*«endl;}

);

classB

{public:

voidf(){cout«/zCallB'sfunctionf()*«endl;}

voidg(){cout«*CallB'sfunctiong()*«endl;}

};

classC:publicA,publicB

{public:

voidg()(cout<<?/Cal1C'sfunctiong()*«endl;}

);

intmainO

(Ccc;

cc.B::f();

cc.B::g();

cc.g();

return0;

)

四、编程题(27分)

1、(10分)已知复数类Complex的声明如下:

classComplex

(public:

Complex();〃无参构造函数

Complex(double);〃转换构造函数

Complex(double,double);〃有两个形参的构造函数

friendComplexoperator+(Complexft,ComplexA);//对”运算符进行重载

friendostream&operator«(ostream&,Complex&);〃对“<<”运算符进行重载

friendistream&operator»(istream&,Complcx&);〃对“>>”运算符进行重载

private:

doublereal,imag;

};

要求:(1)写出该类的所有构造函数的类外定义代码。

(2)写出对运算符“+”、“<<"、“〉>”进行重载的运算符重载函数的定义。

2、(17分)下列Shape类是一个表示形状的抽象类,area()为求图形面积的函数,total()则是•

个通用的用以求不同形状的图形面积总和的函数。

classShape

{public:

virtualdoublearea()=0;

};

doubletotal(Shape*s[],intn)

{doublesum=0.0;

for(inti=0;i<n;i++)sum+=s[i]->area();

returnsum;

要求:(1)从Shape类派生圆类(Circle)、正方形类(Square),圆类新增数据成员半径(radius),

正方形类新增数据成员边长(a),圆类和正方形类都有构造函数,修改、显示数据成员值的函数,

求面积函数。

(2)写出main。函数,计算半径为5.5的圆和边长为9.9的正方形的面积和(必须通过调用

total函数计算)。

《面向对象程序设计C++》期末考试试卷(A)标准答案

班级:姓名:学号:分数:

一、单项选择题(每小题2分,共40分)

1-5.CDBCC6-10.AADDB

11-15.ABBBC16-20.DCBCC

二、填空题(前14个空,每空1分,后3个空,每空2分,共20分)

1.抽象实例2.Ihis指针

3.ED、FA、B、C、D、ED、F

4.virtual5.静态多态性动态多态性

6.抽象类7.friendvoidfun(A&a)

8.继承组合或模板

9.在对象被系统释放之前做一些内存清理工作______________________________

10.A(constA&)11.Aoperator++(int)

三、阅读程序(13分)

I、a=89,b=56,c=12

2、ABC

3、A::A()called.

B::B()called.

B::“B()called.

A::〜A()called.

4、CallB'sfunctionf()

CallB'sfunctiong()

CallC'sfunctiong()

四、编程题(共27分)

1、(10分)

Complex::Complex(){real=0;imag-0;}

Complex::Complex(doubler){real=r;}

Complex::Complex(doubler,doublei){real=r;imag=i;}

Complexoperator+(Complex&cl,Complex&c2)

{Complexc;

c.real二cl.real+c2.real;c.imag=cl.imag+c2.imag;

returnc;

)

ostream&operator<<(ostream&output,Complex&c)

{output«A,(“«c.real«"+”<〈c.加ag«"i)"<<endl;

returnoutput;

)

istreamfeoperator»(istream&input,Complex&,c)

{cout«/zinputrealandimaginarypartofcomplexnumber:*;

input>>c.real»c.imag;

returninput;

)

2、(17分)

classCircle:publicShape

{public:

Circle(doubler){radius=r;}

voidset()

{cout«^Pleaseinputthevalueofthecircle:“«endl;

cin»radius;

)

voidshow()

{cout«z,theradiusofthecircle=*«radius<<endl;

doubleareaO{return3.14159*radius*radius;}

private:

doubleradius;

);

classSquare:pub1icShape

{public:

Square(doublea){this->a=a;}

voidset()

{cout〈<〃Pleaseinputthevalueofa:“<〈endl;

cin»a;

)

voidshow()

{cout«"a="<<a<<cndl;)

doublearea(){returna*a;}

private:

doub1ea;

};

intmainO

(

CircleC(5.5);

C.show();

SquareS(9.9);

S.show();

Shape*s[]={&C,&S};

cout«,,total=*«total(s,2)«endl;

return0;

)

《面向对象程序设计C++》期末考试试卷(B)

班级:姓名:学号:分数:

试卷说明:本套试题共四个大题,全部题目都答在答题纸上,写在其他地方均无效。

(答题纸在本套试卷的第8页上)

一、单项选择题(每小题2分,共40分)

1、关于C++与C语言关系的描述中,()是错误的。

A.C语言是C++语言的一个子集B.C语言与C++语言是兼容的

C.C++语言对C语言进行了一些改进D.C++语言和C语言都是面向对象的

2、已知:intm=10;下列表示引用的方法中,()是正确的。

A.int&x二m;B.int&y=10;C.int&z;D.float

考虑下面的函数原型声明:voidtestDefaulParam(inta,intb=7,charz=';

下面函数调用中,不合法的是()o

A.testDefaulParam(5);B.testDefaulParam(5,8);

C.testDefaulParam(5,*#*);D.testDefaulParam(0,0,***);

4、系统在调用重载函数时往往根据•些条件确定哪个重载函数被调用,在下列选项中,不能作为依

据的是()。

A.函数的返回值类型B.参数的类型C.函数名称D.参数个数

5、下列有关C++类的说法中,不正确的是()。

A.类是一种用户自定义的数据类型

B.只有类中的成员函数或类的友元函数才能存取类中的私有成员

C.在类中,如果不做特别说明,所有成员的访问权限均为私有的

D.在类中,如果不做特别说明,所有成员的访问权限均为公用的

6、已知X类,则当程序执行到语句Xarray[3];时,调用了()次构造函数。

A.0B.1C.2D.3

7、有关析构函数的说法,不正确的是()。

A.析构函数有且仅有•个

B.析构函数和构造函数一样可以有形参

C.析构函数的功能是在系统释放对象之前作一些内存清理工作

D.析构函数无任何函数类型

8、类定义的内容允许被其对象无限制地存取的是()o

A.private部分B.protected部分C.public部分D.以上都不对

9、关于常数据成员的说法,不正确的是()o

A.常数据成员的定义形式与一般常变量的定义形式相同,只不过常数据成员的定义必须出现在类

体中

B.常数据成员必须进行初始化,并且不能被更新

C.常数据成员通过构造函数的成员初始化列表进行初始化

D.常数据成员可以在定义时直接初始化

10、运用运算符delete删除一个动态对象时()。

A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论