C++|描述问题求解思路的三种思维模式:过程化、面向对象、泛型。C++提供了相应的语法工具来服务三种求解问题的思路:过程化、面向对象、泛型。
需要描述的内容 | 语法工具 | |
过程化编程 | 数据及其处理过程 | 1 变量和数据类型系统 |
2 基本运算符和表达式 | ||
3 流程控制语句 | ||
4 输入输出流以及函数 | ||
面向对象 | 对象以及对象之间的协作过程 | 1 类 |
2 抽象、封装、数据隐藏、继承、多态 | ||
泛型 | 类型泛化的过程或对象类 | 1 函数模板和类模板 |
2 基于模板机制实现了STL标准模板库 |
1 过程化编程
1.1 描述数据
针对描述数据,C++语言首先提供了变量的概念,用来记住数据所在的存储空间的地址,通过变量我们可以方便地对数据进行存取访问。
同时,C++提供了丰富的数据类型,用以约定数据的规格,包括数据的存储空间大小、编码和解码方式以及数据可接受的运算处理行为。
1.1.1 内置数据类型:描述常用的整型、字符型、浮点型数据。
1.1.2 复合数据类型:描述常变量、数组、指针、引用等复合数据。
1.1.3 定制数据类型:定制我们自己的数据类型、约定数据的规格,包括存储空间大小、编码和解码方式及其可接受运算处理行为。
1.2 描述数据处理
1 | 描述最基本的数据运算行为: | 运算符和表达式语句 |
2 | 描述数据处理的控制流程: | 流程控制语句 |
3 | 描述数据的输入和输出: | 输入输出流类库 |
4 | 描述复杂的数据处理过程: | 复合语句和函数 |
其中,函数是C++语言核心的语法工具,用于将一个数据处理过程包装成一个逻辑独立的、可重复使用的语法单元。本质上,函数就是一种数据处理的机器,它把数据处理过程封装到机器内部,对外提供一个入口和一个出口。如果需要使用函数处理数据,那么,只需要把我们的数据放到机器入口,则机器就会自动运转对数据进行加工处理,最后,在机器的出口我们就可以拿到数据处理的结果。
通过函数,我们可以比较轻松地就会规模较大问题的编程求解。譬如,在求解一些较大的问题时,往往会遇到其中一些环节或者子问题暂时难以处理,此时,我们就假设存在函数(机器)可以解决这些子问题,即使它们实际上并不存在;然后通过调用这些函数完成问题的整体编程求解。之后,再在合适的时机给出这些函数的实现。
这种自上而上将复杂问题不断细分,产生一系列更易于求解的子问题,然后再针对这些子问题进行求解的思维,就是结构化的编程思想(Structured Programming),或者说,自顶向下,逐步求精的编程思想。
2 面向对象思维
2.1 描述对象
针对描述对象,C++语言提供了类(class)的语法设施用来描述对象的属性和行为能力。类描述了具有相同属性和行为能力的一类对象,称为对象类型,简称类。在类中,对象的属性称为类的数据成员,对象的行为能力称为类的成员函数。C++语言提供了多种形式的成员函数,用来说明对象不同的行为能力。
1 | 描述对象产生和消亡的行为: | 构造函数和析构函数 |
2 | 描述对象运算操作的行为: | 操作符重载函数,用于说明对象的运算操作行为 |
3 | 描述对象的其他行为: | 普通的成员函数 |
当然,在对象的世界中对象之间还存在着相互关系。例如,“家庭”是由“人”组成的,即“家庭”和“人”之间存在组合关系;而“学生”是“人”,则表达了“学生”和“人”之间的类属关系。“家庭”、“学生”、“人”是不同类型的对象,但是可以利用“人”来描述“家庭”和“学生”,实际已有对象类型的重复利用。为此,C++语言提供了组合和继承两种语法工具,用于支持对象之间组合和类属关系的表达。
假设我们定义了Person类用于描述“人”这类对象,那么,在定义Family类描述“家庭”类型时就可以通过组合机制重用Person类。不过,如果需要定义Student类描述“学生”这类对象,组合机制就不再适用,因为Student是Person,而非由Person对象组成,它们之间是类属关系。此时,就需要通过继承机制从Person类派生出Student类,并称Student是Person的派生类,Person是Student的基类,派生类的对象会自动继承来自基类的属性和行为,同时也可以改造和发展出新的属性和行为。
从同一个基类继承而来的多个派生类,可能都会对基类的某种行为进行发展创新。譬如,Student从Person类中继承了学习行为,同时,Worker也从Person类继承了学习行为,但是,学生的专职学习不同于工人的兼职学习。同一种行为,在面对不同派生类的对象时,却表现出多种不同的形态特征,这就是多态现象(polymorphism)。C++语言提供了重载函数和虚函数用于支持编译其和运行期的对象多态行为。
3 泛型思维
也就是在数据或者对象参数化的情况下描述和应用问题求解思路。
3.1 泛化环节:基于泛化的数据或者对象类型来描述通用的问题求解思路。
3.2 应用环节:设定通用求解思路的泛化参数,描述特定具体问题的求解过程。
C++语言提供了模板机制来支持数据类型的参数泛化,包括处理过程泛化的函数模板和处理对象泛化的类模板。另外,C++语言基于模板实现了常用的一些算法和数据结构,形成了一个具有工业级强度、健壮可靠的泛型程序库,称为标准模板库(Standard Template Library),是我们进行泛型编程的基础。