面向对象基础

2015/05/21 C和C++基础

类基本概念

对象:客观世界中任何一个事物都可以看成一个对象(object)。对象可大可小。对象是构成系统的基本单位。

任何一个对象都应当具有这两个要素,即属性(attribute)和行为(behavior)。一般来说,凡是具备属性和行为这两种要素的,都可以作为对象。

要使某一个对象实现某一种行为(即操作),应当向它传送相应的消息。对象之间就是这样通过发送和接收消息互相联系的。

在C++中,每个对象都是由数据和函数(即操作代码)这两部分组成的。

对象的函数也称为方法(method),调用对象中的函数就是向该对象传送一个消息(message),要求该对象实现某一行为(功能)。

封装与信息隐蔽

可以对一个对象进行封装处理,把它的一部分属性和功能对外界屏蔽,也就是说从外界是看不到的,甚至是不可知的。这样做的好处是大大降低了操作对象的复杂程度。

面向对象程序设计方法的一个重要特点就是“封装性”(encapsulation),所谓“封装”,指两方面的含义:

一是将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不干扰。

二是将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收外界的消息。这种对外界隐蔽的做法称为信息隐蔽(imformationhiding)。信息隐蔽还有利于数据安全,防止无关的人了解和修改数据。

C++的对象中的函数名就是对象的对外接口,外界可以通过函数名来调用这些函数来实现某些行为(功能)。

抽象

在程序设计方法中,常用到抽象(abstraction)这一名词。抽象的过程是将有关事物的共性归纳、集中的过程。抽象的作用是表示同一类事物的本质。C和C++中的数据类型就是对一批具体的数的抽象。

对象是具体存在的,如一个三角形可以作为一个对象,10个不同尺寸的三角形是10个对象。如果这10个三角形对象有相同的属性和行为,可以将它们抽象为一种类型,称为三角形类型。在C++中,这种类型就称为“类(class)”。这10个三角形就是属于同一“类”的对象。类是对象的抽象,而对象则是类的特例,或者说是类的具体表现形式。

继承与重用

如果在软件开发中已经建立了一个名为A的“类”,又想另外建立一个名为B的“类”,而后者与前者内容基本相同,只是在前者的基础上增加一些属性和行为,只需在类A的基础上增加一些新内容即可。这就是面向对象程序设计中的继承机制。利用继承可以简化程序设计的步骤。

“白马”继承了“马”的基本特征,又增加了新的特征(颜色),“马”是父类,或称为基类,“白马”是从“马”派生出来的,称为子类或派生类。

C++提供了继承机制,采用继承的方法可以很方便地利用一个已有的类建立一个新的类。这就是常说的“软件重用”(software reusability)的思想。

多态性

如果有几个相似而不完全相同的对象,有时人们要求在向它们发出同一个消息时,它们的反应各不相同,分别执行不同的操作。这种情况就是多态现象。比如,Windows环境下,用鼠标双击一个文件对象(这就是向对象传送一个消息),如果对象是一个可执行文件,则会执行此程序,如果对象是一个文本文件,则启动文本编辑器并打开该文件。

在C++中,所谓多态性(polymorphism)是指:由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。

面向对象的软件开发

在面向过程的结构化程序设计中,人们常使用这样的公式来表述程序:

程序=算法+数据结构

基于对象和面向对象程序设计就是把一个算法和一组数据结构封装在一个对象中。 因此,就形成了新的观念:

对象=算法+数据结构

程序=(对象+对象+对象+…)+消息 或者

程序 =对象s+消息

“对象s”表示多个对象。消息的作用就是对对象的控制。程序设计的关键是设计好每一个对象,及确定向这些对象发出的命令,使各对象完成相应操作。

1.面向对象分析(object oriented analysis,OOA)

软件工程中的系统分析阶段,系统分析员要和用户结合在一起,对用户的需求作出精确的分析和明确的描述,从宏观的角度概括出系统应该做什么(而不是怎么做)。

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++中也是先声明一个类类型,然后用它去定义若干个同类型的对象。对象就是类类型的一个变量。可以说类是对象的模板,是用来定义对象的一种抽象类型。类是抽象的,不占用内存,而对象是具体的,占用存储空间。在一开始时弄清对象和类的关系是十分重要的。

在C++中声明一个类类型和声明一个结构体类型是相似的。

class Student //以class开头
{
	private:             //声明以下部分为私有的
		int num;
		char name[20];
		char sex;        //以上3行是数据成员
	public:
		void display( )  //这是成员函数
		{
			cout<<"num:"<<num<<endl;
			cout<<"name:"<<name<<endl;
			cout<<"sex:"<<sex<<endl;    //以上4行是函数中的操作语句
		}
};

Student stud1,stud2;  //定义了两个Student类的对象stud1和stud2

可以看到,类(class)就是对象的类型。实际上,类是一种广义的数据类型。类这种数据类型中的数据既包含数据,也包含操作数据的函数。不能把类中的全部成员与外界隔离,一般是把数据隐蔽起来,而把成员函数作为对外界的接口。

如果在类的定义中既不指定private,也不指定public,则系统就默认为是私有的。public和private称为成员访问限定符(member access specifier)。

归纳以上对类类型的声明,可得到其一般形式如下:

class 类名
{
	private:
		私有的数据和成员函数;
	public:
		公用的数据和成员函数;
};

还有一种成员访问限定符protected(受保护的),用protected声明的成员称为受保护的成员,它不能被类外访问(这点与私有成员类似),但可以被派生类的成员函数访问。

在声明类类型时,声明为private的成员和声明为public的成员的次序任意,既可以先出现private部分,也可以先出现public部分。如果在类体中既不写关键字private,又不写public,就默认为private。在一个类体中,关键字private和public可以分别出现多次。每个部分的有效范围到出现另一个访问限定符或类体结束时(最后一个右花括号)为止。但是为了使程序清晰,应该养成这样的习惯:使每一种成员访问限定符在类定义体中只出现一次。

C++程序多数先写public部分,把private部分放在类体的后部。这样可以使用户将注意力集中在能被外界调用的成员上,使阅读者的思路更清晰一些。

定义对象的方法

先声明类类型,然后再定义对象

1.class 类名 对象名

把class和Student合起来作为一个类名,用来定义对象。

比如:

class Student stud1,stud2;

2.类名 对象名

Student stud1,stud2;
在声明类类型的同时定义对象

在定义Student类的同时,定义了两个Student类的对象。

class Student        //声明类类型
{
	public:          //先声明公用部分
		void display( )
		{
			cout<<"num:"<<num<<endl;
			cout<<"name:"<<name<<endl;
			cout<<"sex:"<<sex<<endl; 
		}
	private:         //后声明私有部分
		int num;
		char name[20];
		char sex;
}stud1,stud2;        //定义了两个Student类的对象
不出现类名,直接定义对象
class           //无类名
{
	private:    //声明以下部分为私有的
		
	public:     //声明以下部分为公用的
		
}stud1,stud2;   //定义了两个无类名的类对象

在定义一个对象时,编译系统会为这个对象分配存储空间,以存放对象中的成员。

类和结构体类型的异同

C++增加了class类型后,仍保留了结构体类型(struct),而且把它的功能也扩展了。C++允许用struct来定义一个类型。如可以将前面用关键字class声明的类类型改为用关键字struct:

struct Student           //用关键字struct来声明一个类类型
{
	private:             //声明以下部分为私有的
		int num;
		char name[20];
		char sex;        //以上3行是数据成员
	public:
		void display( )  //这是成员函数
		{
			cout<<"num:"<<num<<endl;
			cout<<"name:"<<name<<endl;
			cout<<"sex:"<<sex<<endl;    //以上4行是函数中的操作语句
		}
};

为了使结构体类型也具有封装的特征,C++不是简单地继承C的结构体,而是使它也具有类的特点,以便于用于面向对象程序设计。用struct声明的结构体类型实际上也就是类。

用struct声明的类,如果对其成员不作private或者是public声明,系统将其默认为public,如果想分别指定私有成员和公用成员,则应用private或public作显式声明。而用class定义的类,如果不作private或者public声明,系统将其成员默认为private,在需要时也可以自己用显式声明改变。

如果希望成员是公用的,使用struct比较方便,如果希望部分成员是私有的,宜用class。建议尽量使来建立类,写出完全体现C++风格的程序。

Search

    Post Directory