1. 对象
客观世界中任何一个事物都可以看成一个对象(object)。
对象可大可小。对象是构成系统的基本单位。
- 对象的构成:任何一个对象都应当具有这两个要素,即属性(attribute)和行为(behavior),它能根据外界给的信息进行相应的操作。一个对象往往是由一组属性和一组行为构成的。
-
对象间的交互或对象的调用:要使某一个对象实现某一种行为(即操作),应当向它传送相应的消息。对象之间就是这样通过发送和接收消息互相联系的。 每个对象都是由数据和函数(即操作代码)这两部分组成的数据体现了前面提到的“属性”,如一个三角形对象,它的3个边长就是它的属性。函数是用来对数据进行操作的,以便实现某些功能。在程序设计方法中也称为方法(method)。
调用对象中的函数就是向该对象传送一个消息(message),要求该对象实现某一行为(功能)。
2. 封装与信息隐蔽
可以对一个对象进行封装处理,把它的一部分属性和功能对外界屏蔽,
优点:大大降低了操作对象的复杂程度。
所谓“封装”,指两方面的含义:
(1)一是将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不干扰。
(2)二是将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收外界的消息。信息隐蔽有利于数据安全,防止无关的人了解和修改数据3. 抽象(类的产生)
- 抽象的过程是将有关事物的共性归纳、集中的过程。
- 抽象的作用:是表示同一类事物的本质。C和C++中的数据类型就是对一批具体的数的抽象。
-
对象是具体存在的,类是对象的抽象,而对象则是类的特例,或者说是类的具体表现形式。
4. 继承与重用什么叫继承?优点?
已经设计了一个大学生类A,再设计研究生类B。
只是在前者的基础上增加一些属性和行为,只需在类A的基础上增加一些新内容即可。这就是面向对象程序设计中的继承机制。利用继承可以简化程序设计的步骤。软件重用的实现。 -
-
-
父类,或称为基类, 派生出来的,称为子类或派生类。
-
-
5. 多态性(概念,优点)
面向对象程序设计采取的思路:
程序设计者的任务包括两个方面:
一是设计所需的各种类和对象,即决定把哪些数据和操作封装在一起;
二是考虑怎样向有关对象发送消息,以完成所需的任务。这时他如同一个总调度,不断地向各个对象发出命令,让这些对象活动起来(或者说**这些对象),完成自己职责范围内的工作。各个对象的操作完成了,整体任务也就完成了。
支持面向过程的程序设计,也支持基于对象的程序设计,又支持面向对象的程序设计。
- 面向过程的结构化程序设计,公式来表述程序: 程序=算法+数据结构
-
- 基于对象和面向对象程序设计:就是把一个算法和一组数据结构封装在一个对象中。因此,就形成了新的观念:
-
对象 = 算法 + 数据结构
程序 = (对象+对象+对象+…) + 消息 或:
程序 = 对象s + 消息“对象s”表示多个对象。消息的作用就是对对象的控制。
程序设计的关键:是设计好每一个对象,及确定向这些对象发出的命令,使各对象完成相应操作。 -
4 面向对象的软件开发
-
-
-
1.面向对象分析(object oriented analysis,OOA)
从宏观的角度概括出系统应该做什么(而不是怎么做)。面向对象的分析,要按照面向对象的概念和方法,在对任务的分析中,从客观存在的事物和事物之间的关系,归纳出有关的对象(包括对象的属性和行为)以及对象之间的联系,并将具有相同属性和行为的对象用一个类(class)来表示。2. 面向对象设计(object oriented design,OOD)
首先是进行类的设计,类的设计可能包含多个层次(利用继承与派生)。然后以这些类为基础提出程序设计的思路和方法,包括对算法的设计。
3. 面向对象编程(object oriented programming,
OOP)根据面向对象设计的结果,用一种计算机语言把它写成程序,显然应当选用面向对象的计算机语言(例如C++),否则无法实现面向对象设计的要求。4. 面向对象测试(object oriented test,OOT)
在写好程序后交给用户使用前,必须对程序进行严格的测试。测试的目的是发现程序中的错误并改正它。面向对象测试是用面向对象的方法进行测试,以类作为测试的基本单元。
5. 面向对象维护(object oriented soft maintenance,
OOSM)因为对象的封装性,修改一个对象对其他对象影响很小。利用面向对象的方法维护程序,大大提高了软件维护的效率。
-
-
在C++中对象的类型称为类(class)。类代表了某一批对象的共性和特征。
instance)。
对象就是类类型的一个变量。可以说类是对象的模板,是用来定义对象的一种抽象类型。
C++
标准本身并不提供现成的类的名称、结构和内容。
。(数据是私有的,但成员函数是公有的)
如果在类的定义中既不指定private,也不指定public,则系统就默认为是私有的。
对类类型的声明的一般形式如下:
class 类名
{ private:
私有的数据和成员函数;
public:
公用的数据和成员函数;
};
除了private和public之外,还有一种成员访问限定符protected(受保护的),用protected声明的成员称为受保护的成员,它不能被类外访问(这点与私有成员类似),但可以被派生类的成员函数访问。
- 类内:成员函数可以访问本类中任何成员(包括私有的和公用的),可以引用在本作用域中有效的数据。
- 类外:一般的做法是将需要被外界调用的成员函数指定为public,它们是类的对外接口。
类函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前,否则编译时会出错。
习惯规定:
4 成员函数的存储方式
-
C++编译系统,每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间,而不包括函数代码所占用的存储空间
可以用下面的语句来输出该类对象所占用的字节数:cout<<sizeof(类名)<<endl;
。
this的指针:
不同的对象使用的是同一个函数代码段,它怎么能够分别对不同对象中的数据进行操作呢?原来C++为此专门设立了一个名为this的指针,用来指向不同的对象。隐含要传递this 指针给函数!!
需要说明:
-
-
-
-
- 通过对象名和成员运算符访问对象中的成员;
- 通过指向对象的指针访问对象中的成员;
- 通过对象的引用变量访问对象中的成员。
-
-
- 1 通过对象名和成员运算符访问对象中的成员
-
-
类外访问公用成员:
访问对象中成员的一般形式为
对象名.成员名
不仅可以在类外引用对象的公用数据成员,而且还可以调用对象的公用成员函数,但同样必须指出对象名 -
-
只能访问public成员,而不能访问private成员
在类外只能调用公用的成员函数。
在一个类中应当至少有一个公用的成员函数,作为对外的接口,否则就无法对对象进行任何操作。
-
只能访问public成员,而不能访问private成员
-
- 2 通过指向对象的指针访问对象中的成员
-
-
在p指向t的前提下,p->hour,(*p).hour和t.hour三者等价。
-
- 3 通过对象的引用变量来访问对象中的成员
-
-
如果为一个对象定义了一个引用变量,它们是同一个对象,只是用不同的名字表示而已。
-
-
-
1 公用接口与私有实现的分离
C++通过类来实现封装性,把数据和与这些数据有关的操作封装在一个类中,或者说,类的作用是把数据和算法封装在用户声明的抽象数据类型中。
在声明了一个类以后,用户主要是通过调用公用的成员函数来实现类提供的功能(例如对数据成员设置值,显示数据成员的值,对数据进行加工等)。因此,公用成员函数是用户使用类的公用接口(public interface),或者说是类的对外接口。 -
-
通过成员函数对数据成员进行操作称为类的实现,为了防止用户任意修改公用成员函数,改变对数据进行的操作,往往不让用户看到公用成员函数的源代码,显然更不能修改它,用户只能接触到公用成员函数的目标代码
类中被操作的数据是私有的,实现的细节对用户是隐蔽的,这种实现称为私有实现(private implementation)。这种“类的公用接口与私有实现的分离”形成了信息隐蔽。
软件工程的一个最基本的原则就是将接口与实现分离,信息隐蔽是软件工程中一个非常重要的概念。它的好处在于:
(1) 如果想修改或扩充类的功能,只需修改本类中有关的数据成员和与它有关的成员函数,程序中类外的部分可以不必修改。
(2) 如果在编译时发现类中的数据读写有错,不必检查整个程序,只需检查本类中访问这些数据的少数成员函数。 -
2 类声明和成员函数定义的分离
- 在面向对象的程序开发中,一般做法是将类的声明(其中包含成员函数的声明)放在指定的头文件中。
优点:用户如果想用该类(多次),只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明,以减少工作量,提高编程的效率。
由于在头文件中包含了类的声明,因此在程序中就可以用该类来定义对象。
-
对类成员函数的定义一般不放在头文件中,而另外放在一个源文件中。
为了组成一个完整的源程序,还应当有包括主函数的源文件:请注意: 由于将头文件student.h放在用户当前目录中,因此在文件名两侧用双撇号包起来(″student.h″)而不用尖括号(<student.h>),否则编译时会找不到此文件。在实际工作中,并不是将一个类声明做成一个头文件,而是将若干个常用的功能相近的类声明集中在一起,形成类库。
- 一种是C++编译系统提供的标准类库;
- 一种是用户根据自己的需要做成的用户类库,提供给自己和自己授权的人使用,这称为自定义类库。
-
类库包括两个组成部分: (1)类声明头文件; (2)已经过编译的成员函数的定义,它是目标文件。
类库的使用:用户只需把类库装入到自己的计算机系统中(一般装到C++编译系统所在的子目录下),并在程序中用#include命令行将有关的类声明的头文件包含到程序中,就可以使用这些类和其中的成员函数,顺利地运行程序。前提是系统已装了这些类库,在用户源文件经过编译后,就与系统库(是目标文件)相连接。
在用户程序中包含类声明头文件,类声明头文件(*.h)就成为用户使用类的公用接口,在头文件的类体中还提供了成员函数的函数原型声明,用户只有通过头文件才能使用有关的类。用户看得见和接触到的是这个头文件,任何要使用这个类的用户只需包含这个头文件即可。
包含成员函数定义的文件就是类的实现(*.cpp)。
请特别注意: 类声明和函数定义一般是分别放在两个文本中的。
-
-
3 面向对象程序设计中的几个名词
类的成员函数在面向对象程序理论中被称为“方法”(method),“方法”是指对数据的操作。一个“方法”对应一种操作。显然,只有被声明为公用的方法(成员函数)才能被对象外界所**。
外界是通过发“消息”来**有关方法的。所谓“消息”,其实就是一个命令,由程序语句来实现。