- 抽象的过程
- 万物皆对象。
- 程序就是一组对象,对象之间通过发送消息互相通知做什么。
- 每一个对象都有它自己的由其他对象构成的存储区。
- 每个对象都有一个类型。
- 类的最重要的突出特征是“能向它发送什么消息”
- 一个特定类型的所有对象都能接收相同的消息。
- 对象的转型使其可接收与父类一样的消息。代表了OOP思想带来的替换能力。
- 对象有一个接口
- 创建抽象数据类型是面向对象程序设计的基本思想。
- 操作这些变量(称为发送消息或请求,对象根据收到的消息推断需要做什么事情)
- 类描述了一组有相同特性(数据元素)和相同行为(功能)的对象,因此类实际上就是数据类型。
- 一开始错误理解了上句话里的数据类型,认为类本身就一种类。但这样也是可以正确理解的。
- 每定义一个类,可以认为这个类就是一个类实例。这个类我称它为高类。超类应该与设计模式有一定关系。
- 可以向对象发出的请求是由它的接口(interface)定义的,而接口由类型决定。接口+隐藏的数据 = 实现(implementation)
- 实现的隐藏
- 类创建者和客户程序员分开是有必要的。
- 包装,用户不应该接触到机器内部。只需要接触到控制机器的接口就可以了。
- 使用访问控制可以在类设计上实现这中包装。
-
- 理由1:防止客户程序员插手他们不应当接触的部分,使用户知道那些对他重要,那些他可以无视。
- 理由2:允许库设计者去改变这个类的内部工作方式,而不必担心这样会影响客户程序员。
- public,private,protected.
- protected基本与private相似:继承的类可以访问protected,但不可访问private。
- 实现的重用
- 在类中包括另一个类为他的类成员。称为组合。
- 当创建新类时,应该首先考虑组合,因为它更简单和灵活。
- 继承:重用接口
- 继承后包含父类的所有成员和接口。
- 子类与父类是相同类型的。
- 加入全新函数,使子类与父类不同。
- Overriding,改变已经存在的基类函数,使子类与父类不同
- 具有多态性的可互换对象
- 早捆绑,编译器会对特定的函数名产生调用,而链接器将这个调用解析为真正要执行的代码的绝对地址。
- 晚捆绑,当给对象发送消息时,在程序运行时才去确定被调用的代码。
- c++编译器在真正调用的地方插入一段特殊的二进制代码。通过使用存放在对象自身中的信息,这段代码在运行时计算被调用函数函数体的地址。
- 用virtual声明希望有晚捆绑的灵活性的函数。
- 创建和销毁对象
- 栈内存
- 为了最大化运行速度,将对象存放在栈中或静态存储区中,存储和生命期可以在编写程序时确定。
- 栈是内存中的一个区域,可以直接由微处理器在程序执行期间存放数据。
- 在栈中的变量可称为自动变量,或局部变量。
- 栈为静态存储区,是内存中一个固定的块,在程序执行前分配。
- 可以快速分配和释放,但是牺牲了灵活性,在写程序时,必须知道对象的准确数量、生命周期和类型。
- 在栈上创建存储常常只是一条向下移动栈指针的微处理器指令,另一条是移回指令。
- 堆内存
- 可以在运行时才动态决定要创建的对象的类型和数量。
- 需要新的对象,直接使用new关键字让它在堆上生存。
- 当使用结束时,用关键字delete释放。
- 在运行时动态管理,所有比栈内存的使用要耗时。
- 在堆上的内存,必须要程序员决定何时销毁对象。
- 栈内存
- 异常处理:应对错误
- 检查错误,若有错误,进入处理错误的代码。
- 与传统的C检查错误不同的是必须要处理错误的情况,不可以忽略。