C++ 考试复习要点

面向对象技术特点

答案:1模块性2封装性3代码共享4灵活性5易维护性6增量性设计7局部存储与分布式处理

三:名次解释(15分)

1.对象

对象是一个实体,是一个名字标识、自身状态和自身功能。

定义:OBJ<ID,MS,DS,MI> ID对象标识,MS对象受理的操作集合,DS对象的存储或数据结构,MI对象可受理的操作名称集(对外接口)

2.封装和协议

封装是面向对象技术基本原理的基础,对象是类的实例,对象的所有数据和对这些数据的操作封装在一起,外部对象只有通过给它发消息来改变或者得到这些数。而协议由一个对象能够接受并且愿意接受的所有消息构成的对外接口。其他对象只能向该对象发协议中所提供的消息。

3.类和实例

类:对一组相似对象的共同抽象描述,它将该对象所具有的共同特征包括操作特征和存储特征结合在一起,用于说明该组对象的能力和性质。

实例:任何单个对象都是某个类的实例,一个类的所有实例都采用同样的处理方法处理消息,但每个实例又有自己的私有存储单元。类和实例的关系是抽象与具体的关系。



1. 面向对象方法有哪些特点?

 ( 1.)抽象:

抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象

(2).继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

(3).封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象

(4). 多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

(5)灵活性:对象的功能执行是在接到消息是确定的,使得对象可以根据自身的特点进行功能实现.

(6)易维护性:对象实现抽象和封装后,使可能出现的错误基本限制在自身内部,易于检错和修改.

(7)增量性设计:面向对象系统可以提供继承机制不断扩充功能,而不影响原有软件的运行.

(8)局部存储与分布处理:每个对象通过数据抽象和数据隐蔽将其内容和状态置于自身独立的存储结构里。对象的处理是自治的,由对象构成的系统处理是分布式的

(9)代码共享:继承性提供了一种代码共享的手段,可以避免代码的重复设计.

2. 面向对象程序设计与大型程序设计有哪些关系?

答:大型程序是根据待解决问题的复杂度来判定。a大型程序必须由多人合作完成,因此进行大型程序设计的管理具有复杂性b大型程序有大量的系统状态,这对测试系统的正确性带来极大的困难.

大型程序的实现要求:a正确性;b易维护性;c可读性;d可重用性

模块分解:a基于功能的模块分解(横向)。依据流程图,以数据为模块的界面.b基于数据抽象的模块分解(纵向)。依据信息隐蔽,用数据上的操作为界面

软件系统设计=大型程序设计+小型系统设计

前者解决模块界面复杂,后者控制模块内部的复杂

面向对象的设计方法

软件系统设计=面向对象设计+面向对象程序设计

3. 有哪些面向对象语言?

– 答案:SmallTalk,Alan Kay, 1972年。SmallTalk-72, SmallTalk-74,

      SmallTalk-78, SmallTalk-80(强调了对象概念的统一,引入类、

      方法、实例等概念和术语,应用了单继承和动态连接)。

– C++,AT&T,Bjarne Stroustrup对C语言进行改进扩充。

– Object-C,康涅迪格大学的Brad J. Cox在C语言基础上加SmallTalk-80的框架建成

– Eiffel,Interactive Software Inc.的Bertrand Meyer设计

– Ctalk,C+Smalltalk

– POOL,阿姆斯特丹大学的America主持开发

– Fooplog,对象、函数式、逻辑式三者结合

– ADA

– Java,Sun公司,90年代中期

4. 面向对象设计方法与其它设计方法的比较?

答案:(1)横向比较:a函数程序设计将计算过程看作函数作用过程;b逻辑程序设计将计算过程看作推演过程;c面向对象程序设计将计算过程看作分类加状态变换的过程

(2)纵向比较a和结构化程序设计比较。结构化程序设计强调功能抽象和模块性,将解决问题的过程看作是一个处理过程;而面向对象程序设计综合了功能抽象和数据抽象,将解决问题的过程看作是一个分类演绎过程。a模块与对象:b过程调用与消息传递:c类型与类:d静态连接与动态连接

结构化程序设计特点:  

优点: 与非结构化程序相比,结构化程序在调试、可读性和可维护性等方面都有很大的改进。

缺点:代码重用性不高:以过程为中心设计新系统,除了一些标准函数,大部分代码都必须重新编写。

由于软、硬件技术的不断发展和用户需求的变化,按照功能划分设计的系统模块容易发生变化,使得开发出来的模块的可维护性欠佳。

面向过程模式将数据与过程分离,若对某一数据结构做了修改,所有处理数据的过程都必须重新修订,这样就增加了很多的编程工作量。

面向对象的优点:

    而面向对象围绕现实世界的概念来组织模块,采用对象描述问题空间的实体,用程序代码模拟现实世界中的对象,使程序设计过程更自然、更直观。

    面向过程是以功能为中心来描述系统,而面向对象是以数据为中心来描述系统。相对于功能而言,数据具有更强的稳定性。

    面向对象模拟了对象之间的通信。就象人们之间互通信息一样,对象之间也可以通过消息进行通信。这样,我们不必知道一个对象是怎样实现其行为的,只需通过对象提供的接口进行通信并使用对象所具有的行为功能。而面向过程则通过函数参数和全局变量达到各过程模块联系的目的。

   面向对象把一个复杂的问题分解成多个能够完成独立功能的对象(类),然后把这些对象组合起来去完成这个复杂的问题。采用面向对象模式就象在流水线上工作,我们最终只需将多个零部件(已设计好的对象)按照一定关系组合成一个完整的系统。这样使得软件开发更有效率。

5. 解释以下概念:

对象;消息;封装;协议;类;继承;

对象:对象就是我们认识世界的基本单元,它可以是人,也可以是物,还可以是一件事。整个世界就是形形色色的对象组成。程序=对象+消息

消息:消息是指一个对象要求另一个对象执行某个功能操作的规格的说明,通过消息传递才能完成对象之间的相互请求或相互协作。

封装:封装是隐藏了抽象的内部实现细节的结果。封装是将数据抽象的外部接口与内部的实现细节清楚地分离开。

协议:由一个对象能够接受并且愿意接受的所有消息构成的对外接口。其它对象只能向该对象发协议中所提供的消息。

类:类是对一组具有共同的属性特征和行为特征的对象的抽象。面向对象中,类就是具有相同的数据和相同的操作的一组对象的集合,也就是是说,类是对具有相同数据结构和相同操作的一类对象的描述。类和对象是抽象和具体的关系,类是对多个对象进行综合抽象的结果,对象又是类的个体实物,一个对象是类的一个实例。

继承:是一种现实世界对象之间独特的关系,它使得某类对象可以继承另外一类对象的特征和能力。也就是说一类(派生类、子类)对象具有另一类(基类、父类)对象的性质(数据和操作)。

在面向对象中,继承所表达的是对象类之间相关的关系,这种关系使得某类对象可以继承另外一类对象的特征和能力。

6. 什么是实例?类于实例的关系是什么?

答案:任何单个对象都是某个类的实例。一个类的所有实例都采用同样的方法处理消息,但每个实例又有自己的私有存储单元。

类和实例的关系:抽象和具体的关系.a类的所有实例能响应的消息模式相同,且采用同样的方法完成消息所要求的操作b类的所有实例具有相同的数据结构,且采用相同的名字来引用

实例是类的具体化,类是某些有相同点事物的统括类和对象是抽象和具体的关系,类是对多个对象进行综合抽象的结果,对象又是类的个体实物,一个对象是类的一个实例

7. 什么是继承?分为哪几种?

在面向对象中,继承所表达的是对象类之间相关的关系,这种关系使得某类对象可以继承另外一类对象的特征和能力。按继承源上分:

继承分为:单继承:指每个派生类只直接继承了一个基类的特征

多继承:指多个基类派生出一个派生类的继承关系,多继承的派生类直接继承了不止一个基类的特征。

按继承内容上分:取代继承,包含继承,受限继承,特化继承

8. 继承方式:public,proteced,private

 1public(公有继承):继承时保持基类中各成员属性不变,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象只能访问基类中的public成员。
  2private(私 有继承):继承时基类中各成员属性均变为private,并且基类中private成员被隐藏。派生类的成员也只能访问基类中的 public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。 
  3protected(保 护性继承):继承时基类中各成员属性均变为protected,并且基类中private成员被隐藏。派生类的成员只能访问基类中的 public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。

9. 对象间的关系有哪几种?

对象间的创建关系:也是一种委托关系的具体实现

对象间的聚合关系(包含关系)

对象通讯关系:消息流图描述系统中对象间的消息流

实例化关系:对象是一个类的实例,类是对象的抽象模板

10. 解释以下概念:

多态;作用域;语景;深拷贝;浅拷贝

多态:多态,意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。多态即一名多用,也即同一消息可以根据发送消息对象的不同采用多种不同的行为方式。

作用域:通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。 作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突

语景:作用域是针对语言中的一个符号(如变量)或一个程序段(如函数)的可访问性而言的;

深拷贝:不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的;深拷贝是得到一个对象的副本的操作;

浅拷贝:只复制对象的基本类型,对象类型,仍属于原来的引用;浅拷贝是得到一个对象的指针的操作

11. 强类型与弱类型的区别在哪?它们的代表语言?

强类型与弱类型的区别:  
  强类型,意味着必须事先声明变量,并且该变量只可用于表示一种类型的数据(例如或者一个整数或者一个字符串)。弱类型,即一个变量不必声明其类型,一个被用于表示字符串的变量在后面的程序中也可用来表示数字;

代表语言:,c#,java是强类型语言VBScript, PHP弱类型语言。

12. 面向对象分析的任务是什么?面向对象分析的基础是什么?

面向对象的任务是:了解问题域内的相关对象及对象间的关系和作用,然后构成问题域的对象模型,尽量使模型真实反映处所要解决问题的实质

面向对象的基础是:模拟技术和面向对象技术,从模拟技术中吸取了属性、关系等对象概念,从面向对象技术中吸取了封装、分类结构等概念。a在分析和说明整体框架中贯穿结构化方法,如对象和属性,整体和部分,类和成员等.b用消息进行用户和系统之间、系统中对象之间的通讯制和协议称为部件对象模型

13. 面向对象分析和设计方法有哪些,其优势是什么?

面向对象设计:基于四个重要的软件设计功能--抽象、信息隐蔽、功能独立性和模块性来建造系统。必须找到适当的对象、定义类接口和继承层次并建立它们间的关系。设计主要针对当前的问题,但也应有足够的通用化适应将来的问题。尽量避免重复设计。

• OOA方法以及OOD方法:

– Booch方法包含“微开发过程”和“宏开发过程”

– Jocobson方法也称为OOSE,该方法特别强调使用实例

– Rambaugh方法包含用于分析、系统设计和对象级设计的OMT

– Coad和Yourdon方法是最容易学习的方法之一,建模符号相当简单

• 优势:集中相关数据和功能来直接模拟问题世界中的对象,并且开发的各个阶段都围绕对象范型进行。

14. 解释以下概念:

OLEActiveXCOMGUID 

OLE: Object Linking and Embedding,对象连接与嵌入,简称OLE技术。OLE 不仅是桌面应用程序集成,而且还定义和实现了一种允许应用程序作为软件对象”(数据集合和操作数据的函数)彼此进行连接的机制,这种连接机制和协议称为部件对象模型。

ActiveX: . 是组件 (或对象) 打包,别人编程功能以便可以重用 Web页或其他程序中插入由一组开发和实现Internet网上应用程序的技术或部件构成,ActiveX的核心技术也是OLE。它是OLE技术在Internet网上的一个扩展是组件 (或对象) 打包,别人编程功能以便可以重用 Web页或其他程序中插入

COM: COMComponent Object Model (组件对象模型)的缩写。COM组件是以WIN32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行代码组。是一个定义组件的标准,它在最基本的层次定义组件是什么,如何识别它们,如何定位它们,如何装入它们,如何访问它们以及如何与它们通信。

GUID:Globally Unique Identifier(全球唯一标识符)GUID(全球唯一标识)是微软使用的一个术语,由一个特定的算法,给某一个实体,如Word文档,创建一个唯一的标识,GUID值就是这个唯一的标识码。GUID广泛应用于微软的产品中,用于识别接口、复制品、记录以及其他对象。不同类型的对象对应不同的GUID值。例如,一个微软Access数据库使用的是16字节域为复制品创建一个唯一标识。

15. 什么是设计模式?

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 

16. Singleton

单例模式,就是只有一个实例作为对象的创建模式单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个"单例对象",而"客户甲""客户乙"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。(1)1995年Gamma等提出(2)独特之处:描述十分简单,实现却很复杂(3)描述:保证一个class只有一个instance(实体),并为它提供一个全局访问点(4)用途:当你模塑(model)一些“从概念上来说,在程序中只有唯一实体”的型别,如键盘、显示器、打印管理器等(5)Singleton不存在所谓“最佳”实现方案,只能根据要解决的具体问题来选择合适的实现

Singleton(单子,对象创建型模式):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

public class Singleton {

  private Singleton(){}

  //在自己内部定义自己一个实例,是不是很奇怪?
  //注意这是private 只供内部调用

  private static Singleton instance = new Singleton();

//这里提供了一个供外部访问本class的静态方法,可以直接访问  
  public static Singleton getInstance() {
    return instance; 
   }
}

第二种形式:

public class Singleton { 

  private static Singleton instance = null;

  public static synchronized Singleton getInstance() {

  if (instance==null)
    instancenew Singleton();
  return instance; }

}

 

17. 函数重载和覆盖,它们的比较

所谓函数重载是指同一个函数名可以对应着多个函数的实现可以给函数名add()定义多个函数实现,该函数的功能是求和,即求两个操作数的和。其中,一个函数实现是求两个int型数之和,另一个实现是求两个浮点型数之和,再一个实现是求两个复数的和。每种实现对应着一个函数体,这些函数的名字相同,但是函数的参数的类型不同。这就是函数重载的概念。函数重载在类和对象的应用尤其重要。

函数的覆盖覆盖是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本,这种机制就叫做覆盖。

区别:下面我们从成员函数的角度来讲述重载和覆盖的区别。 
成员函数被重载的特征有: 
1) 相同的范围(在同一个类中); 
2) 函数名字相同; 
3) 参数不同; 
4) virtual关键字可有可无。 
覆盖的特征有: 
1) 不同的范围(分别位于派生类与基类); 
2) 函数名字相同; 
3) 参数相同; 
4) 基类函数必须有virtual关键字。

重载是在相同名字空间作用域下,而覆盖则是在不 同的名字空间作用域下,

18. 友元,运算符重载

友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元

运算符重载:所谓运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型

友元函数:一个被赋予访问一个类非public成员权限的非成员函数,它在没有打破封装情况下改善接口。在运算符重载时比较有用(特别时两变元运算符)。

重载运算符的名字:只有C++预定义的运算符集中的运算符才能重载。但有几个特例,而且对于内部类型的操作符它们的意义不能改变。

不能重载的运算符:. 、 .* 、?: 、:: 、sizeof 、typeid

重载运算符的设计:当类设计者定义好了公有接口后,就可以考虑每个操作和运算符之间是否有逻辑关系。如isEmpty 可变为  operator!()

copy可变为  operator=()

isEqual 可变为  operator==() ……

重载运算符使用成员函数/友元函数的选择

19. 名字空间、异常的基本概念

名字空间:就是一个限定符号使用的区域,如果做了好几个同样名字的类,就放在不同的namespace

异常:异常是一种程序定义的错误,它对程序的逻辑错误进行设防,对运行异常加以控制。C++中,异常是对所能预料的运行错误进行处理的一套实现机制。

20. C++: 初始化列表,大三法则,合适继承,公有继承的含义 接口继承,实现继承,模板

初始化列表:顾名思义,就是用来初始化成员变量的。

因为有些变量必须在构造函数执行之前初始化,比如父类的构造函数中需要的参数,所以就需要一个初始化成员列表用来在构造函数执行前初始化那些必须提前初始化做法。

三大法则:如果一个类需要一个析构函数,或者一个拷贝构造函数,或者一个赋值运算符,那么它就三个都需要。

合适继承:当派生类的成员函数说明和积累中对性的成员函数相比,前者相对后者要求不多并且承诺不少是,我们就可以得到合适的继承和可替代行为。合适继承课提供充分的可替代性和可扩充性。合适继承和自己以及专门化(specilize)没有必然联系。

公有继承:意味着“is a kind-of”的关系,简称isa。Class D:public B,这就是告诉大家每个类型为D的对象也是一个类型为B的对象,繁殖不亦然。也就是说“B对象排的上用场的任何地方,D对象也可以派上用场”。

接口继承:派生类对象继承基类中的方法定义,而对象本身实现这些方法。在COM中,继承指的是接口继承。

实现继承:派生类对象直接继承基类中的函数的实现。

模版:模版是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性,使用模版可以大幅度地提高程序设计的效率

抽象基类:有时基类只表达一些抽象的概念,在这种基类定义的某些函数没有实际的意义,但它又要为其派生类提供一个公共接口,我们可以把这些函数声明为纯虚函数。而这种基类称为抽象基类


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值