类与对象、抽象、封装、继承、多态以及举例

类与对象

在我们熟悉的现实世界中,一切事物都是对象。对象可以是有形的,比如房屋、汽车、飞机、动物、植物;也可以是无形的,比如一项计划。对象可以是一个简单的个体,比如一个人;也可以由诸多其他对象组合而成,比如一个公司有多个部门,每个部门又由许多人组成。对类似的对象进行抽象,找出其共同属性,便构成一种类型。这些都是我们在现实世界中所熟悉的概念和方法。编写程序的目的是描述和解决现实世界中的问题,第一步就是要将现实世界中的对象和类如实地反映在程序中。作为一种面向对象的程序设计语言,C++支持这种抽象。将抽象后的数据和函数封装在一起,便构成了C++“类”。

面向对象程序设计的基本特点

抽象

面向对象方法中的抽象,是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。**抽象的过程,也是对问题进行分析和认识的过程。**在面向对象的软件开发中,首先注意的是问题的本质及描述,其次是解决问题的具体过程。一般来讲,对一个问题的抽象应该包括两个方面:数据抽象和行为抽象(或称为功能抽象、代码抽象)前者描述某类对象的属性或状态,也就是此类对象区别于彼类对象的特征;后者描述的是某类对象的共同行为或功能特征。

例子

首先我们在计算机来上实现一个简单的时钟程序。通过对时钟进行分析可以看出,需要3个整型数来存储时间,分别表示时、分和秒,这就是对时钟所具有的数据进行抽象。另外,时钟要具有显示时间、设置时间等简单的功能,这就是对它的行为的抽象。用C++的变量和函数可以将抽象后的时钟属性描述如下:

数据抽象:
int hour,int minute,int second
功能抽象:
showTime(),setTime()

可以看出,对于同一个研究对象,由于所研究问题的侧重点不同,就可能产生不同的抽象结果。即使对于同一个问题,解决问题的要求不同,也可能产生不同的抽象结果。

封装

封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机的结合,**形成“类”,**其中的数据和函数都是类的成员。例如在抽象的基础上,可以将时钟的数据和功能封装起来,构成一个时钟类。按照C++的语法,时钟类的定义如下:

class Clock					//class关键字  类名
{
public//外部接口
	void setTime(int newH,int newM,int news);	//行为,代码成员
	void showTime();							//行为,代码成员
private:					//特定的访问权限
	int hour,minute,second;						//属性,数据成员
};

这里定义了一个名为Clock的类,其中的函数成员和数据成员,描述了抽象的结果。“{”和“}”限定了类的边界。关键字public和private是用来指定成员的不同访问权限的
声明为public的两个函数为类提供了外部接口,外界只能通这个接口来与Clock类发生联系。声明为private的3个整型数据是本类的私有数据,外部无法直接访问。
可以看到,通过封装使一部分成员充当类与外部的接口,而将其他成员隐蔽起来,这样就达到了对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度,进而增强数据的安全性和简化程序编写工作。
将数据和代码封装为一个可重用的程序模块,在编写程序时就可以有效利用已有的成果。由于通过外部接口,依据特定的访问规则,就可以使用封装好的模块。使用时可以不必了解类的实现细节

继承

现实生活中的概念具有特殊与一般的关系。例如,一般意义的“人”都有姓名、性别、年龄等属性和吃饭、行走、工作、学习等行为,但按照职业划分,人又分为学生、教师、工程师、医生等;每一类人又有各自的特殊属性与行为,例如学生具有专业、年级等特殊属性和升级、毕业等特殊行为,这些属性和行为是医生所不具有的。如何把特殊与一般的概念间的关系描述清楚,使得特殊概念之间既能共享一般的属性和行为,又能具有特殊的属性和行为呢?
**继承,就是解决这个问题的。**只有继承,才可以在一般概念基础上,派生出特殊概念,使得一般概念中的属性和行为可以被特殊概念共享,摆脱重复分析、重复开发的困境。C++语言中提供了类的继承机制允许程序员在保持原有类特性的基础上,进行更具体、更详细的说明。通过类的这种层次结构,可以很好地反映出特殊概念与一般概念的关系。

多态

面向对象程序设计中的多态是对人类思维方式的一种直接模拟,比如我们在日常生活中说“打球”,这个“打”,就表示了一个抽象的信息,具有多重含义。我们可以说:打篮球、打排球、打羽毛球,都使用“打”来表示参与某种球类运动,而其中的规则和实际动作却相差甚远。实际上这就是对多种运动行为的抽象。在程序中也是这样的,上一篇文章中重载函数就是实现多态性的一种手段。
从广义上说,多态性是指一段程序能够处理多种类型对象的能力。在C++语言中,这种多态性可以通过强制多态、重载多态、类型参数化多态、包含多态4种形式来实现。
**强制多态是通过将一种类型的数据转换成另一种类型的数据来实现的,也就是前面介绍过的数据类型转换(隐式或显式)。**重载是指给同一个名字赋予不同的含义。
包含多态和类形参数化多态属于一般多态性,是真正的多态性。C++中采用虚函数实现包含多态。虚函数是多态性的精华,将在后面介绍。

例子:写一个complex类

main.cpp

#include <iostream>
#include "mycomplex.h"

using namespace std;

int main(void)
{
    Complex c;
    c.setReal();
    c.setImage();
    c.show();

    Complex *p;
    p = &c;
    p->show();

    Complex &ref = c;
    ref.show();
    return 0;
}

mycomplex.h

#ifndef MYCOMPLEX_H
#define MYCOMPLEX_H

class Complex
{
public:
    void show();
    void setReal(double r = 0);
    void setImage(double i = 0);
private:
    double real;
    double imag;
};

#endif // MYCOMPLEX_H

mycomplex.cpp

#include <iostream>
#include "mycomplex.h"

using namespace std;

void Complex::show()
{
    cout << real << "+" << imag << 'i' << endl;
}

void Complex::setReal(double r)
{
    real = r;
}

void Complex::setImage(double i)
{
    imag = i;
}
  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值