基础

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
2
3
4
5
template<typename T>
struct Type
{
using sub_type = T;
};

如果某些类型满足需求,就说概念被类型建模

如概念 $\varrho$ 被类型 $T_1,T_2,T_3$ 建模,写作

$\varrho(T_1,T_2,T_3)$

在定义一个概念时,写作

其中,$\varepsilon$ 表示概念所需要的条件,如参数数量,定义域等