第9章:数据抽象与面向对象——《实践之路》笔记
##作用域是逻辑结构(语言定下作用域规则,控制对象的可见性)
##生存周期是物理结构(分配销毁内存,对象存在的物质基础)
##在作用域内:对象可以供当前环境使用。是否开始了生存周期?供使用的正确的值
##在生存周期中:对象存在与内存上。根据作用域规则,是否允许程序使用
作用域控制可见性——作用域内外(进入可见;离开不可见);交集(嵌套,失活激活)可见性;控制导入导出
生存周期——内存空间的分配与释放。存在多久,提前回收
生存周期:占据空间并能保持数据的时间
##将生存期与作用域挂钩成批垃圾回收:Java
变量按生存期分类:
1.全局变量:生存期:整个执行期间
2.局部变量:生存期:一个子程序的执行期间
生存期提升:函数作用域中静态变量:生存期变成全局,作用域 不变
作用域的分类:是否允许两两嵌套?
全局作用域
子程序作用域
模块作用域:子程序共享 静态变量
类作用域:方法共享类变量
##模块作为类型(多个实例):与类作用域区别?
管理器风格模块:只能从模块导出抽象类型(单实例类?)
模块类型:本身为一种类型
使用方法
管理器:显式导出
模块类型:实例创建与销毁
类=模块类型+继承(精化抽象)
类的实例:类对象
面向对象类型的三个基本概念:封装、继承、动态方法约束
9.1面向对象设计
模块与模块类型提供的抽象:解耦合(从图的角度解释解耦合、内部实现、外部接口。从底向上逐步抽象)
1.减少概念负担与细节量
2.故障遏制
3.提高程序部件间的独立性,修改内部实现避免改动外部代码
面向对象
更容易的扩展与精化(继承)现有抽象,定义新抽象,提高代码重用(动态约束)
创造对象:调用定义的初始化例程:构造函数
##例程:编译器定义的执行时动作(生成代码,执行代码)?
公有与私有成员(类内外可见性控制)
类的信息(定义)可放在类声明外
声明中包含足够的信息(编译器获得对象大小)
简化的类声明:.h头文件
函数体:.cc实现文件
必须用作用域解析符::在方法定义的头部指明(方法)所属的类,显式访问类对象(类变量?)
直接访问记录域的操作——类实例对象上的操作
派生:继承已有属性与方法
类层次结构
创建通用元素的基类,只包含操作与所需的数据
派生出特定类型
定义模板,实现类型实例化
重载构造函数
不一定保证执行基类的构造函数
重载域与方法
显式访问基类
隐式访问
为了将任意大小、类型对象放入固定大小的对象
选择放入其引用
可以在不了解类型与大小的情况下对其静态分配
9.2封装与继承
封装:数据与对其操作的子程序组织在一起,隐藏实现细节
9.2.1模块
利用作用域规则,隐藏数据:选择性导出接口
头部:声明:选择导出的名字
体:定义
非透明类型:只能由模块定义的子程序操作模块中的数据
在头部分出公用部分与私用部分
没有模块头部:编译器自动从模块正文中整理出头部
9.2.2类
基类对其成员的可见性控制,相对于派生类
默认可见性,指定可见性,修改可见性
C++ public private protected
python 类成员 public
9.2.3嵌套类
类声明的嵌套
对比函数
内外层可见性
java 内层类,局部类:支持闭包机制
9.2.4类型扩展
部分语言未改动现有的模块机制,通过扩充记录的机制提供继承和动态方法约束
9.2.5不使用继承扩展
js不允许为现有类添加方法
9.3初始化和终结处理
对象生存期:占据空间并能保持数据的时间
生存期开始——自动初始化:子程序形式:构造函数
构造函数并不分配空间(生存期已经开始),在已分配好的空间完成初始化工作
构造函数的选择:重载或多个名字
引用与值
如果对象是引用:必须显示创建:引用合适的对象
值:声明加工后创建,隐式发生:允许对象未初始化的形式开始生命周期 或 提供一种方式,通过加工产生的对象选择合适的构造函数
执行顺序:初始化顺序(隐式调用,显式控制?),重载处理
废料收集
9.3.1构造函数选择
重载:识别合适的函数签名
9.3.2引用与值
引用模型中,传给变量的每个对象都是显式创造的(引用合适的对象)容易保证能调用适当的构造函数
使用值模型:给变量创建对象时,可以作为声明加工的结果而隐式发生
复制构造函数
只有一个参数(完整对象)
表示初始化,而不是赋值
c++中初始化与赋值的差别会对性能造成影响
9.3.3执行顺序
是否要求自动调用基类的构造函数
9.3.4废料收集
析构函数
自定义对象分配在了哪儿?根据对象声明的位置而定
函数,类,模块声明的嵌套
多重继承:
歧义时优先级?
9.4动态方法约束
继承:类型扩展的重要结果
没有隐藏任何公共&可见成员的派生类:子类
子类型多态性:
派生类(子类)可用于期望基类的上下文(上下文:期望,限定了出现的对象的值域)
特殊 一般
静态方法约束:根据引用的类型做选择
动态:根据对象的类做选择
python动态
java默认动态,改静态
c++默认静态,改动态
抽象类:至少含一个抽象方法
静态方法约束:编译器总能基于类实例对象的类型(强类型)找到对应的方法版本
动态:对象需要包含足够的信息(所属类型,属性查找,继承链)