《第四章类与对象精选PPT.ppt》由会员分享,可在线阅读,更多相关《第四章类与对象精选PPT.ppt(64页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第四章 类与对象1第1页,此课件共64页哦本章主要内容面向对象的思想OOP的基本特点类概念和声明对象构造函数析构函数内联成员函数拷贝构造函数类的组合2第2页,此课件共64页哦回顾:面向过程的设计方法重点:如何实现细节过程,将数据与操作(函数)分开。形式:主模块+若干个子模块(main()+子函数)。特点:自顶向下,逐步求精功能分解。缺点:效率低,程序的可重用性差。面向对象的思想3第3页,此课件共64页哦面向对象的方法目的:实现软件设计的产业化。观点:自然界是由实体(对象)所组成。程序设计方法:使用面向对象的观点来描述模仿并处理现实问题。特点:高度概括、分类、和抽象。面向对象的思想4第4页,此课
2、件共64页哦抽象抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。先注意问题的本质及描述,其次是实现过程或细节。数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。代码抽象:描述某类对象的共有的行为特征或具有的功能。抽象的实现:通过类的定义。OOP的基本特点5第5页,此课件共64页哦抽象实例钟表数据抽象:int Hour,int Minute,int Second代码抽象:SetTime(),ShowTime()OOP的基本特点6第6页,此课件共64页哦抽象实例钟表类class Clock public:void SetTime(int NewH,int Ne
3、wM,int NewS);void ShowTime();private:int Hour,Minute,Second;OOP的基本特点7第7页,此课件共64页哦抽象实例人数据抽象:char*name,char*gender,int age,int id代码抽象:生物属性角度:GetCloth(),Eat(),Step(),社会属性角度:Work(),Promote(),OOP的基本特点8第8页,此课件共64页哦封装将抽象出的数据成员、代码成员相结合,将它们视为一个整体。目的是曾强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。实现封装:
4、类声明中的OOP的基本特点9第9页,此课件共64页哦封装实例:class Clock public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;边界特定的访问权限OOP的基本特点外部接口10第10页,此课件共64页哦继承与派生是C+中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。实现:声明派生类第七章OOP的基本特点11第11页,此课件共64页哦多态性多态:同一名称,不同的功能实现方式。目的:达到行为标识统一,减少程序中标识符的个数
5、。实现:重载函数和虚函数第八章OOP的基本特点12第12页,此课件共64页哦c+中的类类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。利用类可以实现数据的封装、隐藏、继承与派生。利用类易于编写大型复杂程序,其模块化程度比C中采用函数更高。类 和 对 象13第13页,此课件共64页哦类的声明形式 类是一种用户自定义类型,声明形式:class 类名称 public:公有成员(外部接口)private:私有成员 protected:保护型成员类 和 对 象14第14页,此课件共64页哦公有类型成员在关键字public后面声明,它们
6、是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。类 和 对 象15第15页,此课件共64页哦私有类型成员在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。如果紧跟在类名称的后面声明私有成员,则关键字private可以省略。类 和 对 象16第16页,此课件共64页哦保护类型与private类似,其差别表现在继承与派生时对派生类的影响不同,第七章讲。类 和 对 象17第17页,此课件共64页哦类的成员class Clock public:void SetTime(int NewH,int NewM,int NewS);void ShowTime()
7、;private:int Hour,Minute,Second;类 和 对 象成员数据成员函数18第18页,此课件共64页哦void Clock:SetTime(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;void Clock:ShowTime()coutHour:Minute:Second;19第19页,此课件共64页哦成员数据与一般的变量声明相同,但需要将它放在类的声明体中。类 和 对 象20第20页,此课件共64页哦成员函数在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中
8、给出函数体,形成内联成员函数。允许声明重载函数和带默认形参值的函数类 和 对 象21第21页,此课件共64页哦内联成员函数为了提高运行时的效率,对于较简单的函数可以声明为内联形式。内联函数体中不要有复杂结构(如循环语句和switch语句)。在类中声明内联成员函数的方式:将函数体放在类的声明中。使用inline关键字。类 和 对 象22第22页,此课件共64页哦内联成员函数举例(一)class Point public:void Init(int initX,int initY)X=initX;Y=initY;int GetX()return X;int GetY()return Y;priva
9、te:int X,Y;类 和 对 象23第23页,此课件共64页哦内联成员函数举例(二)class Point public:void Init(int initX,int initY);int GetX();int GetY();private:int X,Y;类 和 对 象24第24页,此课件共64页哦inline void Point:Init(int initX,int initY)X=initX;Y=initY;inline int Point:GetX()return X;inline int Point:GetY()return Y;25第25页,此课件共64页哦对象类的对象是该
10、类的某一特定实体,即类类型的变量。声明形式:类名 对象名;例:Clock myClock;类 和 对 象26第26页,此课件共64页哦类中成员的访问方式类中成员互访直接使用成员名类外访问使用“对象名.成员名”方式访问 public 属性的成员类 和 对 象27第27页,此课件共64页哦例4-1类的应用举例#includeusing namespace std;class Clock ./类的声明略/.类的实现略void main(void)Clock myClock;myClock.SetTime(8,30,30);myClock.ShowTime();类 和 对 象28第28页,此课件共64
11、页哦构造函数n构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。n在对象创建时由系统自动调用。n如果程序中未声明,则系统自动产生出一个默认形式的构造函数n允许为内联函数、重载函数、带默认形参值的函数构造函数和析构函数29第29页,此课件共64页哦构造函数举例class Clockpublic:Clock(int NewH,int NewM,int NewS);/构造函数void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;构造函数和析构
12、函数30第30页,此课件共64页哦构造函数的实现:Clock:Clock(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;建立对象时构造函数的作用:void main()Clock c(0,0,0);/隐含调用构造函数,将初始值作为实参。c.ShowTime();31第31页,此课件共64页哦拷贝构造函数拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。class 类名 public:类名(形参);/构造函数构造函数 类名(类名&对象名);/拷贝构造函数拷贝构造函数 .;类名:类名(类名&对象名)/拷贝构造函数的
13、实现 函数体 构造函数和析构函数32第32页,此课件共64页哦例4-2 拷贝构造函数举例class Point public:Point(int xx=0,int yy=0)X=xx;Y=yy;Point(Point&p);int GetX()return X;int GetY()return Y;private:int X,Y;构造函数和析构函数33第33页,此课件共64页哦Point:Point(Point&p)X=p.X;Y=p.Y;cout拷贝构造函数被调用endl;34第34页,此课件共64页哦例4-2 拷贝构造函数举例n当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造
14、函数实现拷贝赋值。void main(void)Point A(1,2);Point B(A);/拷贝构造函数被调用拷贝构造函数被调用 coutB.GetX()endl;构造函数和析构函数35第35页,此课件共64页哦例4-2拷贝构造函数举例n若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。例如:void fun1(Point p)coutp.GetX()endl;void main()Point A(1,2);fun1(A);/调用拷贝构造函数调用拷贝构造函数 构造函数和析构函数36第36页,此课件共64页哦拷贝构造函数(例4-2)n当函数的返回值是类对象时,系统
15、自动调用拷贝构造函数。例如:Point fun2()Point A(1,2);return A;/调用拷贝构造函数调用拷贝构造函数void main()Point B;B=fun2();构造函数和析构函数37第37页,此课件共64页哦拷贝构造函数如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个隐含的拷贝构造函数。这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。构造函数和析构函数38第38页,此课件共64页哦析构函数完成对象被删除前的一些清理工作。在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。如果程序中未声明
16、析构函数,编译器将自动产生一个默认的析构函数。构造函数和析构函数39第39页,此课件共64页哦构造函数和析构函数举例#includeusing namespace std;class Point public:Point(int xx,int yy);Point();/.其它函数原形 private:int X,int Y;构造函数和析构函数40第40页,此课件共64页哦Point:Point(int xx,int yy)X=xx;Y=yy;Point:Point()/.其它函数的实现略41第41页,此课件共64页哦类的应用举例:circle类(例4-3)一圆型游泳池如图所示,现在需在其周围建
17、一圆型过道,并在其四周围上栅栏。栅栏价格为35元/米,过道造价为20元/平方米。过道宽度为3米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。游泳池过道42第42页,此课件共64页哦#include using namespace std;const float PI=3.14159;const float FencePrice=35;const float ConcretePrice=20;/声明类声明类Circle 及其数据和方法及其数据和方法class Circle private:float radius;public:Circle(float r);/构造函数构造函数 f
18、loat Circumference()const;/圆周长圆周长 float Area()const;/圆面积圆面积;43第43页,此课件共64页哦/类的实现类的实现/构造函数初始化数据成员构造函数初始化数据成员radiusCircle:Circle(float r)radius=r/计算圆的周长计算圆的周长float Circle:Circumference()const return 2*PI*radius;/计算圆的面积计算圆的面积 float Circle:Area()const return PI*radius*radius;44第44页,此课件共64页哦void main()fl
19、oat radius;float FenceCost,ConcreteCost;/提示用户输入半径提示用户输入半径 coutradius;/声明声明 Circle 对象对象 Circle Pool(radius);Circle PoolRim(radius+3);45第45页,此课件共64页哦/计算栅栏造价并输出计算栅栏造价并输出 FenceCost=PoolRim.Circumference()*FencePrice;cout Fencing Cost is¥FenceCost endl;/计算过道造价并输出计算过道造价并输出 ConcreteCost=(PoolRim.Area()-Poo
20、l.Area()*ConcretePrice;cout Concrete Cost is¥ConcreteCost yabbaDabbaDo();/错误:错误:Fred类的对象在定义之前被使用类的对象在定义之前被使用 private:Fred&x;/正确,经过前向引用声明,可以声明正确,经过前向引用声明,可以声明Fred类的对象指针类的对象指针;class Fred public:void yabbaDabbaDo();private:Barney*y;类 的 组 合58第58页,此课件共64页哦前向引用声明注意事项n应该记住:当使用前向引用声明时,只能使用被声明的符号,而不能涉及类的实现(任
21、何)细节。类 的 组 合59第59页,此课件共64页哦结构体n结构体和类一样,可以有自己的数据成员和函数成员,包括构造函数和析构函数,可以控制访问权限,支持多态等。n结构体中和类的区别是如果未指定访问控制属性,结构体中为public,而类中为private。struct 结构体名结构体名 公有成员;公有成员;protected:保护成员;保护成员;private:私有成员;私有成员;60第60页,此课件共64页哦构造函数定义的类型转换n构造函数有类型转换的功能。Cout Line(point(1),point(4).getLen()endl;Point(int xx=0,int yy=0)X=
22、xx;Y=yy;Line(Point xp1,Point xp2););61第61页,此课件共64页哦构造函数定义的类型转换构造函数进行类型转换可以隐式进行。Cout Line(1,4).getLen()endl;Point(int xx=0,int yy=0)X=xx;Y=yy;Line(Point xp1,Point xp2););如果不允许构造函数隐式的类型转换,可以通过explicit声明构造函数。explicit Point(int xx=0,int yy=0)62第62页,此课件共64页哦小结n封装,继承,多态是面向对象的特征。nC+通过类实现对数据和操作的封装,和信息隐藏(访问修饰符)n生成对象时,系统自动调用构造函数。n销毁对象时,系统自动调用析构函数。n根据已有的对象,生成新的对象会调用拷贝构造函数。n可以通过功能简单的类来构造出组合类。组合类的构造函数应该保证对象成员能够初始化。63第63页,此课件共64页哦作业n可做的习题1,3,4,5,6,7,8,9,10,11,12,13,14,20上机作业上机作业8,9,2064第64页,此课件共64页哦