前言
C++是基于面向对象的语言,并不是纯面向对象的语言,因为它包含c的部分,c是面向过程的语言。
面向对象程序设计的基本特点
抽象
- 抽象是人类认识问题最基本的手段之一。它同我们平时所认为的抽象不同,在面向对象程序设计中,抽象指的是对具体问题(对象)的公共性质加以描述的过程。抽象的过程,也是对问题进行分析和认识的过程。在面向对象的软件开发中,首先注意的是问题的本质及描述,其次是解决问题的具体过程。一般来讲,对一个问题的抽象应该包括两个方面:数据抽象和行为抽象(或称为功能抽象、代码抽象)。前者描述某类对象的属性或状态.也就是此类对象区别于彼类对象的特征(一般可以理解为数据成员);后者描述的是某类对象的共同行为或功能特征(一般可以理解为函数)。
- 举例说明:
- 首先在计算机上实现一个简单的时钟程序,通过对时钟进行分析可以看出,需要3个整型数来存储时间,分别表示时、分和秒,这就是对时钟所具有的数据进行抽象。另外,时钟要具有显示时间、设置时间等简单的功能,这就是对它的行为的抽象。用C++的变量和函数可以将抽象后的时钟属性描述如下。
- 数据抽象:
int hour, int minute,int second
- 功能抽象:
showTime(), setTime()
- 同样的,我们可以对人类进行抽象。人的共同属性有,性别,年龄等,一般功能有行走,吃饭等抽象后:
- 数据抽象:
string name,char sex,int age;
- 功能抽象:
walk(double distense),eat();
封装
封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机地结合,形成“类”,其中的数据和函数都是类的成员。例如在抽象的基础上,可以将时钟的数据和功能封装起来,构成一个时钟类。按照C++的语法,时钟类的定义如下:
class Clock //class关键字类名
{ //边界
public: //外部接口
void setTime(int newH, int newM, int newS); //行为,代码成员
void showTime() ; //行为,代码成员
private: //特定的访问权限
int hour, minute, second; //属性,数据成员
); //边界
声明为public的两个函数为类提供了外部接口,外界只能通这个接口来与Clock类发生联系。声明为private的3个整型数据是本类的私有数据,外部无法直接访问。若不写关键词的话C++中是默认为private ,如下
class Clock
{
int hour, minute, second; //这里的数据便是默认为private
public:
void setTime(int newH, int newM, int newS);
void showTime() ;
);
继承
在现实世界中,不同人有着格子的特点,但是同样有着相同的技能 如吃饭、行走、工作、学习等行为,但按照职业划分,人在社一任师、图生等,每一类人义有各自的特殊属性与行为,例如学生具有专业,年级等特殊属性和开级。毕业等符殊行为,这些属性和行为是医生所不具有的。如何把特殊与一般的概念间的关事描述清楚,使得特殊概念之间既能共享一般的属性和行为,又能具有特殊的属性和行为呢?
继承,就是解决这个问题的。只有继承,才可以在一般概念基础上,派生出特殊概念,负得一般概念中的属性和行为可以被特殊概念共享,摆脱重复分析、重复开发的困境。C++语言中提供了类的继承机制,允许程序员在保持原有类特性的基础上,进行更具体、更详组的说明。通过类的这种层次结构,可以很好地反映出特殊概念与一般概念的关系。
多态
面向对象程序设计中的多态是对人类思维方式的一种直接模拟,例如在日常生活中说“打球”,这个“打”,就表示了一个抽象的信息,具有多重含义。可以说:打篮球、打排球、打羽毛球,都使用“打”来表示参与某种球类运动,而其中的规则和实际动作却相差甚远。实际上这就是对多种运动行为的抽象。在程序中也是这样的,第3章介绍的函数重载就是实现多态性的一种手段。
从广义上说,多态性是指一段程序能够处理多种类型对象的能力。在C++语言中,这种多态性可以通过强制多态、重载多态、类型参数化多态、包含多态4种形式来实现。
- 强制多态是通过将一种类型的数据转换成另一种类型的数据来实现的,也就是数据类型转换(隐式或显式)。重载是指给同一个名字赋予不同的含义。这两种多态属于特殊多态性,只是表面的多态性。
- 包含多态和类形参数化多态属于一般多态性,是真正的多态性。C++语言中采用虚函数实现包含多态。虚函数是多态性的精华。模板是C++语言实现参数化多态性的工具,分为函数模板和类模板两种。