湖北第二师范学院2014-2015学年度第一学期
课程考试试卷
(A卷)
课程名称:《面向对象程序设计》考试方式:闭卷(开卷、闭卷)院系:专业班级:
学生姓名:学号:
一、单项选择题(从下列各题备选答案中选出一个正确的答案,并将其选项
填在答题卡上,答在试卷上不得分。多选、选错或未选者不得分。每小题1
分,共30分)
1.有关类的说法不正确()。
A)类是用户自定义类型B)类中成员函数存取类的私有数据
C)在类中,不做特定说明成员为私有D)在类中,不做特定说明,成员为公有
2.在面向对象方法中,不属于“对象”基本特点的是()。
A)一致性
B)分类性
C)多态性
D)标识唯一性
3.面向对象方法中,继承是指()。
A)一组对象所具有的相似性质
B)一个对象具有另一个对象的性质
C)各对象之间的共同性质
D)类之间共享属性和操作的机制
4.下列选项中属于面向对象设计方法主要特征的是()。
A)继承
B)自顶向下
C)模块化
D)逐步求精
5.下面对对象概念描述正确的是()。
A)对象间的通信靠消息传递
B)对象是名字和方法的封装体
C)任何对象必须有继承性
D)对象的多态性是指一个对象有多个操作
6、下列关于对象初始化的叙述中,正确的是()
A)定义对象的时候不能对定义进行重载。
B)定义对象之后可以对显式地调用构造函数进行初始化。
C) 定义对象时将自动调用构造函数进行初始化。
D) 一个类中必须显式定义构造函数实现初始化。
7、若Myclass为一个类,执行Myclass a[4],*p[5],语句时会自动调用该类构造函数的次数是()
A)2
B)4
C)5
D)9
8、若在表达式中,“/”是作为成员函数重要的运算符,则该表达式还可以表示为()
A)x.operator/(y)
B)operator/(x,y)
C)y.operator/(x)
D)operator/(y,x)
9、若要重载“+、=、<<、==和[ ]”运算符,则必须作为类成员重载的运算符为()
A)+和=
B)=和<<
C)==和<<
D)=和[ ]
10、有函数模板声明和一些变量定义如下:
template
double d1,d2;
在下列调用中,错误的是()
A)sum
B)sum
C)sum
D)sum(d1,d2);
11、下面代码声明了3个类
class person{};
class Student:public Person{};
class Undergraduate:Student{};
下列关于这些类之间的关系描述错误的是()。D
A)类Person是类Undergraduate的基类
B)类Undergraduate从类Student公有继承
C)类Student是类Person的派生类
D)类Undergraduate 是类Person 的派生类
12、下面是关于类Shape的定义
class Shape{
public:
virtual void Draw()=0;
}
下面关于Shape 类的描述中,正确的是()
A)类Shape是虚基类
B)类Shape是抽象类
C)类Shape中的Draw函数声明有误
D) 语句“Shape s;”能够建立Shape的一个对象s
13、将运算符“+”重载为非成员函数,下列原型声明中,错误的是()
A)MyClock operator +(MyClock,long);
B)MyClock operator +( MyClock,MyClock);
C)MyClock operator +(long,long);
D)MyClock operator +(long,Myclock);
14、打开文件时,可以单独或组合使用下列文件模式打开
(1)ios_base::aop
(2)ios_base::binary
(3)ios_base::
(4)ios_base::out
若要以二进制读文件方式打开一个文件,则需要使用的文件打开模式为()
A)(1)(3)
B)(1)(4)
C) (2)(3)
D)(2)(4)
15、若是对类BigNumber 中重载的类型转换运算符long 进行声明,则下列选项正确的是()
A)operator long() const;
B)operator long(BigNumber);
C)long operator long() const;
D)long operator long(BigNumber);
16/有如下函数模板定义
template
T1 FUN(T2 n){return n*5.0;}
若要以int型数据9作为函数实参调用该模板,并返回一个double型数据则该调用表示为()
A)FUN(9)
B)FUN<9>
C)FUN
D)FUN<9>(double)
17、下列语句均是程序运行时的第一条输出语句,其中一条语句的输出效果与其他三条语句不同,该语句是()
A)cout< B)cout< C)cout< D)cout< 18、下列关于析构函数的说法,错误的是() A)析构函数可以重载 B)构造函数由系统自动调用 C)每个对象的析构函数只被调用一次 D)每个类都有析构函数 19、下列关于构造函数的描述中,错误的是() A)构造函数名与类名相同 B)构造函数可以有返回值 C)构造函数可以重载 D)每个类都有构造函数 20、若PAD是一个类,则程序运行时,语句“PAD(*ad){3};”调用PAD 的构造函数的次数是() A) 0 B) 1 C) 2 D) 3 21、下列关于文件流的描述中,正确的是() A)文件流只能完成指针对磁盘文件的输入、输出 B)建立一个文件流对象时,必须同时打开一个文件 C)若输入流要打开的文件不存在,将建立一个新文件 D)若输出流要打开的文件不存在,将建立一个新文件 22、下列关于派生类和基类的说法中,正确的是() A)派生类成员函数只能访问基类的公有成员 B)派生类只能访问基类基类的公有和保护成员 C)派生类成员函数可以访问基类的所有成员 D) 派生类对基类的默认继承方式为公有继承 23、生成派生类对象时,派生类构造函数调用基类构造函数的条件是() A)无需任何条件 B)基类中显式定义了构造函数 C)派生类中显式定义了构造函数 D)派生类构造函数明确调用了基类构造函数 24、下面描述中,错误的是() A)公有继承时基类的公有成员在派生类中仍是公有成员 B)公有继承时基类的保护成员在派生类中仍是保护成员 C)保护继承时基类的公有成员在派生类中仍是公有成员 D)保护继承时基类的保护成员在派生类中仍是保护成员 25、下列说法正确的是() A)类的静态数据成员不是类的所有对象共享的数据 B) 类的静态数据成员不能被类的成员函数调用 C) 类的静态数据成员不能被类的构造函数调用 D) 类的静态数据成员必须进行初始化 26、下面关于纯虚函数与抽象类的描述中,错误的是() A)纯虚函数是一种特殊的虚函数,它没有具体的实现 B)抽象类是纯虚函数的类 C)一个基类声明了纯虚函数,该基类的派生类一定不是抽象类 D)抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出 二、填空题(将答案填在答题卡上,答在试卷上不得分。每空1分,共20分) 31. 当保护继承时,基类的_ 成员在派生类中成为保护成员,派生类对象不能直接访问基类的_ 。 32. 将一个函数声明为一个类的友元函数时必须使用关键字。 33、从实现的角度划分,C++所支持的两种多态性分别是时的多态性和运行时的多态性。 34、设有定义语句int a=12,则表达式a*=2+3的运算结果为。 35、 三、程序改错题(请在不修改程序功能的基础上,在答题卡上写出错误的语句, 改正错误并指出错误原因,答在试卷上不得分。每小题5分,共10分) 1. 本程序需要输出的结果:number=1 number=10 numner=100, 每条注释的下面是出错的位置,在不修改程序的功能上,修改为正确的语句。 #include class TC { public: TC(int i) {number=i;} void Setnumber(int m) {number=m;} int Getnumber()const {return number;} void print() const {cout<<"number="< private: int number; }; void main() { //***********error***************** TC obj1; obj1.print(); TC obj2(3); //***********error***************** obj1.number=10; //***********error***************** TC.Setnumber(100); obj1.print(); obj2.print(); } 2、 四、看程序写结果题(在答题卡上写出下列程序段正确的结果,答在试卷上不 得分。每小题5分,共20分 1.#include using namespace std; class Complex { public: Complex(){real=0,imag=0;} Complex(double r,double i){real=r;imag=i;} Complex complex_add(Complex &c2); void display(); private: double real; double imag; }; Complex Complex::complex_add(Complex &c2) {Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; } void Complex::display() {cout<<"("< { Complex c1(8,40),c2(9,-1),c3; c3=https://www.wendangku.net/doc/a26250799.html,plex_add(c2); cout<<"c1="; c1.display(); cout<<"c2="; c2.display(); cout<<"c1+c2="; c3.display(); return 0; } 请写出程序运行的结果: 2、 3、 4、 五、编程题(在答题卡上写出正确的程序,答在试卷上不得分。每小题10分, 共20分) 1.请用C++写出一个程序,要求:用继承和多态性以及虚函数的相关知识,编写出基类Student,派生类Graduate,其中基类Student的成员有:学号num,姓名name,分数score,派生类Graduate的成员有:学号num 姓名name 分数score 工资wage。 最后输出的结果: num:1001 name:Li score:87.5 num:2001 name:Wang score:98.5 wage:1000 (两块信息之间空了两行) 下面给出程序部分 #include #include using namespace std; class Student { public: Student(int,string,float); virtual void display(); protected: int num; string name; float score; }; //下面请写出Student的构造函数的定义以及display成员函数的相关定义 class Graduate:public Student { public: Graduate(int,string,float,float); void display(); protected: float wage; }; / Graduate::Graduate(int n,string nam,float s,float w):Student(n,nam,s),wage(w){} void Graduate::display() {cout<<"num:"< //用指针的相关知识结合虚函数写出main函数部分的代码 int main() { } 第1章习题答案 名词解释 抽象:抽象(Abstract)就是忽略事物中与当前目标无关的非本质特征,而强调与当前目标有关的本质特征,从而找出事物的共性,并把具有共性的事物划为一类。面向对象方法中的抽象,是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。 封装:面向对象方法中的封装就是把将抽象出来的对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。 消息:消息是面向对象程序设计用来描述对象之间通信的机制。一个消息就是一个对象要求另一个对象实施某种操作的一个请求。 填空题 (1) 面向过程的结构化程序设计方法面向对象程序设计方法 (2) 顺序选择循环 (3) 程序=数据结构+算法程序=对象+消息 (4) 过程类 (5) 抽象性封装性继承性多态性 选择题 (1) B (2) C (3) D (4) C (5) D (6) A (7) A (8) B C (9) A D 判断题 (1) t (2) f (3) f (4)f (5) t (6) f (7) f (8) t 简答题 (1) 结构化程序设计方法着眼于系统要实现的功能,从系统的输入和输出出发,分析系统要做哪些事情,进而考虑如何做这些事情,自顶向下地对系统的功能进行分解,来建立系统的功能结构和相应的程序模块结构,有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。 随着程序规模与复杂性的增长,这种面向过程的结构化程序设计方法存在明显的不足之处。首先是数据安全性问题,由于数据被每个模块所共用,因此是不安全的,一旦出错,很难查明原因。其次是可维护性及可重用性差,它把数据结构和算法分离为相互独立的实体,一旦数据结构需要改变时,常常要涉及整个程序,修改工作量极大并容易产生新的错误。每一种相对于老问题的新方法都要带来额外的开销。另外,图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。 (2) 面向对象的程序设计方法中,将程序设计为一组相互协作的对象(Object)而不是一组相互协作的函数。在程序中,属性用数据表示,用来描述对象静态特征;行为用程序代码实现,用来描述对象动态特征。可见,在面向对象的程序设计方法中,对象是数据结构和算法的封装体。对象之间存在各种联系,它们之间通过消息进行通信。程序可表示为: 程序=对象+消息 在面向对象程序设计中,它着重于类的设计。类正是面向对象语言的基本程序模块,通过类的设计,来完成实体的建模任务。类通过一个简单的外部接口,与外界发生关系。一个类中的操作不会处理到另一个类中的数据,这样程序模块的独立性、数据的安全性就有了良好的保障。程序的执行取决于事件发生的顺序,由顺序产生的消息来驱动程序的执行。不必预先确定消息产生的顺序,更符合客观世界的实际。并且面向对象程序设计方法提供了软件重用、解决大问题和复杂问题的有效途径,具有抽象性、封装性、继承性和多态性等特点。 简答题 1、传统的结构化程序设计的优点和缺点是什么? 优点: (1)这种程序设计方法力求算法描述准确。 (2)对每一子过程模块容易进行程序正确性证明。 缺点: (1)这种程序设计方法本质上是面向“过程”的,而“过程”和“操作”又是不稳定和多变的,因此不能直接反映人类求解问题的思路。 (2)程序代码可重用性差。程序中除少数标准库函数外,每设计一个程序时,程序员几乎从零做起。即使重用代码,通常也是通过拷贝或编辑重新生成一份。 (3)维护程序的一致性困难。该种方法将数据与对数据进行处理的程序代码分离。 2、什么是对象? 每个对象都具有属性(Attribute)和方法(Method)这两方面的特征。对象的属性描述了对象的状态和特征,对象的方法说明了对象的行为和功能,并且对象的属性值只应由这个对象的方法来读取和修改,两者结合在一起就构成了对象的完整描述。 3、什么是消息? 在面向对象的程序设计中,由于对象描述了客观实体,它们之间的联系通过对象间的联系来反映。当一个对象需要另外一个对象提供服务时,它向对方发出一个服务请求,而收到请求的对象会响应这个请求并完成指定的服务。这种向对象发出的服务请求就称为消息。4、什么是多态性? 所谓多态性是指当程序中的其他部分发出同样的消息时,按照接收消息对象的不同能够自动执行类中相应的方法。其好处是,用户不必知道某个对象所属的类就可以执行多态行为,从而为程序设计带来更大方便。 5、什么是面向对象的程序设计方法? 这种方法将设计目标从模拟现实世界的行为转向了模拟现实世界中存在的对象及其各自的行为。 在OOP中,将“对象”作为系统中最基本的运行实体,整个程序即由各种不同类型的对象组成,各对象既是一个独立的实体,又可通过消息相互作用,对象中的方法决定要向哪个对象发消息、发什么消息以及收到消息时如何进行处理等。 6、面向对象方法的特点是什么? (1)OOP以“对象”或“数据”为中心。由于对象自然地反映了应用领域的模块性,因此具有相对稳定性,可以被用作一个组件去构成更复杂的应用,又由于对象一般封装的是某一实际需求的各种成分,因此,某一对象的改变对整个系统几乎没有影响。 (2)引入了“类”(class)的概念。类与类以层次结构组织,属于某个类的对象除具有该类所描述的特性外,还具有层次结构中该类上层所有类描述的全部性质,OOP中称这种机制为继承。 (3)OOP方法的模块性与继承性,保证了新的应用程序设计可在原有对象的数据类型和功能的基础上通过重用、扩展和细化来进行,而不必从头做起或复制原有代码,这样,大大减少了重新编写新代码的工作量,同时降低了程序设计过程中出错的可能性,达到了事半功倍的效果。 7、面向对象的程序设计方法与结构化程序设计方法的比较 (1)传统的结构化程序设计方法以过程为中心构造应用程序,数据和处理数据的过程代码是分离的、相互独立的实体,设计出的程序可重用代码少,且当代码量增加时维护数据和代码的一致性困难。 1 什么是面向对象程序设计,它与传统的结构式程序有什么不同。 面向对象程序设计是一种适用于设计、开发各类软件的范型。它是将软件看成是一个由对象组成的社会:这些对象具有足够的智能,能理解从其他对象接受的信息,并以适当的行为作出响应;允许低层对象从高层对象继承属性和行为。通过这样的设计思想和方法,将所模拟的现实世界中的事物直接映射到软件系统的解空间。 与传统的结构式程序设计相比,面向对象程序设计吸取了结构式程序设计的一切优点(自顶向下、逐步求精的设计原则)。而二者之间的最大差别表现在: ·面向对象程序采用数据抽象和信息隐藏技术使组成类的数据和操作是不可分割的,避免了结构式程序由于数据和过程分离引起的弊病。 · 面向对象程序是由类定义、对象(类实例)和对象之间的动态联系组成的。而结构式程序是由结构化的数据、过程的定义以及调用过程处理相应的数据组成的 2 用面向对象方法建立模型的思维过程是怎样的。 用面向对象方法建立拟建系统的模型的过程就是从被模拟现实世界的感性具体中抽象要解决的问题概念的过程。这种抽象过程分为知性思维和具体思维两个阶段,其中:·知性思维是从感性材料中分解对象,抽象出一般规定,形成了对对象的普遍认识。·具体思维是从知性思维得到出的一般规定中揭示的事物的深刻本质和规律,其目的是把握具体对象的多样性的统一和不同规定的综合。 3 解释以下概念: ①对象:在现实世界中,对象就是可以感觉到的实体。每个对象具有一个特定的名字以 区别于其他对象;具有一组状态用来描述它的某些特性;具有一组操作,每一个操作决定对象的一种功能或行为(为自身服务的操作和为其他对象提供服务的操作)。而在面向对象系统中,对象是可以标识的存储区域。每个对象的状态被保存在此区域中,而实现一类对象行为的操作(代码)被保存在另外相关的存储器区域中。 ②消息:消息是要求某个对象执行其某种功能操作(方法)的规格说明。因此,消息是 由消息的接收者、消息要求提供的操作(消息名)和必要的参数组成的。 ③类:在现实世界中,类是对一组具有共同特性(属性和行为)的客观对象的抽象。而 在面向对象系统中,类是由程序员自定义的具有特定结构和功能的类型,是一种代码共享的手段。 ④实例:任何一个对象都是该对象所属类的一个具体实例。 ⑤公有消息:是由对象外向对象发送的消息,用于激活该对象的某种方法。 ⑥私有消息:是由对象向自身发送的消息,用于内部操作;该类消息不能从对象外向该 对象发送。 ⑦消息序列:在面向对象系统中一个事件的发生总会有多个对象的多次相互作用才能完 成,使得这些对象能够相互作用的消息组成的序列被称为消息序列。 4 类与实例的关系如何? 类是创建对象的模板,而对象是实现类的实例。属于同一类的不同实例必须具有: ·相同的操作集合; ·相同的静态属性集合; ·不同的对象名和属性动态值。 面向对象程序设计实验指导书 实验一、C++开发环境应用入门(2学时)(选做) 1、实验目的 (1)了解C++开发工具的特点 (2)熟悉C++开发环境 (3)学习用C++编写标准的C++程序 2、实验任务 使用C++来建立一个非图形化的标准C++程序,编译、运行下例程序: #include 面向对象程序设计教程 (马石安版)
面向对象程序设计考前复习题及答案
什么是面向对象程序设计
面向对象程序设计实验指导书讲解
《面向对象程序设计》答案