C++基础--ch_01绪论

绪论

大纲

  1. 计算机程序设计语言的发展
  2. 面向对象的方法
  3. 面向对象的软件开发
  4. 信息的表示和存储 — 1.4节,自己看书
  5. 程序的开发过程

计算机程序

计算机的工作是用程序来控制的

  • 计算机刚生产出来是裸机,什么事情都不会干,没有装操作系统

程序是指令的集合

  • 程序: 要解决的问题和解决问题方法的一个描述

指令是(特指)计算机可以识别的命令

  • 操作系统是软件,是程序,也是人写的指令,计算机由此来工作;

  • 在操作系统基础上,可以装应用软件;

  • 可以装C/C++的编译软件,将程序输进去,编译软件编译之后成为可执行程序可以运行,都是在操作系统环境下运行的;

  • 计算机只是computer(计算)

机器语言

  • 机器语言是由计算机硬件系统可以识别的二进制指令组成的语言,就是0和1的组合构成的一条条的指令

面向对象的语言

C语言是面向过程的语言,不能够满足需求,出现C++,面向对象的语言

出发点

  • 更直接的描述客观世界中存在的事物(对象)以及它们之间的关系。

特点

  • 面向对象的语言属于高级语言;
  • 最重要的特点 : 将客观事物看作具有属性和行为的对象;
  • 通过抽象找出同一类对象的共同属性和行为,形成类;
  • 通过类的继承与多态实现代码重用。

优点
使程序能够比较直接的反映问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方式来进行软件开发。

  • 计算思维 – – C++的语法比C的更复杂,导致的结果:
    1. 能够更为直接的反映问题域的本来面目。
    2. 面向对象的语言在原来面向过程的高级语言的基础上又多了一些面向对象的语法带来的优点。

方法
要知道新的方法新的技术都是在什么时候因为什么原因要解决什么问题去发展出来的;

了解了现在的技术和过去的历史,将来遇到新的问题才会知道把这个问题向什么方向去推进去解决新问题,所以要从语言,从方法上知道来龙,然后我们自己去把它的去脉创新出来。

为什么需要面向对象语言

  • 最早的程序,目的是用来数学计算,主要工作就是设计求解问题的过程,数学里面的算法,人工手工和用计算机推到出来的还是不一样的,用计算机推导出来的叫数值算法 — 这些方法大多数都有前人研究出来了,新的方法还得靠我们去创新。我们把这些方法用程序员去写出来:顺序的,遇到什么情况进行简单进行选择分支,在什么条件下不断地重复迭代,这样的方法描述清楚后计算机就可以进行计算了(最早的程序就是干这个用的)。

  • 面向过程的程序设计方法就足够了,但是对于庞大复杂的程序仅仅有面向过程的程序设计方法就难以开发迭代和维护了。(什么叫做庞大复杂,仅仅游戏,就足够庞大复杂,那么多角色,动画,策略,武器等等,还有一些社会关系在里面,这样的软就足够庞大复杂了,用面向过程的语言就很难写出来)

  • 最早的窗口软件确实用面向过程语言写的,嵌套n多层的switch case,这样的程序很难维护,稍微庞大一点就很难办了

面向过程的结构化程序设计方法,曾经有很好的优点,但是对于现在的大型复杂程序已经不够用了

面向对象的方法

  • 将数据及对数据的操作方法封装在一起,作为一个相互依存,不可分离的整体—对象 object;
  • 每个对象都有自己的行为能力(如人和动物,behavior),或者有他的功能

这个不像面向过程的程序,每次都得去写,像我让你打杯水,直接告诉你这个object,然后你直接就去打水了,不用一个步骤一个步骤再给你说,这就是面向对象语言的优点

面向过程程序设计有函数,但是一个函数如果作为广泛可复用的东西的话,往往功能很基础,比如sin cos这些三角函数;一个函数如果包罗了很复杂的功能,往往在另外一个场合就没有办法复用,因为情况发生了变化
所以函数作为复用的最基础单位,在大型复杂程序中并不能很满意

模仿现实世界中每一个人,每一件东西,都是一个object,当把它设计好了以后,它就是可复用得了,这就是面向对象的一个重要的思想

  • 对同类型的对象抽象出其共性,形成类;

抽象并不复杂,比如老师给全班同学规定缺一次作业就不给通过,这件事是针对全班同学,那就把全班同学作为一个类,一类人,对于这个类,里面老师定了这样的规则,不区分张三李四,不用管高矮胖瘦,不管个人爱好,等等这些特征都被抽象掉,只关注是否选了这门课,以及学生的基本信息(学号姓名以及成绩表相关的信息),这就是一种抽象,这种抽象是完全可以我们来做的

我们每天都在做这种抽象的事情,很简单,抽象出共性形成类

类通过一个简单的外部接口,与外界发生关系;

就比如,一个投影仪,要用它只要一个按钮,有开有关,有切换到台式计算机有切换到笔记本。不用搭着梯子爬上去把壳打开把里头东西调一调它才会开才会关
所以我们已经习惯了一个对象他的所有细节都已经封装起来了,我们只通过外部接口interface 去操纵它。在程序中,我们也希望能够这样,这就是面向对象的程序设计方法

对象与对象之间通过消息进行通信;

我告诉某人没电池了让他去帮忙拿个电池,这就是一个消息,话说给他了,消息发给他了,他收到了消息(听到)就去拿,他去操作了,在程序中我们也希望对象与对象合作的时候通过这种消息进行通信。

这样做的好处,虽然我们还没学会怎么把程序设计成这个样子,但是C++可以把写成这个样子,把程序设计成这样了,那我对现实世界的理解就可以更直接的转换成程序了,不用说别扭着去写了。程序设计方法越来越发展着就使得程序员越来越可以用我们自己天然的思维方式去写程序,而越来越少的去扭曲这种思维去迁就机器,但是它仍然是计算机的语言,我们仍然在很大程度上要扭曲这种思维去适应机器但是要比面向过程的要好很多

面向对象方法的优点

程序模块间的关系更为简单,程序模块的独立性,数据的安全性就有了良好的保障;
一封装起来了,模块就当然独立了。我们硬件,制造业的构件组装的思想我们都知道,那封装起来的模块当然独立了,换一个零部件很容易,既然封装起来了,里面的数据也就安全了
通过继承和多态性,可以大大提高程序的可重用性,使得软件的 开发和维护都更为方便

  • 具体的对象的概念

一般意义上讲现实中一个实际存在的事物有形的比如一辆汽车,无形的比如像计划,都可以是一个对象,它是构成世界的一个独立的单位

每个对象具有静态特征和动态特征(具有属性和行为)。比如一个人,属性可以有身份证号,姓名,工作单位,电话…等等很多这些都是这个人的属性;另外会有行为,比如说有讲课的能力,有开发软件的能力等等这些行为,像吃饭走路这些都是行为,但是在要解决在一个具体问题时把这个对象的哪些属性(静态特征)哪些动态特征给抽象出来,这是跟要解决的问题是相关的,这以后不存在一个特别严格的定理或者定律,你循着它来就可以把这个对象的东西抽象的特别精确了。

所以程序设计,用一个语言去描述你解决问题的方法,描述是一回事,你去真正把解决问题的方法发明出来,这才是最主要的

一个问题自己会了但是不能有具体的步骤,那就是没有把这个问题的解决思路,没有把这个东西提炼出来成一个算法,没有描述清楚,当然用程序语言写不清楚。所以我们虽然知道这个概念,对象是什么,我怎么去抽象出它的特征来,但是真正要能够准确的抽象出它应有的特征来,跟自己学的东西以及要解决问题的这个领域(比如说做财务软件,做人事软件,你对财务对人事有多少了解,跟这个都有关,而这个跟自己的程序设计经验也有关)

面向对象方法中的对象,就是把现实中的对象抽象出来,在程序中去描述这些对象,用变量去描述它的属性,用函数去描述它的行为,把这些属性和行为封装在一起,形成类,类产生出个体来(对象)。这就是面向对象中的对象。

还有类,分类,人们通常都用分类和抽象的思维方法把它用在程序里,就是我们面向程序设计语言中所说的 类

  • 类是一组同类型对象的属性和行为的抽象。

类和对象之间的关系是什么呢?

比如说模具与铸件之间的关系,一张图纸和按照图纸生产出来的产品之间的关系,这就是类和对象之间的关系

比如说可以把选这门课的学生作为一个类,那么每个人都是这个类里面的一个对象,但是要去访问的时候,去交流的时候,去通信的时候就是我们彼此沟通的时候,肯定是和一个个对象沟通,而不是说跟整个类沟通,整个类,就像是一个磨具,一个蓝图,它并不是一个具体的东西。这就是类与对象的关系

所谓 封装 ,上面已经有了例子,就是把他们都封起来,在程序的格式上会有一对大括号把它括起来,在实际使用上封起来的东西可以使用它的公有外部接口,不能直接使用他的私有的内部细节,这个第四章讲类和对象会详细学习

  • 继承的意义是什么?

讲一个例子: 如果一个青年继承了父亲的产业,在这个基础上去继续发展,他的起点就会高,发展就会更快,就会更大(前提是他不是败家子),如果说从头做起,这个难度,付出的艰辛就要大得多,我们写程序也希望这样

当我们去写程序的时候,我们不希望,一切从头开始,我们希望最好能有很好的基础很好的构件能为我们所使用,我们在这个基础上,去创新新的东西,去把他们组合起来,就形成了一个程序,这就好很多。

继承就让我们做这件事情,我们在已有的程序模块的基础上,也就是类的基础上,去衍生出新的功能来,这个过程就是一个继承的过程

  • 多态性

实际上我们现实中也有这样的例子,我们再看加法的例子:数的加法,实数复数其规则是不一样的,这时候让一个中学生做一个加法题,给他两个实数让他去做加法他会做;给他两个复数让他做加法,不用给他说请你用复数相加的方法去加两个复数,用实数相加的方法去加两个实数,没有必要,写出来的是复数,自然要用复数相加的方法

这个就是我们习惯的多态。现在我们希望程序中也支持这样的多态

这一点在C语言中并不太好实现,必须写两个加法函数,因为它加的方式是不一样的,两个加法函数在同一个作用域的范围之内,能用同样的名字吗,肯定不行,但是现实中就是这样的,打乒乓球打篮球打羽毛球打排球等等,都用同一个打字,我们不用再去修饰它,我们希望在程序中也能够这样,C++,java都可以这样

  • 我们要了解程序设计在整个软件的生命周期中起了什么作用,是在什么样的地位,所以我们要简单的了解一下 面向对象的软件工程的过程
    那么要开发一个软件,做一个软件的项目,首先要做系统分析,系统分析搞清楚自己要干什么:分析客户的需求,分析系统的需求,这个分析的方法也有面向对象的分析方法。我们的课程里不讲系统分析
    另外就是要做系统设计,要对这个系统首先有了设计才能写程序,设计还可以再细分,在设计的不同阶段,我们也不去细讲它,设计好了才去写程序,而我们这门课,是学习写程序,所以学完了以后会觉得有些复杂的东西怎么不会做,有些难度比较高的程序自己怎么不会写,怎么不知道从哪里入手
    当然在我们程序设计课程里面,在某些程度上也会讲软件怎么设计,但是都是规模很小的,很简单的软件。一个大规模的软件系统,不是学过编程就会去做的。系统设计,软件工程,有专门的课程去学习,一个好的架构师,不是你编过三天程序就可以当的。
    我们学的东西只是很少的一点,但是作为公选课的学生,了解了大致的程序设计方法,一般的,有了现成的数值计算方法以后,非计算机专业本领域的科学研究的实验数据的处理,建模这些问题,基本上就都可以应付了。
  • 开课公选目的:
    在本专业的科学研究的时候能够做一些基本的数据处理,基本的建模去模拟,但是特别复杂的东西,要有一种概念,或者再学一个学位,把计算机科学或者计算机软件给学了,或者和相关的软件人员去合作,来做更复杂的系统开发。千万不要认为我学过某种语言于是可以写大型软件,也许废了很大的力气写了一个看似还比较大的东西,但是其寿命可能不会太长,出了错改起来特别费劲,升级很费劲,因为很多软件开发的过程,那些方法,那些东西还没有学。
  • 现在因为计算机的普及,大家可能有个误会

我会操作计算机了,我有学过几门计算机语言了,于是感觉软件专业计算机专业有什么呀,你能做的事情我都能做了。如果你都想做请你把这些课程都学完了,才会知道,现在自己能做了,不然可能要做很多事倍功半的事情。

这就是为什么我们学习程序设计要知道它在整个软件生命期中,它在什么地位。后面还有更重要的,测试。真正要求可靠性非常高的软件百分之七八十都应该花在测试上

测试在软件开发中
非常重要,不经过严格的测试,不花大力气去测试,做的软件不可能稳定运行,如果是关键的软件,会造成巨大的损失千万不要以为,我很牛,我开发出来的软件不会出错。
任何人开发出来的软件一定有错,只是这个错误你有没有发现,错误多与少,这个错误有没有被发现,有没有暴露出来。

我们这样来看,我们都在用微软的操作系统,尽管我们经常骂这个操作系统这里不好那里不好天天打补丁天天出漏洞,天天被黑客给攻破了,说这个操作系统多么多么不好,如果微软这么规模强大的实力强大的公司,他不是不想开发新软件,不是故意留漏洞,他也想拿出来个好东西让大家不要骂他,让人花钱买它,但是它不可避免地还是有那么多的bug,有那么多的漏洞出现了,那比我们自己一个小团队,我们一个小个体,敢说我们写的软件不会出错吗。所以测试非常重要。

  • 还有一个非常重要的阶段就是维护

维护也就在使用的过程中一方面是发现了你的软件,通过测试在使用中还会发现问题的。所以windows系统天天打补丁,这是必然的会发现问题的,发现了问题要去修补。还有当用户的需求有更多的变化的时候,软件需要去升级,这些都是维护

所以我们讲开发一个软件,他的可维护性也要好。

当发现问题时,你改不了;当用户需求有一点点增加时,你说对不起你需求增加了这个我没法改,我不知道去哪儿改,我找不出来改的办法,我这牵一发而动全身,这全错了,那么好,你的软件被淘汰。你想当今社会用户对软件的需求增加的非常快,所以所有的软件版本不断在提高,提高一个软件的版本和从头开发一个新的软件这差别太大了,所以必须在开发的过程中就考虑到软件的可维护性,合起来是一个软件的生命周期,写程序在其中只是一小部分。
所以如果一个人对外说自己是软件工程师,对方还会考虑一下这是个什么水平的软件工程师,他大概怎么样。或者说我是个架构师,我是系统分析员,别人会觉得这个水平还是蛮高的。如果说我是一个程序员,一个programmer,那应该是什么水平呢,在计算机专业里面,应该是一个高职的水平(职业高中里面)

在什么场合需要什么样的人

你可能感兴趣的:(C++)