上一讲鸡啄米讲了函数重载和函数模板以后,C++和C语言相似的语法就剩下后面要讲的数组了,这一讲开始鸡啄米就要讲C++所特有的一些概念和思想了。本节编程入门教程主要讲面向对象程序设计的基本思想和特点。另外,说明一点,以后鸡啄米会加一个大的教程分类,让大家更好的对琐碎的知识进行分类,比如这一讲的大的分类叫“类与对象”,标题是面向对象设计的基本思想和特点。
在编程入门教程的前言中,鸡啄米已经简单讲到了面向对象程序设计的几个基本概念,这一讲将做更深入的讨论。
计算机技术飞速发展,软件开发技术也同样经历了各种各样的变化,从早期的面向过程的结构化程序设计,到面向对象的程序设计,其实都是在寻找一种更能够提高可扩展性和可复用性的程序设计方法,这样才能更大限度的提高软件开发效率。现在的面向对象程序设计方法(OOP)通过抽象、封装、继承等手段,已经成为目前最能提高可扩展性和可复用性的程序设计方法,能够最大限度的提高软件生产能力,降低软件开发和维护的费用。
在面向对象程序设计方法之前普遍使用的是面向过程的结构化程序设计方法,它的主要思想就是,将一个复杂问题根据功能等分成一个个子问题,然后再接着细分,直到分解成具体的语句,这种方法固然有很多优点,但是有个比较大的缺点就是,这种方法中数据和函数是分开的,如果我们要修改数据结构,则有关的函数都必须修改,这样不但维护成本比较大,而且很容易遗漏一些应该修改的地方。
面向对象程序设计方法是对面向过程程序设计方法的继承和发展。这种程序设计方法认为,现实世界是由一些互相关联的实体组成的,这些实体就是面向对象方法中的对象,而对一些对象的共性的抽象描述,就是面向对象程序设计方法中最核心的概念--类。面向对象的程序设计方法就是运用面向对象的思维来描述现实问题,再用计算机语言解决该问题,这里的解决就是靠类和对象实现的,是对现实问题的高度概括、分类和抽象。
鸡啄米下面讲下面向对象程序设计方法的基本特点:抽象、封装、继承和多态。
1.抽象
面向对象方法中的抽象是指对具体问题即对象进行概括,抽出一类对象的共性并加以描述的过程。面向对象的软件开发中,首先应该对要解决的问题抽象成类,然后才是解决问题的过程。抽象有两个方面:数据抽象和行为抽象。数据抽象是描述某类对象的属性或状态,,行为抽象是描述某类对象的共同行为或共同功能。
鸡啄米就拿时钟给大家举个例子,要实现有关时钟的程序,首先要对时钟进行抽象。时钟有时、分、秒,我们用三个整型变量来存储,这就是数据抽象。时钟有显示时间和设置时间等功能,这就是行为抽象。用C++语言描述就是:
时钟(Clock):
数据抽象:
int Hout; int Minute; int Second;
行为抽象:
ShowTime(); SetTime();
上面并不是真正的C++代码,只是简单的列出了数据成员和函数成员的代码片段。
2.封装
把抽象出来的数据成员和函数成员结合形成一个整体,就是封装。封装的时候,我们可以把一些成员作为类和外界的接口,把其他的成员隐藏起来,以达到对数据访问权限的控制,这样可以使程序的各个部分改变时最低程度的影响其他部分,程序会更安全。
把数据和函数封装为一个可复用的模块,开发时可以利用已有的成果而不必每次都重复编写。我们只需要通过类提供的外部接口访问模块,并不需要知道内部的细节。C++中就是利用类的形式来实现封装的。下面是鸡啄米上面提到的时钟的具体封装形式及时钟类:
class Clock // class是关键字 Clock是类名 { public: // 提示下面是外部接口 void SetTime(int NewH,int NewM,int NewS); // 行为,函数成员 void ShowTime(); // 行为,函数成员 private: // 特定的访问权限 int Hour,Minute,Second; // 属性,数据成员 };
这是一个完整的类的声明。它声明了一个名为Clock的类,其中的数据成员和函数成员是前面分析得到的抽象结果。关键字public和private是用来指定成员的不同访问权限的,至于具体访问权限的问题后面课程中会讲到。声明为public的两个函数为类提供了外部接口,外界只能通过这两个接口跟Clock类联系。声明为private的三个整型数据是类的私有数据,外部无法直接访问。我们可以看到,这种访问权限的机制有效实现了对数据的隐藏。
3.继承
我们在软件开发过程中,可能已经有了前人的一些现有的成果,我们没有必要再重新去编写,那么我们怎样利用这些已有的模块呢?还有可能我们对以前写的程序有了更新的认识,需要融入一些新的认识,那怎么办呢?
这些都可以通过继承来实现,C++语言提供了类的继承机制,让我们软件开发者可以在保持原有特性的基础上,进行更具体、更详细的说明。通过继承我们可以利用之前已经有的程序模块,还可以添加一些新的数据和行为,这在很大程度上提高了程序的复用性,大大节约开发成本。关于继承,后面的课程也会具体讲。
4.多态
多态就是类中具有相似功能的不同函数使用同一个名称。上一讲中讲的重载函数就实现了多态。利用多态可以对类的行为再抽象,抽象成同一个名称的功能相似的函数,减少程序中标识符的个数。多态是通过重载函数和虚函数等技术来实现的,虚函数后面也会详细介绍。
这一讲鸡啄米认为,是属于软件开发思想方面的东西,在编程入门时可能不是很好理解,但是大家能掌握多少就尽量掌握吧,在以后大家真的实践了一些方法再来理解的话就很简单了,一句话,不要认为它有多难!