第4类与对象.ppt

上传人:本田雅阁 文档编号:2530440 上传时间:2019-04-05 格式:PPT 页数:55 大小:1.42MB
返回 下载 相关 举报
第4类与对象.ppt_第1页
第1页 / 共55页
第4类与对象.ppt_第2页
第2页 / 共55页
第4类与对象.ppt_第3页
第3页 / 共55页
亲,该文档总共55页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第4类与对象.ppt》由会员分享,可在线阅读,更多相关《第4类与对象.ppt(55页珍藏版)》请在三一文库上搜索。

1、C+语言程序设计基础,第4章 类与对象,4.1 面向对象程序设计的基本特点 4.2 类和对象 4.3 构造函数和析构函数 4.4 类的组合 4.5 UML图形标识 4.6 结构体和联合体,3,回顾:面向过程的设计方法,重点: 如何实现细节过程,将数据与函数分开。 形式: 主模块+若干个子模块(main()+子函数)。 模块是按功能来分的,所以也称功能块。在C+中称为一个函数,一个函数解决一个问题,即实现一个功能或一个操作。,4,回顾:面向过程的设计方法,特点: 自顶向下,逐步求精功能分解。 缺点: 效率低,程序的可重用性差。 面向过程程序设计缺点的根源在于数据与数据处理分离。,5,面向对象的方

2、法,目的: 实现软件设计的产业化。 观点: 自然界是由实体(对象)所组成。 程序设计方法: 使用面向对象的观点来描述模仿并处理现实问题。面向对象技术中的对象就是现实世界中某个具体的物理实体在计算机逻辑中的映射和体现。 要求: 高度概括、分类、和抽象。,6,对象,类,计算机世 界,实体,抽象类别,现实世界 客观世界,抽象,抽象,实例化,映射,主观世界,对象、实体与类,现实世界中的实体可以抽象出类别的概念。对应于计算机世界就有一个类(class)的概念。 面向对象就是计算机世界模拟现实世界。,现实世界与计算机世界的映射关系,7,面向对象编程,8,对象,“对象是存在的具体实体,具有明确定义的状态和行

3、为。”,9,对象的示例,收银员对象,顾客对象,顾客 姓名:朱丽叶 年龄:28 体重:52千克 操作: 购买商品,状态,姓名:布兰尼 职衔:收银员 年龄:35 体重:60千克 操作: 收款 打印帐单,行为,10,消息传递,“消息指一个对象为执行某项特定操作而向另一个 对象发送的请求”,11,类,类以共同特性和操作定义实体 类是用于组合各个对象所共有操作和属性的一种机制,形状类,动物类,汽车类,类的示例,“类是具有相同属性和行为的一组对象的集合”,12,类和对象的示例,促销员,采购经理,收银员,系统管理员,仓库管理员,13,属性,事物的特性在类中表示为变量 每个对象的每个属性都拥有其特有的值 属性

4、名称由类的所有实例共享,住址,姓名,属性,年龄,“在类中表示对象或实体拥有的特性时称为属性 ”,14,方法,“对象执行的操作称为方法。”,15,方法的示例,缝衣服的步骤,量尺寸,得到工具,缝衣服,方法,缝制衣服,裁缝,16,类和对象的区别,类是概念模型, 定义对象的所 有特性和所需 的操作,对象是真实的模型,类定义实体,对象是实际的实体,17,4.1.1 抽象,处理事物复杂性的方法,只关注事物的重要 细节,而忽略事物 的次要细节。,18,数据抽象,抽取出关键数据 抽取出属性和方法,“根据具体的应用抽取出类的相关关属性和操作。”,19,数据抽象的示例,属性,方法,getName(),getStu

5、dentNO(),getSeatNumber(),20,4.1.2 封装,信息隐藏,隐藏对象的实现细节,不让用户看到 将东西包装在一起,然后以新的完整形式呈现出来 例如,两种或多种化学药品组成一个胶囊 将方法和属性一起包装到一个单元中,单元以类的形式实现,“隐藏属性、方法或实现细节的过程称为封装。”,21,封装的示例,接口,采购经理,罗杰斯先生,法拉力公司,.,迪斯尼汽车公司,.,市场经理,雪莉女士,要求,22,封装的示例,有选择地提供数据,法拉力公司,迪斯尼汽车公司,23,封装的示例,实体法拉力公司,实体迪斯尼汽车公司,Auti Ltd,.,Buto Ltd,.,24,4.1.3 继承,是C

6、+中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。,25,4.1.4 多态,语文、数学、英语、政治、物理、化学、生物,高中生,计 算平均成绩,大学生,高数、英语、计算机、线性代数,多态:同一名称,不同的功能实现方式。 目的:达到行为标识统一,减少程序中标识符的个数。,26,结构化程序与面向对象程序的比较,问题:输入圆的半径,求圆的周长和面积 数据描述: 半径,周长,面积均用实型数表示 数据处理: 输入半径 r; 计算周长 = 2*r ; 计算面积 = * r2 ; 输出半径,周长,面积;,27,方法一:用结构化方法编程,求圆的周长和面积,#include usi

7、ng namespace std; int main () double r, girth, area ; const double PI = 3.1415 ; cout r ; girth = 2 * PI * r ; area = PI * r * r ; cout “radius = “ r endl ; cout “girth = “ girth endl ; cout “area = “ area endl ; return 0; ,28,方法二:用面向对象方法编程,求圆的周长和面积,实例化,分析,“圆”是抽象的类类型,建立具体的圆(对象),半径?,圆的周长 ? 面积 ?,29,抽象

8、,实例化,圆类 数据成员 半径 成员函数 置半径值 求圆的半径 求周长 求面积,30,实现,#include using namespace std; class Circle double radius ; public : void Set_Radius( double r ) radius = r ; double Get_Radius() return radius ; double Get_Girth() return 2 * 3.14 * radius ; double Get_Area() return 3.14 * radius * radius ; ; int main()

9、Circle A, B ; A.Set_Radius( 6.23 ) ; cout “A.Radius = “ A.Get_Radius() endl ; cout “A.Girth = “ A.Get_Girth() endl ; cout “A.Area = “ A.Get_Area() endl ; B.Set_Radius( 10.5 ) ; cout “B.radius = “ B.Get_Radius() endl ; cout “B.Girth=“ B.Get_Girth() endl ; cout “B.Area = “ B.Get_Area() endl ; return 0

10、; ,Circle 类定义,数据成员,成员函数,建立对象 (类类型变量),通过对象 调用类的成员函数,4.2.1 类的定义,class : public: 公有成员; protected: 保护型成员; private: 私有成员; ;,语句 结束符,4.2.2 类成员的访问控制,公有成员:在public后声明,一般是成员函数,用于定义类的外部接口,任何外部函数都可以访问公有类型数据和函数。,私有成员:在private后声明,一般是数据成员,只允许本类中的函数访问,而类外函数不能访问。类的成员在默认情况下是私有的。,保护成员:在protected后声明,与private类似,其差别表现在继承与

11、派生时对派生类的影响不同。,抽象日期,对具体对象进行概括,抽象出这一类对象的公共性质并加以描述的过程。 先注意问题的本质,其次是实现细节。 数据抽象:描述某类对象的属性或状态。 年:int Year 月:int Month 日:int Day 行为抽象:描述某类对象的共有的行为特征。 设置日期: void SetDate(int y,int m,int d); 打印日期: void PrintDate(); 抽象的实现:通过类的声明。,封装日期类,将抽象出的数据、函数成员相结合,视为一整体 目的:增强安全性和简化编程 实现封装:类声明中的,class CDate public: void Se

12、tDate(int y, int m, int d); void PrintDate(); private: int Year,Month,Day; ;,数据成员,成员函数,4.2.3 对象,class ; CDate d1,d2; 访问类中成员的方式 类中成员互访:直接使用成员名 类外只能访问public 属性的成员 . .() d1.SetDate(2008,8,8); d2.PrintDate();,4.2.4 类的成员函数,1.成员函数的实现:在类中说明成员函数原形,可在类外给出函数体实现,并在函数名前使用类名加以限定。也可直接在类中给出函数体。,class CDate public:

13、 void SetDate(int y, int m, int d) Year=y; Month=m; Day=d; void PrintDate(); private: int Year,Month,Day; ; void CDate:PrintDate() coutYear/Month/Dayendl; ,在成员函数中直接访问数据成员,成员函数的特性,内联函数:定义在类体内;或定义在类体外,但使用inline进行说明 某个对象独享程序代码;牺牲空间获得时间的方式 外联函数:说明在类体内,定义在类体外 类中不同对象共享程序代码;牺牲时间获得空间的方式,#include using names

14、pace std; const double PAI=3.14159; class CCircle public: void SetR(double r); void PrintS(); private: double R; ; void CCircle:SetR(double r) R=r; ,定义圆类,指定半径,计算面积,void CCircle:PrintS() cout“半径为“R“的圆面积为:“PAI*R*Rendl; int main() CCircle c; c.SetR(2); c.PrintS(); return 0; ,4.3 构造函数和析构函数,4.3.1 构造函数 在创

15、建对象时用给定值对对象初始化 名字必须与类名相同 不指定返回类型,有隐含返回值,该值由系统内部使用 可以没有、有一个或多个参数 必须被声明为公有函数,在创建类的对象时由系统自动调用 如果程序中未声明,则系统自动产生出一个默认构造函数;函数体是空的,没有参数,class CDate public: CDate (int y, int m, int d) /构造函数 Year=y; Month=m; Day=d; void SetDate(int y, int m, int d); void PrintDate(); private: int Year,Month,Day; ; int main(

16、) CDate today(2008,8,8),tomorrow; today.PrintDate(); tomorrow.PrintDate(); return 0; ,构造函数举例,CDate() /构造函数 Year=1900; Month=1; Day=1; ,CDate (int y=1900, int m=1, int d=1) /构造函数 Year=y; Month=m; Day=d; ,4.3.2 复制构造函数,一种特殊的构造函数 只有一个参数,是对本类对象的引用 当用类的一个对象去初始化该类的另一个对象时,系统自动调用拷贝构造函数 如果类中没有拷贝构造函数,则编译系统自动生成

17、一个缺省拷贝构造函数,它的功能是用作为初始值的对象的每个数据成员的值初始化将要建立的对象的对应数据成员,class CDate public: CDate(int y=1900, int m=1, int d=1); CDate(CDate ,int main() CDate d1(2008,8,8),d2(d1),d3=d1; d2.PrintDate(); d3.PrintDate(); return 0; ,复制构造函数举例,什么时候调用拷贝构造函数,明确表示由一个对象初始化另一个对象时 CDate d1(2008,8,8),d2(d1),d3=d1; /调用 对象作为函数实参传递给函数

18、形参时 void fun(CDate d) int main() CDate a(2008,8,8); d.PrintDate(); fun(a); /调用 return 0; 对象作为函数返回值时 CDate fun2() int main() CDate b; CDate a(2012,1,1); b=fun2(); return a; /调用 b.PrintDate(); return 0; ,4.3.3 析构函数,对象终止时由系统自动调用以释放分配给对象的内存 函数名为类名前加“” 没有参数,不指定返回类型 一个类内只能声明一个析构函数,必须是公有的 析构函数可以被调用; 被自动调用的

19、情况: 在一个函数体内定义的一个对象,当函数结束时 用new动态创建的一个对象,在使用delete释放时 如果类中没有声明,编译器也会自动生成一个默认的函数体为空的析构函数,析构函数举例,class CDate public: CDate(int y=1900, int m=1, int d=1); CDate(CDate ,4.3.4 程序实例,一圆型游泳池,现需在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格为35元/米,过道造价为20元/平方米。过道宽3米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。,class CCircle public: CCircle(float

20、 r=0); float Perimeter(); /计算周长 float Area(); /计算面积 private: float R; ; Const double PI=3.14159; CCircle:CCircle(float r) R=r; float CCircle: Perimeter()return 2*PI*R; float CCircle:Area()return PI*R*R; ,#include using namespace std; int main() float r,fCost,pCost;/栅栏造价、过道造价 coutr; CCircle pool(r),f

21、ence(r+3); fCost=fence.Perimeter()*35; cout“栅栏造价为:“fCostendl; pCost=(fence.Area()-pool.Area()*20; cout“过道造价为:“pCostendl; return 0; ,49,类中的成员,除了成员数据和成员函数外,还有成员对象,即用其他类的对象作为类的成员。使用成员对象的技术称为组合。成员对象是实体,系统不仅为它分配内存,而且要进行初始化。,4.4 类的组合,原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。 声明形式: 类名:类名(对象成员所需的形参,本类成员形参) :对象1(

22、参数),对象2(参数), 本类初始化 ,含对象成员的构造函数,51,class Point public: Point(int xx=0,int yy=0); int GetX() return x; /取X坐标 int GetY() return y;/取Y坐标 private: int x,y; /点的坐标 ;,类组合实例,52,class Line private: Point p1,p2; /线段的两个端点 double len; public: Line(Point xp1,Point xp2); double getLen()return len; ;,类组合实例,53,Line:

23、Line(Point xp1,Point xp2) :p1(xp1),p2(xp2) double x=double(p1.GetX()-p2.GetX(); double y=double(p1.GetY()-p2.GetY(); len=sqrt(x*x+y*y); ,类组合实例,4.6.1 结构体,特殊形态的类 对于未指定访问控制属性的成员,默认为public,struct public:公有成员; protected: 保护型成员; private:私有成员; ;,合法标识符 可省:无名结构体,分号不能省略,4.6.2 联合体,将不同数据类型的数据项存放于同一段内存的一种构造数据类型。,union public:公有成员; protected: 保护型成员; private:私有成员; ;,union Data short i; char ch; float f; ; Data a,b;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1