1.实体,类别,类属
实体分为 抽象实体 与 具体实体 , 实体拥有属性
抽象实体是不变的,因此其属性也不会改变,而具体实体则相反
实体的抽象则是类别,而类别的抽象则是类属,整一个的关系如图
1 | 实体-->类别-->类属 |
对象和值是实体,类型是类别,概念是类属
2.数据,值
数据是0-1序列,值类型是类别与数据的一个对应关系
数据是实体的表示,实体是数据的解释
值=数据+解释
良形式 :一项数据对一个值类型是良形式的,当且仅当一个数据代表一个实体,例如NaN
解释为实数则不是良形式的,因为NaN
不代表任何实体
真部分的值类型 :值只能对应类别中的实体的子集,例如,32位的int值不能表示所有的整数,但是所能表示的整数是所有整数的一个子集
全的值类型 :值能对应类别中的所有实体,例如bool值可以表示所有bool实体
有歧义的值类型 :该类型里有多个解释的值
值相等 :代表同一个实体
表示相等 :0/1序列相等
当一个值有唯一表示,相等则蕴含表示相等,反例,1/2 = 2/4,两者相等,但表示不相等
当一个值是无歧义的,表示相等蕴含相等
很多时候只能从表示相等判断相等,例如,如何判断两个std::function
是相等的?只能从01序列判断
3.对象
对象是实体的表示,对象可以改变状态,对象也可以是抽象实体的表示,此时对象无法改变状态,值(1, 2, 3, 4, true, false….)是抽象实体的表示,值永远不变
对象类型是一种操作值的模式
例如,int a=7,7是值,值类型是32位的二进制补码,a是对象,对象类型为int,对于该类型的操作有,加减乘除等
值可以表示对象的状态
4.过程
过程是一个指令序列,可以改变对象的状态,或者创建销毁对象
与一个过程进行交互的对象有以下几种
- 输入/输出
- 全局状态
- 局部状态
- 拥有的状态(局部静态对象)
直接传递:对象作为参数或结果传递
间接传递:对象作为指针方式传递
计算基:有穷的一系列过程,可以基于它们实现其他过程
高效的基:基于这个计算基实现的其他过程是最高校的
例如,int只提供了加法和求负,可以基于这两个基实现减法,但很明显这组基不是高效的
5.规范类型
存在过程,将其包含到一个类型的计算基中,能方便的把数据放入各种数据结构,则称这样的基的类型是规范的
一个基的类型是规范的,当且仅当它的基包含了
- 相等检查
- 赋值
- 析构操作
- 默认构造操作
- 拷贝构造操作
- 全序判断
- 基础类型
5.规范过程
一个过程是规范的,当且仅当其输入被替换成其他相等的对象时,得到的结果和以前相等,例如1func(1/2)
和func(2/4)
是相等的则说明过程func是规范的
非规范的过程
- 返回对象的地址
- 返回真实世界的状态确定值
- 返回自己所拥有的状态的值
6.函数式过程
在规范类型上实现的一类规范过程
- 有输入
- 有返回值
定义空间:预设的输入集合的子集
值域:输出集合
过程使用了一个类型,会依赖该类型的语法和语义
不是基于具体的类型,而是基于对类型的一些要求设计库和数据结构,一定可以提高其可用性(面向接口编程)
概念表示类属,类型表示类别
处理类型的机制
- 类型属性:类型->值的映射,例如:sizeof(T),得出某个类型的大小
- 类型函数:类型->从属类型的映射
1 | template<typename T> |
如果某些类型满足需求,就说概念被类型建模
如概念 $\varrho$ 被类型 $T_1,T_2,T_3$ 建模,写作
$\varrho(T_1,T_2,T_3)$
在定义一个概念时,写作
其中,$\varepsilon$ 表示概念所需要的条件,如参数数量,定义域等