类和对象的本质

类和对象的本质

本文适合于对于初学者理解类和对象的概念
8.1 面向对象程序设计基本概念
1.类、对象、抽象、实例基础(初学者必须理解这些概念)
应重点理解类与对象的区别、类与类型。
(1)对象:指的是任何需要设计的东西,比如人、飞机、动物、三角形、学校、项目计划、一个整数等都可以是对象。
(2)对象都具有某些特性或行为,对象的特性也被称为对象的属性。
(3)对象的特性(属性)一般用于描述对象所拥有的特征,所以一般都是静态的。比如三角形对象,它的特性包括三角形的边长、每个角的角度、三角形的高等;再比如电视机对象的特性有颜色、重量、长、宽、高、屏幕大小等。
(4)对象的行为用于描述对象所拥有的功能或对对象的操作,所以对象的行为一般是动态的。比如三角形对象,它的行为包括计算三角形的周长、面积等;再比如电视机对象的行为有调整电视机的亮度、对比度、颜色及对电视机进行频道切换等。
(5)对象的特性(属性)在程序设计语言中一般使用变量来实现;对象的行为(或功能)在程序设计语言中一般使用函数来实现。
(6)类:是具有相同特性和行为的对象的一个模板(或者框架)。因此,类是对具有共同特性和行为的对象进行的一次归纳(或归类),从而形成一个模板或框架。比如等腰三角形、等边三角形等所有三角形对象,因为这些对象都具有三角形的共同特性(如边长)和行为(如计算面积),因此可以将这些对象归为“三角形”,三角形就成为一个类,可以称其为“三角形类”,从而“三角形类”就成为所有三角形的一个模板或框架;再比如美国人、中国人、法国人这些对象都可以被归为“人”这么一类,因此“人类”就成为这些对象的一个模板或框架。可见,单独说一个类时并不知道具体代表什么对象,但知道这些对象拥有什么特点,比如单独说“人类”,并不会知道指的是美国人、中国人还是日本人,但却知道“人类”拥有的特点。
(7)抽象:就是将对象的特性或行为进行归类的一个过程。比如将美国人、中国人、法国人这些对象归为“人类”的过程被称为抽象,也可以这样说,把美国人、中国人、法国人抽象为“人”这样一个类。同理,可以把等腰三角形、等边三角形抽象为“三角形类”。
(8)实例概念及类与对象的区别:对实例最简单的理解就是指“例子”,从对象和类的概念可以看到,对象是具体存在的,是实实在在指的某一事物;而类则只相当于具有共同特性和行为的对象的一个模板或框架,因此可以说对象是具体的,对象是类的一个实例或特例或例子。而产生类的过程是对具有共同特性和行为的对象的归类,这个归类的过程被称为抽象,因此也可以说类是对象的抽象。比如等腰三角形对象就是三角形类的一个实例,等腰三角形只是众多三角形类中的一个具体的三角形而已,它是所有三角形当中的一个实例或一个例子或一个特例。而三角形类是三角形对象的抽象,是三角形对象的一个模板。
(9)类与类型:其实类就是一种类型,只是这种类型相对于简单的内置类型而言看起来更复杂而已,在程序设计语言中被称为“自定义类型”或“抽象数据类型”,而程序设计语言中的类型被称为“内置类型”(比如整型、浮点型等)。在C++声明章节中已经讲过,类型决定了对象的内存大小、布局和取值范围,决定了可以对该对象进行什么样的操作(比如进行加法、减法运算等),决定了可以将什么数据赋给对象,而C++中的类都具有这些功能。
2.C++类和对象的实现
(1)C++类的实现:C++使用关键字class来实现类。比如class A{int a; int b,c ; void f();};, 表示定义一个类A,这个类有三个数据成员变量a、b、c,还有一个成员函数f(),若使用变量a、b、c表示三角形的三条边的长度,使用函数f()实现计算三角形的面积,那么就可以说类A实现了三角形类。
(2)C++对象的实现:使用由C++定义的类就可以创建对象了,其方法与创建一个变量相同,在使用C++的类时,就和使用C++的“内置类型”相同,只是C++的类是“用户自定义类型”而已。比如class A{…}; ,则实现对象的方法为A ma;,其中ma是类A的一个对象;再比如A mb, mc;,其中mb、mc是类A的对象。
(3)创建对象时需要为对象指定属性值:因为对象是具体指的某一事物,因此在创建对象时必须为对象的属性指定具体的值。比如A ma;表示使用默认值来指定对象ma的各属性值,其实就是为类A中的所有变量指定初始值。当然,对象ma的属性值是其专有的,并不属于整个类,也不会影响到类A创建的其他对象的属性值。也可以使用非默认值来初始化对象的各属性值,其具体方法详见后文。
(4)C++创建的对象是各自独立互不影响的。比如A ma, mb;,其中对象ma和mb是互不影响的,虽然它们使用的都是相同框架类A中的变量,但创建对象后,该对象就拥有这些变量的值,且各自独立,改变对象ma的属性并不会影响到mb。假如ma指的是等腰三角形,mb指的是等边三角形,改变等腰三角形ma各边的长度,肯定不会因此而改变等边三角形mb各边的长度。
(5)在C++中,类其实就是一种类型,只是这种类型比一般的内置类型(比如int类型)更复杂。而类的对象其实就是变量,只是该变量的类型是一个类,是“自定义类型”而已。
3.设计类的方法简介
(1)设计类的关键要点是能从所有对象中找出这些对象的共同特性和行为,然后进行抽取。特性一般描述的是某个对象所需的数据(比如三角形的边长,汽车的长、宽、高、颜色等),行为一般描述的是对象所能提供的功能或操作(比如汽车的舒适性、易操作性等可能就要根据汽车的某些数据进行综合估算后才能确定,计算三角形的面积或周长)。
(2)使用C++语言实现类时,一般使用变量来表示对象的特性(比如三角形的边长、人的高度等),使用函数来表示对象的行为(比如计算三角形的面积、周长等)。
(3)下面以所有的三角形对象为例进行介绍。
① 类:将这些对象所拥有的共同特性和行为使用一个类来表示,比如使用三角形类。
② 抽取共同的特性和行为:三角形类应包含所有三角形对象的基本共同特性和行为,比如包含的特性有边长、高,包含的行为有计算三角形的面积、周长等。
③ 对象和类的差别:三角形类的具体对象具有明确的边的长短和高的数据值,还包括具体的行为,类只是对象的一个框架或模板,类没有三角形边长的具体数据和高的具体值。这里三角形类是所有具体的三角形对象的一个整体模板或框架,而三角形对象则具体指明了是一个什么样的三角形(比如等边三角形、等腰三角形等)。这里可以看到三角形类相对于具体的三角形对象而言是抽象的、不具体的(因为使用类无法表示一个具体的三角形),而每个三角形对象都是三角形类的一个具体的例子(或实例),都能明确地确定或指明一个三角形。
④ 使用C++语言实现类的大概过程如下。
 创建一个三角形类,比如其名称为A,其语法为class A;。
 使用变量表示所有三角形对象的特性。假设只指定三角形的三个边长,因此可以使用三个浮点型变量来表示三角形的三个边长,比如使用float类型的变量a、b、c分别表示三边的长度。
 使用函数表示所有三角形对象的行为。假设使用函数f和g分别来计算三角形的面积和周长。
 因此,三角形类A应包含三个浮点型变量a、b、c和两个函数f和g,其完整形式为class A{float a,b,c; float f(); float g();};。此处可以看到,类只是具有共同特性和行为的一个模板或框架,类无法明确地指定一个事物。
 使用三角形类创建对象时,必须为对象指定具体的属性值,以确定是一个什么样的对象。比如A ma;,创建三角形类A的一个三角形对象ma,这里表示使用默认值初始化对象的三个属性(变量)a、b、c,以后可以修改这些属性的值,当然也可以在创建对象时指定初始值。
4.继承与多态性
(1)继承:是在现有类的基础上进行的扩展。也就是说,继承是在之前的类的基础上,增加了对象的一些更具体的共同特性和行为,继承之后的类将拥有之前的类的特性和行为。比如可以把人类细分为中国人类、美国人类等,中国人类、美国人类都具有人类的特性和行为,如身高、体重等,但其又具有自己的特性,如国籍、肤色等,因此中国人类、美国人类可以继承人类,这样可减少一些重复的代码。
(2)父类和子类:被继承的类称为父类或基类,继承之后的新类称为子类或派生类。
(3)多态性:此处的多态是相对于具有继承关系的类而言的,指的是对于这些由继承而来的不同的类所产生的对象,执行相同的操作或功能时,其反应各不相同的情况。比如A、B、C是同一年级而不同班级的三个学生,当他们听到上课铃声时,会进入不同的教室去上课。
(4)静态多态性和动态多态性:静态多态性在编译时就能确定所引用的对象;动态多态性需要运行时才能确定所引用的对象。函数重载就是最简单的静态多态性。
(5)C++继承与多态的实现方法:C++使用冒号“ : ”实现继承,使用virtual(虚拟的)关键字实现多态。
5.封装与信息隐藏
(1)封装:其实就是把某些东西封装起来,只留一些必要的接口从外部进行操作,而具体内部的实现细节则隐藏起来。当然,也可以完全不给外部留下可操作的接口,但这样的封装不起任何作用,就没有意义了。比如在看电视时,我们只需通过电视机上的按键对其来进行换台、调音量等操作,而无须关心电视机内部是如何实现这些功能的,假如不给电视机提供任何可对其操作的接口,那么这台电视机将是毫无用处的。
(2)函数是一种封装形式,因为函数的操作细节被封装在函数体中,函数体隐藏了函数的实现细节。类也是一种封装形式,类把它的所有成员都对外进行了隐藏。
(3)面向对象程序设计中的封装有两方面含义:一是相对于对象本身而言的,对象本身就是被封装后的结果,因为对象本身就拥有有关的数据和操作,且各个对象相对独立。比如对于等边三角形对象,可以使用该对象相应的接口来计算其面积,而无须知道该接口在等边三角形对象中是怎样实现的。二是相对于对象内部而言的,对于面向对象程序设计,可以将对象内部的部分数据或操作对外进行隐蔽,这些被隐藏的数据或操作只能通过该对象提供的接口进行访问。比如将等边三角形对象的三个边的长度对外进行隐藏,只留下一个接口用于设置该对象的三个边的长度等。
(4)信息隐藏:指对象内部的数据隐藏。
(5)C++实现信息隐藏的方法:C++使用public、private、protected三个关键字来实现信息隐藏,这三个关键字被称为访问控制符。public表示公有的,private表示私有的,protected表示受保护的。

以上内容摘自本人所作《C++语法详解》一书,电子工业出版社出版

猜你喜欢

转载自blog.csdn.net/hyongilfmmm/article/details/83028646
今日推荐