大家好,欢迎来到北京大学程序设计实习网站课程,
我是北京大学计算机科学技术研究所的刘家瑛, 很高兴和你一起分享本学期的程序设计之旅。
在正式掀起C++大门之前呢,我想先在这一小节
和大家简单聊一聊什么是面向对象的程序设计方法。
来到我们这门课的同学都默认大家呢有一定的程序设计基础,
虽然不都像是郭老师一样的码神,但至少,都像我一样,勤勤恳恳做过码农。
写过或长或短的程序。 当你编写这些程序,让代码在IBE里面编译运行的时候,
你是否考虑过这样的一个问题? 现有的结构化程序设计是否满足你对与程序设计的需要呢?
有同学就会问了,什么是结构化的程序设计方法呢?
其实结构化的程序设计的基本思想就是讲一个
复杂的大问题层层的分解开进行模块化, 生成了若干个小的子问题,
那么将一个庞大的程序划分成为不同的功能模块,
若干个函数来形成, 那么没一个模块呢,都可以由不同的开发人员设计来实现。
同时呢,他们要共同约定好相互的通讯和协作接口就可以了。
所以结构化的程序设计呢就是这样一种,自顶向下逐步求精的过程。
那么图灵奖的获得者,PASCAL语言的设计发明人Worth曾经就结构化程序设计设计呢,
做过一个非常精辟的概括。
这就是我们所熟悉的程序等于数据结构加上算法。
其中数据结构呢对应就是我们编写代码时候的变量, 算法呢,就是以函数的形式来实现的。
在程序设计当中呢,算法其实就是来操作数据结构的。
但是在结构化程序设计设计中呢,算法呢和数据结构又是完全分离开的。
我们很难知道说具体某一个算法操作了哪几个数据结构,
或者某一个数据结构是由哪几个算法来进行处理的。
所以呢,在结构化的程序设计设计当中,我们所熟悉的程序模式呢就是这样的一张图。
程序终结呢包含了一个main函数和若干个函数以及
子函数。那么函数直接呢有着一定的调用关系。
为了去描述程序整个的一些状态,我们还去定义了一系列的全局变量,
那么这样的一个关系图呢,随着程序规模的不断变大,会变得非常错综复杂难以说明,
就不要说去进一步的进行开发和维护了。
所以呢,我们在结构化程序设计设计当中会遇到许多问题,
总结起来呢, 有不得不面对的四大囧境。
首先就是理解难,随着程序规模的增加,程序变得非常难以理解。
很难一下子在程序当中呢看出具体某个数据结构和函数直接是一个什么样的关系。
任何两个函数之间存在着怎么样的调用关系呢?也很难清楚的知道。
其次就是修改难。因为结构化设计本身是没有封装的概念的。
所以如果我们想要修改其中某一个变量定义的时候,
就必须把所有访问该变量的语句全部找出来才能修改。
这样呢,非常不利于程序本身的维护和扩充。 第三,就是查错难。
当某个数据结构的值不正常的时候,因为本身程序呢关系错综复杂,
很难找出到底是哪个函数所导致的。最后就是重用难。
我们在编写程序的时候,通常呢是希望可以使用一些现有程序当中
已经有的或者类似的实现。
在结构化的程序设计设计当中呢,随着程序规模的不断增大, 由于程序关系本身错综复杂,
所以想要抽取其中需要的部分代码就会变得十分的困难。
所以结构化程序设计设计所面临的四大问题中间
严重制约了软件业本身的开发。
所以呢,面向对象的程序设计方法就应运而生了。
我们经常会说,业界需要面向对象。
因为软件业的目标呢是更快、更正确、
更经济地去建立软件。我们希望更高效地实现函数的复用。更清晰的实现变量函数之间的关系。
我们希望使得程序呢更加易于修改和维护。
那么面向对象的程序设计方法本身它继承了结构化设计的优点,
同时呢又克服了结构化程序设计当中的一些不足。 它的设计思路呢更加接近于我们的现实生活。
我经常在班上开玩笑给同学们讲,说,面向对象是一种生活态度。
因为不同于结构化的程序设计,将一个大的问题进行逐层的模块化,
面向对象的程序设计呢,针对需要解决的问题
通常是去分析说这之间呢包含了哪些具体的事物,
每个事物都有哪些的特点。不同事物种类之间又存在着怎么样的关系。
事物间呢,又是如何去作用的。 所以有了这样的一类的事物呢,面向对象的程序设计方法呢也就变得更加直观化了。
我们刚刚ii提出的那个等式呢,就在面向对象程序设计时进行了一定的修改。
那么每一个面向对象的程序呢其实就是去构建
不同的类,而设计程序过程,的这个过程呢,本身就是一个去设计类的过程。
所以呢,对于面向对象的程序设计方法,
就是将一类客观事物的共同属性呢归纳出来,
形成一个数据结构,当然你可以用多个变量去描述这一类事物的属性,
同时呢,也可以讲这一类事物所能进行的一些行为和操作归纳出来,
形成一个个函数,同时呢,这些函数又可以来操作
具体的数据结构。那么这样的一个过程呢我们把它称之为
叫做抽象。之后呢,我们可以通过一些语法形式
将数据结构和算法呢对应的捆绑在一起, 形成一个叫做类,
那么是的数据结构和操作
这些数据结构的算法呈现出这样的一个非常紧密的关系的过程呢
我们把它称之为叫做封装。那么对于抽象,
封装这两个呢,就是面向对象程序设计当中
的一个基本概念。除此之外呢,还有两个基本概念,分别是继承和多态。
那么这两个特征呢我们将会在后续的课程中间给大家进行介绍。
那么有了这样的一个类的设计之后,我们就会看到,在面向对象的程序当中,
就会包含一个main函数之外呢,会有一系列的类,
在每一个类之内呢,又包含了
一些特定的数据结构和相应的函数关系。
那么每个类和每个类直接呢, 它们也存在着一定的关系。
但是由于有了这样类的一个封装, 我们就可以看到整个程序呢就变得非常清晰化和条理化,
那么在后续的程序开发当中,我们也会了解到,它呢会带来更进一步的好处。
那么在想到面向对象的程序设计时呢,
我就一下联想到最近非常流行的一部电影。叫做Despicable
Me里面的一个例子。
如果你是Gru的话,面对手下这样千姿百态的minion,你会怎么去处理呢?
如果你希望去创建一个新的minion,
或者去修改一个现有的minion,你会怎么做呢?
你总不可能说把这样一类问题去进行
功能模块划分,或者说去对现有的minion去进行一定的这个呃,排序
或者说一些其他的操作。
那么最直观的方法,其实就是把这样一类对象
中间的共同属性呢抽象出来,形成一个称为叫minion的类,
那么这些千姿百态的minion它其实具有
非常强的、很多共同的特点,以及会有很多共同的行为。
那么这些所谓共同的特点属性和行为呢,就被定义在这样的一个class
Minion中间, 那么它包含了一系列的共同属性,比方说,minion的名字啊,
头发的颜色,眼睛的个数,身上穿的衣服的种类等等。
此外呢,它还包含了一系列minion的行为或者是你对minion的一些操作,
比方说你可以获取这个minion的名称, 你可以去数一数这个minion本身眼睛的个数,
以及去设置minion头发的颜色和穿着打扮等等。
那么有了这样的一个class Minion之后,
如果我们想去生成新的minion对象就变得非常容易了。
我们可以去具体实例化,
或者说对minion其中的一个成员属性进行赋值,
之后呢,就会生成一些新的不同样式的minion。
那么这样其实就是一个最最简单的由一类事物抽象成一个类,
再由一个类去生成新的实例化的对象的一个过程。
在有了一个直观的了解之后呢,我们来看一看C++语法
本身对于类的定义。那么关于类的话呢,
首先是利用一个关键字class来定义这个类,
之后呢,根据这个类名,是你定义的这个类本身的名称,
那么关于类的具体内容呢,你可以把它卸载这样的一对 大括号里面,就像结构体一样,
那么要注意呢,就是每一个类的结束,大括号之后呢要有这个分号,
那么在这个具体的类定义当中呢,我们可以定义一系列的成员变量, 以及成员函数,那么
对于,每一个成员变量和成员函数呢,又可以定义它相应的访问范围。
那么通过访问范围说明符,就可以声明说
这个成员变量或者成员函数具体可以在什么地方被访问到。
那么这就是关于类的一个最基本的一个定义。
那么关于它其中的一些具体的使用方法以及
展开的一些说明呢,我们会在后续的课程呢给大家进行介绍。
好,那我们今天的课程呢,
就到这里,很高兴和大家一起共同出发,去学习本学期的程序设计实习课程。