第二讲 c++ 设计.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * 为了对消息进行反应,对象內部自然应该准备好各种程序来应对,这些程序称为“方法”。 “方法”往往会改变对象自身的状态或是送出“消息”给其他对象。 准备好的 各种方法 用来对外界反应 送出信息 改变自己 的状态 方法:Method 对象中的资料必須透过对象的方法取用,只要对象的方法对存取作控制,外界的对象便无法取用该对象內部的資料,从而达到保护的目的。 面向对象的语言 虽然基本框架类似,不同面向对象的语言之间也存在很大差异。 1)采用什么样的对象模型 是否允许多重继承? 采用单根的类层次结构? 提供那些继承方式? 例如C++里提供了三种继承方式 是否提供完善的访问控制机制? 基于继承的模型和基于指派的模型 基于类的模型和基于原型的模型 对象本身的独立性 类是不是对象? ... ... ... 面向对象的语言 其他情况包括: 是不是追求“纯粹”的面向对象语言? Smalltalk、Java等语言尽可能地追求“面向对象”的理想,基本上是重新设计的面向对象语言 C++ 设法在C这样支持系统程序设计的过程性语言上“扩充”一套支持面向对象的机制,自称为多范型的语言 其他语言(如Ada)采用很不同的方式支持面向对象的程序设计,这里不详细介绍了 一些脚本语言也支持面向对象的概念。例如Ruby就是一个纯面向对象的语言,其中的一切都是对象,全局环境看作一个匿名的大对象,全局环境里的函数看作这个对象的成员函数。它还有一些独特的性质。 面向对象的语言 采用值模型还是引用模型。从本质上说,只有引用模型才能支持方法的动态约束。因此面向对象的语言大多采用引用模型。 Java只能把面向对象的功能应用于用户定义类型,因为基本类型采用的是值模型 C++采用值模型,因此其中只有对引用或指针才能真正实现面向对象的行为 是否允许静态对象或者堆栈对象(自动对象)?多数面向对象语言只支持堆对象(通过动态存储分配创建的对象) C++支持静态对象和自动对象,是希望最大可能地借用作用域规则管理对象,避免依赖自动存储管理系统(GC)。人们已经开发了许多借助于自动对象的对象管理技术,如句柄对象,对象创建即初始化等等 面向对象的语言 是否所有方法都采用动态约束?动态约束很重要,但调用时也会带来一些额外开销。如果需要调用的方法能静态确定,采用静态约束有速度优势。大部分语言里的所有方法都采用动态约束,C++和Ada提供静态约束(默认)和动态约束 是否依赖于自动废料收集(垃圾回收)。由于面向对象的程序里常常需要(显式或者隐式地)创建对象,对象间常常存在复杂的相互引用关系,由程序员来管理对象回收问题可能变得非常困难。因此大多数面向对象语言都需要依赖一个自动的存储回收系统。但这种系统的存在会带来性能上的显著损失,而且还可能造成程序行为的不可预见性(GC发生的时刻常常无法预见,其持续时间的长短也无法预计) Java和Ada 95等都需要内置的自动存储管理子系统 C++ 是个例外,语言设计者的一个目标就是尽可能避免对于自动存储回收的依赖性 面向对象的语言 人们还提出了许多与面向对象机制有关的新想法和模型。 总而言之,虽然今天面向对象的模型和语言已经成为主流的程序设计方法和主流的程序语言,但是这类语言还远未成熟,还正在发展和研究之中。 与面向对象语言有关的理论研究还处在起步阶段,这也是本领域很不成熟的标志。 面向对象概念的实现 实现面向对象的语言,需要考虑它的几个标志性特征的实现。 封装机制是一种静态机制,C++/Java的各种访问控制机制也是静态的,都可以通过在符号表里记录信息,在编译过程中检查和处理。它们在运行代码中都不会留下任何痕迹。 方法的实现方式采用的技术与以模块作为类型时的局部子程序的实现技术一样。由于每个方法调用都有一个调用对象,方法里需要一个隐含的指针,在方法调用时指向调用对象,所有对于对象中数据成员的访问都通过这个指针和静态确定的偏移量进行。 许多语言加入了这一指针作为伪变量,称为this或者self,通过这种指针访问调用对象的方式与通过指针访问普通结构一样。 实现面向对象语言的关键就是继承的实现(使派生类型的对象能作为基类的对象使用)和动态约束的实现(从作为值的对象出发能找到它的类里定义的方法)。 继承的数据布局 继承关系的数据部分通过对象的适当存储布局实现。 对象的重要部分是数据成员的存储 假定B是一个类,它有自己的数据成员 D是B的派生类,增加了一些数据成员。那么在D类的对象里,前一部分仍然是B类的那些成员,扩充的成员排列在B类的成员之后 在一个D类的对象里包含所有B类的成员,这些成员相对于对象开始位置的偏移量,与这些成员在一个B类对象里的偏移量相同。因此D类的对象可以作为B类的对象用(只看前面一部分)。 B类的对象 B类的 数据成员 D类的对象 B类的 数据成

文档评论(0)

sxty + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档