目录

  • 1 绪论
    • 1.1 本章导读
    • 1.2 计算机程序设计语言的发展
    • 1.3 面向对象方法的由来
    • 1.4 面向对象的基本概念
    • 1.5 面向对象的软件开发
    • 1.6 计算机程序的基本术语
    • 1.7 程序的开发过程
    • 1.8 本章小结
    • 1.9 章节测验
  • 2 C++简单程序设计
    • 2.1 本章导读
    • 2.2 C++语言的产生和特点
    • 2.3 程序实例
    • 2.4 字符集与词法记号
    • 2.5 基本数据类型
    • 2.6 常用运算符与表达式
    • 2.7 语句
    • 2.8 数据的输入和输出
    • 2.9 算法的基本控制结构
    • 2.10 例2输入一个年份,判断是否闰年
    • 2.11 例3比较两个数的大小
    • 2.12 例4输入一个0~6的整数,转换成星期输出
    • 2.13 例5求自然数1~10之和
    • 2.14 例6输入一个整数,将各位数字反转后输出
    • 2.15 例7用do…while语句编程,求自然数1~10之和
    • 2.16 例8输入一个整数,求出它的所有因子
    • 2.17 自定义数据类型
    • 2.18 本章小结
    • 2.19 章节测验
  • 3 函数
    • 3.1 本章导读
    • 3.2 函数的定义与使用
    • 3.3 例1编写一个求x的n次方的函数
    • 3.4 例2数制转换
    • 3.5 例3编写程序求π的值
    • 3.6 例4寻找并输出回文数
    • 3.7 例5公式计算
    • 3.8 例6投骰子的随机游戏
    • 3.9 例7输入两个整数,求平方和
    • 3.10 例8求n!
    • 3.11 例9用递归法计算不同组合数
    • 3.12 例10汉诺塔问题
    • 3.13 函数的参数传递
    • 3.14 内联函数
    • 3.15 带默认参数值的函数
    • 3.16 函数重载
    • 3.17 使用C++系统函数
    • 3.18 本章小结
    • 3.19 章节测验
  • 4 类与对象
    • 4.1 本章导读
    • 4.2 抽象
    • 4.3 封装
    • 4.4 继承
    • 4.5 多态
    • 4.6 类的定义及类成员的访问控制
    • 4.7 对象
    • 4.8 类的成员函数
    • 4.9 例1时钟类的完整程序
    • 4.10 构造函数
    • 4.11 复制构造函数
    • 4.12 例2Point类的完整程序
    • 4.13 析构函数
    • 4.14 例3求游泳池改造预算
    • 4.15 组合
    • 4.16 例4类的组合,线段(Line)类
    • 4.17 前向引用声明
    • 4.18 结构体和联合体
    • 4.19 例5个人银行账户管理程序
    • 4.20 本章小结
    • 4.21 章节测验
  • 5 数据的共享与保护
    • 5.1 本章导读
    • 5.2 作用域与可见性
    • 5.3 例1作用域实例
    • 5.4 例2变量的生存期与可见性
    • 5.5 多文件结构和编译预处理命令
    • 5.6 本章小结
    • 5.7 章节测验
  • 6 数组和指针
    • 6.1 本章导读
    • 6.2 数组
    • 6.3 例1数组的声明与使用
    • 6.4 例2使用数组名作为函数参数
    • 6.5 例3对象数组
    • 6.6 指针
    • 6.7 例4指针的定义、赋值与使用
    • 6.8 例5void类型指针的使用
    • 6.9 例6用3种方法输出int型数组各元素
    • 6.10 例7利用指针数组输出单位矩阵
    • 6.11 本章小结
    • 6.12 章节测验
  • 7 继承与派生
    • 7.1 本章导读
    • 7.2 类的继承与派生
    • 7.3 不同继承方式下类成员的访问控制
    • 7.4 例1Point类公有继承
    • 7.5 例2Point类私有继承
    • 7.6 类型兼容规则
    • 7.7 例3类型兼容规则
    • 7.8 派生类的构造和析构函数
    • 7.9 虚基类
    • 7.10 本章小结
    • 7.11 章节测验
  • 8 多态性
    • 8.1 本章导读
    • 8.2 多态性概述
    • 8.3 运算符重载
    • 8.4 例1复数类加减法运算重载为成员函数形式
    • 8.5 例2将单目运算符“++”重载为成员函数形式
    • 8.6 虚函数
    • 8.7 本章小结
    • 8.8 章节测验
  • 9 异常处理
    • 9.1 本章导读
    • 9.2 异常处理的基本思想
    • 9.3 异常处理的实现
    • 9.4 本章小结
  • 10 2024年秋季学期直播
    • 10.1 2024-09-07 08:00 ~ 2024-09-07 11:25
    • 10.2 2024-09-07 13:40 ~ 2024-09-07 17:05
    • 10.3 2024-09-08 08:00 ~ 2024-09-08 11:25
    • 10.4 2024-09-08 13:40 ~ 2024-09-08 17:05
抽象


计算机中的抽象

什么是计算机中抽象?抽象是指在思维中对同类事物去除其现象的、次要的方面,抽取其相同的、主要的方面,从而做到从个别中把握一般,从现象中把握本质的认识工程和思维方法。

在计算机学科中,抽象也称为模型化,源于实验科学,主要要素为数据采集方法和假设的形式说明、模型的构造与预测、实验分析和结果分析。在为可能的算法、数据结构和系统结构等构造模型时使用此过程。抽象的结果为概念、符号和模型。在图论中体现的是抽象与理论形态,欧拉从哥尼斯堡七巧板问题入手,将其抽象为边和点的问题进行研究,成为图论研究的先驱。哈密顿回路、中国邮路等问题都是对现实问题进行的抽象,这些问题的研究和解决形成了一套比较完整的关于图的理论,包括一系列的定义、公理和定理等。

抽象是任何一门科学都具有的特征,科学理论就是对客观世界进行抽象进而总结出的一般规律。数学的抽象是最高级、最高程度的抽象,它抛开现实事物的物理、化学和生物学等等特征,而保留其本质的量化关系和空间形式。专家学者及实际开发人员要对有效的软件开发方法进行总结,形成普遍适用的软件工程方法和软件开发标准,如生命周期法、面对对象法等,这是理论过程:开发人员总要为解决软件开发中遇到的问题而提出解决方案,如应用数据流程图、数据字典、流程图等工具进行系统的分析和设计工作,这便是抽象。

那么详细来讲什么是计算机中的抽象?

首先,人脑往往不适于长幅记忆或直接面对复杂的二进制底层,人们在面对根本无法控制的事情时,往往把它们转化为另外一件可控的事抽象正是这样一种方,它可以隐藏低级层面的复杂性,而在另一个层面上提供新的更为强大的能力。再在这里抽象上构建更为高层的抽象,即抽象只是把问题变了个形式,抽象完成了之后,只要不是过度抽象,那么所有后来的事情都是另外一回事了,抽象是解决移殖问题最好的方法,抽象源于一个简单的事实,把事物从逻辑上分开,这样就会解偶他们之间的联系。只有把接口拉高,向高层抽象,那么就可以忽视平台逻辑,其次,从问题到解决不是一步而就的,所有需要建立中间层,先完成这诸多中间层,当中间的逻辑被解决的时候,事情自然就变得简单了(从这个意义上来说,世间一切软件都是抽象品,软件即抽象)抽象的本质在于远离问题,从靠近人的一个高层角度去解决更高级的问题。但是抽象的优点正是它的限制性,它可能带来再大的复杂性,一般抽象到了某个程度,为了获得计算机作为底层的冯氏能力,,就不应该再抽象下去了。开发模型不需要再变了,数据抽象到数据结构级就是顶级了再抽象就不是开发问题了,现在的虚拟机的提出,都是基于已有的模式,直接参照硬件上的机器设计中断,模拟数据类型等,从来没有那个虚拟机,其内部结构不是图灵模型,因为如果那样的话,它上面的开发模型将不再是数据加代码的方式。从来没有人突破过这个创新。仅仅因为大部分人没有想过,或根本无法尝试。其次,抽象就是编程界对事物方方面面的范式的一个界定。但一般的,抽象是抽取对象的可用部分,我们从来都是抽取事情对于我们的可用部分,所以设计时千万不能做大而全的抽象。

抽象都是有维度的,数据结构就是基于数据化类型的维度抽象了开发中组织内存的套路,而高级语言机制或范式基于多样化写代码的维度抽象了开发,设计模式是基于设计抽象了应用,而设计,就是人的事情了,处在前面数据结构,范式,应用的所有实际上软件的设计哲学是可以用来解释一切的,因为它是真正的哲学,而真正的哲学并不仅适用软件开发(软工和计算机是二个完全不同的抽象,虽然没有人提出过计算机抽象到底是什么,软工抽象到底里面有哪些抽象存在,我们仅能站在某个或某些维度上给出一个描述性的概念而不是有限集,这也就够了,如果能站在一个大全的维度上说明到软工的全部抽象,虽然这是不可能的,但我们还是给得出的这个结果取个名字,叫范式,范式在意义上是大全而的抽象,然而人类的范式总表现为某些维度上的产物上面层次。下面详细介绍这个维度的概念。

我们来问个问题,程序如何分类呢,从算法和数据结构的角度看我们可以发现,数据结构加算法等于程序。因为数据结构源于从一套相似的算法中找出操作对象的共性这个现实,而从复用来看呢,,又可以产生设计和接口就等于程序这种说法,因此这完全是不同事物的不同维度而已。根本没有可比性。(至少二者都可以产生程序这个概念,于是,程序=机器加电也是正确的)抽象把事物的复杂度换化到另一层面,实际上也是另一维度。这就是抽象与维度其实就语言本身来说,并没有汇编,C,C++Java,Python,Ruby这几个语言之间哪个语言更强大一点的说法,大凡用其中一方能实现的功能,用一方都完全能够抽象得到,Java所关注的Web编程领域,C++完全可以提供同样的功能实现, 只有抽象完成,整个Windows系统都可以用Java来写,这就是说,在软件的抽象里,任何事情都可以以抽象叠成的方式来完成.但是,“决定用什么语言干什么事”这个前提是“它善于干什么事情”,而不是“能不能”(而这,是由应用本身和人的要求所规定的),所以显然地,Wintel上装个Jvm,再用Java实现个Windows,这是个傻瓜行为(舍近求远而且有应用的瓶颈问题存在).比如用C进行C++能很好工作的事,这也是个傻行为(仅仅因为C没有显式的OO设计手段虽然它可以抽象得到)

过程抽象的概念是程序设计语言的设计中最老的概念之一,所有的子程序都是过程抽象。因为它们提供了一种方式,让一个程序说明要完成的某些过程,而不是要提供如何来完成的细节,以使程序设计的过程逐步趋于简单化。例如:当一个程序需要将某种类型的数值数据对象数组排序时,它通常使用一个子程序来进行这种排序过程,在程序中需要进行排序的位置。过程抽象对于程序设计过程十分关键,这种将子程序中的算法的许多的细节抽象出来的能力,使得人们有可能来构造、阅读和理解大程序,现在被认为的大程序必须至少其有好几十万代码。

所有的子程序,包括并发子程序和异常处理程序都是过程抽象。

数据抽象必然跟随着过程抽象的发展而发展,因为每一种数据抽象中的一个不可分割的中心部分都是操作,而操作被定义成过程抽象。

数据抽象的动机之一与过程抽象的类似,它是对抗复杂性的一种武器,是使得大型以及复杂的程序比较容易管理的一种方法。

在程序设计当中,所有内置数据类型都是抽象数据类型,例如:考虑一个浮点的数据类型。

在高级语言中,封装是抽象数据类型的先驱及支持机制。一个封装可以分割编译或者是独立编译,对一组相关的计算机提供了一个抽象系统和一个逻辑组织。

抽象思维方法本身随着人类文明的进化也在不断演化。从大类看,抽象思维方法分为抽象思维的形而上学方法和抽象思维的辩证方法。抽象思维的这两种具体形式不象有些人认为的那样,是对立的和没有共同基础贩。实际上,抽象思维的辩证方法是建立在抽象思维的形而上学方法之上的,在运用分析、综合、归纳、演绎方法来形成概念并确定概念与概念之间演绎的关系、概念外延的数量属性关系这些内容上,抽象思维的辩证方法和抽象思维的形而上学方法完全一样;只是面对发展和变化着的世界,为了提高思维的形而上学方法完全一样;只是面对发展和变化着的世界,为了提高思维的精确度从而减少思维对现实的偏差,抽象思维的辩证方法才增加了对概念内涵的数量属性关系的考察。可以说,抽象思维的辩证方法是对抽象思维的形而上学方法的补充的提高。