32
Object-Oriented Programming in C++ 第第第 第第第第 中中中中中中中中中中中 中中 [email protected]

Object-Oriented Programming in C++ 第二章 类和对象

  • Upload
    ewa

  • View
    134

  • Download
    3

Embed Size (px)

DESCRIPTION

Object-Oriented Programming in C++ 第二章 类和对象. 中国科大学继续教育学院 李艺 [email protected]. 第一 章 C++ 的初步知识 第二章 类和对象 第三章 再论类和对象 第四章 运算符重载 第五章 继承与派生 第六章 多态性与虚函数 第七章 输入输出流 第八章 C++ 工具. 2.1 面向对象程序设计方法概述 2.2 类的声明和对象的定义 2.3 类的成员函数 2.4 对象成员的引用 2.5 类和对象的举例 2.6 类的封装和信息的隐藏. - PowerPoint PPT Presentation

Citation preview

Page 1: Object-Oriented Programming  in C++ 第二章 类和对象

Object-Oriented

Programming

in C++

第二章 类和对象

中国科大学继续教育学院 李艺[email protected]

Page 2: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 2

第一章 C++ 的初步知识第二章 类和对象第三章 再论类和对象第四章 运算符重载第五章 继承与派生第六章 多态性与虚函数第七章 输入输出流第八章 C++ 工具

Page 3: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 3

2.1 面向对象程序设计方法概述

2.2 类的声明和对象的定义

2.3 类的成员函数

2.4 对象成员的引用

2.5 类和对象的举例

2.6 类的封装和信息的隐藏

Page 4: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 4

2.1 面向对象程序设计方法概述

什么是面向对象的程序设计?

面向对象的程序设计 (Object-Oriented Programming ) 和传统的结构化程序设计的思路完全不同。面向对象的程序设计和人们日常生活解决问题的思路是相似的。

比如,我们生产汽车时,不是顺序制造发动机,在设计制造底盘、车身、轮子。而是分别设计制造发动机、底盘、车身和轮子,最后组装在一起。组装时,各部件之间有联系,以便协调工作。例如,司机踩油门,就能调节油路,控制发动机的转速,就能驱动车轮。

Page 5: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 5

2.1 面向对象程序设计方法概述

程序设计者的任务有两个:一是设计所需要的类和对象,即确定那些数据和操作封装在一起;二是考虑怎样向有关对象发送消息,以启动相关对象的操作。

编程者如同一个总调度,不断地向各个对象发出命令,让这些对象活动起来,完成指定的工作。

这就是面向对象的程序设计的基本思路。

Page 6: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 6

2.1 面向对象程序设计方法概述

什么是对象 (object) ?

一个对象由一组“属性”和一组“行为”构成。并根据外界给它的消息进行相应的操作。系统中多个对象通过一定的渠道相互联系。

任何事物都可以看成一个对象。可以是自然物体,也可以是逻辑结构。我们以一个班级为例。一个班级作为对象,有两个要素:一是班级的静态特征,如班级所属的专业,学生人数、班主任姓名等,这种静态特征称为“属性”;另一个是班级的动态特征,如上课,体育比赛,开会等,称为“行为”。外界向班级发一个信息(如上课铃声,广播通知),我们称之为“消息”,班级就会发生一个操作(要么上课,要么开会)

Page 7: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 7

2.1 面向对象程序设计方法概述

什么是 C++ 对象?

C++ 中,每个对象都由若干数据和若干函数组成。数据就是对象的“属性”,函数就是用来对数据进行的“操作”,以便实现某种功能。这种操作就是对象的“行为”,也叫“方法”。我们点击一下鼠标,按动键盘的一个按钮,就是给某个对象一个消息,系统会调用该对象中的函数进行操作。

比如长方形对象,其长和宽就是它的属性,调用该对象的一些函数,即向该对象传送一些消息,可以用来对其长、宽值进行加工计算,以实现求出面积、周长等功能。

Page 8: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 8

2.1 面向对象程序设计方法概述

什么是对象封装 (encapsulation ) ?就是把对象的不想让外界知道的属性和功能屏蔽起来,

让外界看不见。封装有两个含义,一是将有关的数据和操作函数封装成一个基本单位,即对象内。各对象之间相互独立,互不干扰;二是将对象中的部分属性或功能对外隐蔽,只留少数接口向外公布,以接收外界信息。

对象封装的好处在于,降低了人们操作对象的复杂程度。使用对象的人,不必知道对象内部的实现细节,只需要了解外部功能就可以自如地操作该对象。

对象的行为由类的内部数据结构和相关的操作确定;外部行为通过操作接口实现。人们关心的就是操作接口所能提供的服务。

Page 9: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 9

2.1 面向对象程序设计方法概述

什么是抽象 (abstraction) ?

将具有相同特性的事物归纳、集中成一个统一类型,称为抽象。比如,把张三,李四,王五归纳为一类,我们称之为“人”。

抽象的作用,是表示同类事物的本质。如果你会操作自己家的电视机,看到别人家里的电视机即使牌子不同,你也肯定会操作,因为所有电视机具有共同的特性。

C 和 C++ 中,数据类型就是对一批具体数据的抽象,整形数据就是所有整数的抽象。

“ 类”是“对象”的抽象,“对象”则是类的“特例”,或“具体表现形式”。

Page 10: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 10

2.1 面向对象程序设计方法概述

什么是继承 ( inherit ) ?

生产汽车,一般不会从头开始设计,而是选择已有的某一型号汽车为蓝本,增加、修改一些功能就行了。

软件开发也是这样,我们已经有了一个名为“ A”的类,还想建立一个名为“ B”的类,而后者内容只是在前者的基础上增加了少量内容。我们显然不必重新设计一个新类 B ,只需要把 A 类拿过来,在此基础上添加新内容就可以了。这就是面向对象程序设计的继承机制。

C++提供继承机制,大大节省了编程工作量,这就是所谓“软件重用 ( software reusability )”的思想。对于大型软件的开发具有重要意义。

Page 11: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 11

2.1 面向对象程序设计方法概述

什么是多态性 ( polymorphism ) ?

如果有几个相似而不同的对象,人们往往要求在向它们发出同一个消息时,各自作出不同的操作,这种情况就是“多态现象”。

比如,高二 1 , 2 , 3 班,听到上课铃后,作出的动作是各自走进自己的教室上课,而不会走错教室。

C++ 中,所谓多态性是指,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。

显然,多态性能增加程序的灵活性,它是面向对象程序设计的重要特征。

Page 12: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 12

2.1 面向对象程序设计方法概述类与对象的作用

C++ 全面支持传统的面向过程的程序设计(即结构化编程),也支持基于对象和面向对象的程序设计。

所谓基于对象,是指程序是以类和对象为基础,程序的操作是围绕对象进行的。

所谓面向对象,是指,在基于对象的基础上,利用了继承机制和多态性。

面向对象的程序设计特点:

类具有对数据的抽象性、封装性、继承性、多态性。

Page 13: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 13

2.2 类的声明和对象的定义类和对象的关系

每一个实体都可以作为对象,一些对象具有相同的结构和特性。如高一 1 班, 2 班, 3 班。他们是不同的对象,但具有完全相同的结构的特性。每个对象都属于一个特定的类型。

C++ 中,对象的类型称为类 ( class ) 。类代表了某一批对象的共同特性。前面已经谈到,类是对象的抽象,而对象是类的具体实例 ( instance ) 。就象结构体类型和结构体变量一样。

C++ 中,我们先声明一个类的类型,然后再定义该类的若干对象。对象就是类这种类型的一个变量。类是抽象的,不占内存,而对象是具体的,要占用内存空间。

Page 14: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 14

2.2 类的声明和对象的定义类的声明

类的声明方法和结构体的声明方法一样,只是将关键字 struct 换成 class :

class 类名{ private:

私有数据成员和私有成员函数; public:

公共数据成员和公共成员函数;} ;

成员访问限定符

( member access specifier )

成员访问限定符

( member access specifier )

别忘了必须用分号结束!

Page 15: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 15

2.2 类的声明和对象的定义类的声明示例class rectangle { private:

int length, width, area, perimeter ; public:

void PutArea ( ) { area = length * width;} void PutPerimeter ( ) { perimeter = (length + width ) * 2; } void display ( ) { cout << “length = “<< length << endl; cout << “width = “<< width << endl; cout << “area = “ << area << endl; cout << “perimeter = “ << perimeter << endl; }

};

在类的外面不能访问私有成员,

只能通过公有成员函数间接访问

在类的外面可以访问公有成员

Page 16: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 16

2.2 类的声明和对象的定义对象的定义

声明了类以后,就可以定义该类的对象了。其格式为: [class] 类名 对象名 1 ,对象名 2 ,… // 方括号表示可选项

对象定义示例 如前例中,声明了一个名为 rectangle 的类,我们可以定义该类的若干对象:

rectangle r1, r2, r3;对象定义说明

类的声明和对象的定义可以想结构体类型声明和结构体变量定义一样,合在一起完成。请同学们自己阅读教材 48页的内容。

Page 17: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 17

2.3 类的成员函数成员函数的性质

类的成员函数也叫类函数,用法和一般函数基本上一样。区别在于它只是属于一个类的成员而出现在类中。它可以被指定为类的私有成员 ( private ) 、公有成员 ( public )或保护成员 ( protected ) 。

使用类函数时,要注意它的使用权限,如果是私有成员,只能被本类的其他成员函数调用,不能被类外调用。成员函数可以调用本类所有数据成员和成员函数,也可以引用在本作用域中的有效数据。

通常,我们把类的数据成员定义成私有成员,对外屏蔽,而把成员函数定义成公有成员,他可以调用私有成员和其它成员。

一个类若没有成员函数,就退化成 C语言的结构体,而失去意义。

Page 18: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 18

2.3 类的成员函数在类外定义成员函数

成员函数一般在类体中定义,如前面所讲。也可以在类外定义,但要指明是属于哪个类的成员函数,用“类名 :: 函数名”来指定。例如:

class rectangle { private: int length, width,; int area, perimeter ; public: void PutArea ( ); void PutPerimeter ( ); void display ( );};void rectangle:: PutArea ( ){ area = length * width;}

void rectangle:: PutPerimeter ( )

{ perimeter = (length + width ) * 2; }

void rectangle:: display ( )

{ cout << “length = “<< length << endl;

cout << “width = “<< width << endl;

cout << “area = “ << area << endl;

cout << “perimeter = “ << perimeter ; }

rectangle r1, r2, r3;

Page 19: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 19

这种类定义包括两个部分:

1 、声明部分 (“做什么” ) : 数据成员 ( 名称、类型 ) 成员函数 ( 方法 )

2 、实现部分 (“ 怎么做” ) :

成员函数的定义和实现

Page 20: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 20

2.3 类的成员函数其中,“ ::”成为域限定符。如果在域限定符前没有

类名,或函数名前既没有类名,又没有域限定符:::display ( ) 或 display ( )

则表示该函数不属于任何类,它不是成员函数,而是全局函数,即普通函数。

inline 成员函数类的成员函数也可以指定为内联函数,只要是函数代

码较少,有频繁使用。我们只要在成员函数的类型签名加上inline 关键字就可以。

Page 21: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 21

2.3 类的成员函数成员函数的存储方式

同一类定义了多个对象时,每个对象的数据成员各自占据独立的空间,而共享一个共用的函数代码段,不占用对象的存储空间。那么不同对象使用的是同一个函数代码段,如何区分不同对象呢?

C++ 为此专门设立了一个名为 this 的指针,用来指向不同的对象。当调用对象 r1 ,成员函数访问的就是 r1 的成员。

数据 1

对象 r1

数据 2

对象 r2

数据 10

对象 r10

共用函数代码

Page 22: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 22

2.4 对象成员的引用用对象名和成员运算符 ( . )访问对象成员举例:用这种方式万分的成员,必须定义成公用成员!

class rectangle { public: int length, width; // 公共数据成员 void display ( ); // 公共成员函数};void rectangle:: display ( ){cout <<“area =“ << length* width <<ednl; cout<<“perimeter =“ << ( length+ width ) *2; }void main ( ){ rectangle r1; r1.lenght = 5; // 用对象名和成员运算符 )访问数据成员 r1.width = 4; // 用对象名和成员运算符 ( . )访问数据成员 r1.display ( ); // 用对象名和成员运算符 ( . )访问成员函数}

Page 23: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 23

2.4 对象成员的引用用指向对象的指针访问对象成员举例:用这种方式万分的成员,也必须定义成公用成员!(*p).length 被简化成 p->length

class rectangle { public: int length, width; // 公共数据成员 void display ( ); // 公共成员函数 };void rectangle:: display ( ){cout <<“area =“ << length* width <<ednl; cout<<“perimeter =“ << ( length+ width ) *2; }void main ( ){ rectangle r2 , *p; p = &r2; p->lenght = 5; p->width = 4; p->display ( ); }

Page 24: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 24

2.4 对象成员的引用用对象的引用访问对象成员举例: class rectangle

{ public: int length, width; // 公共数据成员 void display ( ); // 公共成员函数};void rectangle:: display ( ){cout <<“area =“ << length* width <<ednl; cout<<“perimeter =“ << ( length+ width ) *2; }void main ( ){ rectangle r2; rectangle &r3 = r2; //r3 引用 r2 r3.lenght = 5; r3.width = 4; r3.display ( ); }

Page 25: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 25

编程练习

请同学们自己阅读教材 55 页 2.5 节的简单示例程序。然后编写下列程序:

输入三个整数,并输出它们之中的最大值。

Page 26: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 26

2.6 类的封装和信息隐蔽公用接口和私有实现的分离

我们已经学到, C++ 通过类的封装,将类的数据成员和成员函数集成到一个类中。而一般在类的声明时,往往把数据成员指定成私有的,使它们与外界隔离,即,不能在类外直接使用私有成员,外界只能通过类的公有函数,间接进行对私有成员的操作。换句话说,外界与类的私有成员的唯一联系渠道,就是该类的公有成员函数。

所以,我们一般把成员函数指定成公有的 ( public )

性质(除非某些成员函数不想让外界调用)。这就是所谓的“外部接口”与内部实现的分离,以起

到信息隐蔽的作用。而这是软件工程最基本的原则。

Page 27: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 27

定义一个类就是实现对创建一个对象的数据结构的描述。 在类中,一些成员是保护的,被有效地屏蔽,以防外界的干扰和误操作。 另一些成员是公共的,作为接口提供外界使用。 右图是对它们采用的图示方法说明类的组成结构。以 Point 类为例。

xoffset

yoffset

set

angle

radius

x

y

封装体

内部数据成员

Point 类

访问接口

Page 28: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 28

2.6 类的封装和信息隐蔽

类声明和成员函数定义的分离当一个类被多个程序使用时,一般将类的声明(包

括成员函数的声明)放在指定的头文件中,用户在编程时,将该头文件包含近来就可以了。而不必在每个使用该类的程序中重复书写该类的声明。

我们然后可以直接在程序中直接定义该类的对象,直接调用该类的公有成员函数。为了实现信息隐蔽,对类的成员函数的定义一般不放在头文件中,而放在另一个文件中。

然后按照对多文件程序的编译和运行方法对程序进行编译和连接。请看下面示例。

Page 29: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 29

2.6 类的封装和信息隐蔽

// rectangle.hclass rectangle { private:

int length, width; public:

void Put ( ); void display ( ); };

// rectangle.cpp#include <iostream.h>#include “rectangle.h”void rectangle::Put ( ){ length = 5; width = 4; }void rectangle:: display ( ){ cout <<“area = “ << length*width << endl; }

// main.cpp#include <iostream.h>#include “rectangle.h”

void main ( ){ rectangle r1; r1.display ( );}

Page 30: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 30

2.6 类的封装和信息隐蔽

在实际运用中,将若干功能相近的类声明集中在一起,形成类库。类库包括两个组成部分:

类声明头文件; 经过编译的头文件函数的定义的目标文件。

用户只需要将类库装入自己的计算机中 C++ 系统的子目录下,并在程序中用 #include 命令将有关类声明的头文件包含到程序中,就可以使用这些类和其中的成员函数了。

Page 31: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 31

2.6 类的封装和信息隐蔽

面向对象程序设计中的几个名词方法: method ,指对数据的操作。消息:其实就是一个命令,由程序语句实现。外界通过

发送“消息”来激活有关的方法。比如:

rectangle.dispaly ( );

就是向 rectangle 对象发一个消息,通知它执行其中的“ display ( )”方法。

这一条语句就涉及到对象、消息、方法这三个术语。rectangel :是对象;display ( ) :是方法;rectangel.display ( ) :是消息。

Page 32: Object-Oriented Programming  in C++ 第二章 类和对象

C++ 2- 32

本章练习试编写一个基于对象的程序,求 3 个长方体的体

积。长方体对象名为 rectangle ,数据成员包括:length , width , height 。要求用成员函数实现以下功能:由键盘分别输入 3 个长方体的长、宽、高;计算机长方体之体积;输出三个长方体的体积。