清华大学C++教案c++教学课件

上传人:沈*** 文档编号:241589595 上传时间:2024-07-07 格式:PPT 页数:71 大小:255KB
返回 下载 相关 举报
清华大学C++教案c++教学课件_第1页
第1页 / 共71页
清华大学C++教案c++教学课件_第2页
第2页 / 共71页
清华大学C++教案c++教学课件_第3页
第3页 / 共71页
点击查看更多>>
资源描述
第四章第四章 类与对象类与对象C+语言程序设计清华大学清华大学 郑郑 莉莉1C+语言程序设计清华大学 郑莉本章主要内容本章主要内容l面向对象的思想面向对象的思想lOOP的基本特点的基本特点l类概念和声明类概念和声明l对象对象l构造函数构造函数l析构函数析构函数l内联成员函数内联成员函数l拷贝构造函数拷贝构造函数l类的组合类的组合2C+语言程序设计清华大学 郑莉回顾:面向过程的设计方法回顾:面向过程的设计方法l重点重点:如何实现细节过程,将数据与函数分开。l形式:形式:主模块+若干个子模块(main()+子函数)。l特点:特点:自顶向下,逐步求精功能分解。l缺点:缺点:效率低,程序的可重用性差。面向对象的思想3C+语言程序设计清华大学 郑莉面向对象的方法面向对象的方法l目的:目的:实现软件设计的产业化。l观点:观点:自然界是由实体(对象)所组成。l程序设计方法:程序设计方法:使用面向对象的观点来描述模仿并处理现实问题。l要求:要求:高度概括、分类、和抽象。面向对象的思想4C+语言程序设计清华大学 郑莉抽象抽象抽象是对具体对象(问题)进行概括,抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述抽出这一类对象的公共性质并加以描述的过程。的过程。先注意问题的本质及描述,其次是实现过程或细节。数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。代码抽象:描述某类对象的共有的行为特征或具有的功能。抽象的实现:通过类的声明。OOP的基本特点5C+语言程序设计清华大学 郑莉抽象实例抽象实例钟表钟表l数据抽象:数据抽象:int Hour,int Minute,int Secondl代码抽象:代码抽象:SetTime(),ShowTime()OOP的基本特点6C+语言程序设计清华大学 郑莉抽象实例抽象实例钟表类钟表类class Clock public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;OOP的基本特点7C+语言程序设计清华大学 郑莉抽象实例抽象实例人人l数据抽象:数据抽象:char*name,char*gender,int age,int idl代码抽象:代码抽象:生物属性角度:GetCloth(),Eat(),Step(),社会属性角度:Work(),Promote(),OOP的基本特点8C+语言程序设计清华大学 郑莉封装封装将抽象出的数据成员、代码成员相结将抽象出的数据成员、代码成员相结合,将它们视为一个整体。合,将它们视为一个整体。目的是曾强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。实现封装:类声明中的OOP的基本特点9C+语言程序设计清华大学 郑莉封装封装l实例:实例:class Clock public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;边界特定的访问权限OOP的基本特点外部接口10C+语言程序设计清华大学 郑莉继承与派生继承与派生是是C+中支持层次分类的一种机制,中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,允许程序员在保持原有类特性的基础上,进行更具体的说明。进行更具体的说明。实现:声明派生类实现:声明派生类第七章第七章OOP的基本特点11C+语言程序设计清华大学 郑莉多态性多态性l多态:同一名称,不同的功能实现方式。多态:同一名称,不同的功能实现方式。l目的:达到行为标识统一,减少程序中标目的:达到行为标识统一,减少程序中标识符的个数。识符的个数。l实现:重载函数和虚函数实现:重载函数和虚函数第八章第八章OOP的基本特点12C+语言程序设计清华大学 郑莉c+中的类中的类l类是具有相同属性和行为的一组对象类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属供了统一的抽象描述,其内部包括属性和行为两个主要部分。性和行为两个主要部分。l利用类可以实现数据的封装、隐藏、利用类可以实现数据的封装、隐藏、继承与派生。继承与派生。l利用类易于编写大型复杂程序,其模利用类易于编写大型复杂程序,其模块化程度比块化程度比C中采用函数更高。中采用函数更高。类 和 对 象13C+语言程序设计清华大学 郑莉类的声明形式类的声明形式 类是一种用户自定义类型,声明形式:类是一种用户自定义类型,声明形式:class 类名称 public:公有成员(外部接口)private:私有成员 protected:保护型成员类 和 对 象14C+语言程序设计清华大学 郑莉公有类型成员公有类型成员在关键字在关键字public后面声明,它们是类后面声明,它们是类与外部的接口,任何外部函数都可以访与外部的接口,任何外部函数都可以访问公有类型数据和函数。问公有类型数据和函数。类 和 对 象15C+语言程序设计清华大学 郑莉私有类型成员私有类型成员在关键字在关键字private后面声明,只允许后面声明,只允许本类中的函数访问,而类外部的任何函本类中的函数访问,而类外部的任何函数都不能访问。数都不能访问。如果紧跟在类名称的后面声明私有成员,如果紧跟在类名称的后面声明私有成员,则关键字则关键字privateprivate可以省略。可以省略。类 和 对 象16C+语言程序设计清华大学 郑莉保护类型保护类型与与private类似,其差别表现在继承与类似,其差别表现在继承与派生时对派生类的影响不同,第七章讲。派生时对派生类的影响不同,第七章讲。类 和 对 象17C+语言程序设计清华大学 郑莉类的成员类的成员class Clock public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;类 和 对 象成员数据成员函数18void Clock:SetTime(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;void Clock:ShowTime()coutHour:Minute:Second;19 19C+语言程序设计清华大学 郑莉成员数据成员数据l与一般的变量声明相同,但需要将它与一般的变量声明相同,但需要将它放在类的声明体中。放在类的声明体中。类 和 对 象20C+语言程序设计清华大学 郑莉成员函数成员函数l在类中说明原形,可以在类外给出函数在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形定。也可以直接在类中给出函数体,形成内联成员函数。成内联成员函数。l允许声明重载函数和带默认形参值的函允许声明重载函数和带默认形参值的函数数类 和 对 象21C+语言程序设计清华大学 郑莉内联成员函数内联成员函数l为了提高运行时的效率,对于较简单为了提高运行时的效率,对于较简单的函数可以声明为内联形式。的函数可以声明为内联形式。l内联函数体中不要有复杂结构(如循内联函数体中不要有复杂结构(如循环语句和环语句和switch语句)。语句)。l在类中声明内联成员函数的方式:在类中声明内联成员函数的方式:将函数体放在类的声明中。使用inline关键字。类 和 对 象22C+语言程序设计清华大学 郑莉内联成员函数举例内联成员函数举例(一一)class Point public:void Init(int initX,int initY)X=initX;Y=initY;int GetX()return X;int GetY()return Y;private:int X,Y;类 和 对 象23C+语言程序设计清华大学 郑莉内联成员函数举例内联成员函数举例(二二)class Point public:void Init(int initX,int initY);int GetX();int GetY();private:int X,Y;类 和 对 象24inline void Point:Init(int initX,int initY)X=initX;Y=initY;inline int Point:GetX()return X;inline int Point:GetY()return Y;25 25C+语言程序设计清华大学 郑莉对象对象l类的对象是该类的某一特定实体,即类的对象是该类的某一特定实体,即类类型的变量。类类型的变量。l声明形式:声明形式:类名类名 对象名;对象名;l例:例:Clock myClock;类 和 对 象26C+语言程序设计清华大学 郑莉类中成员的访问方式类中成员的访问方式l类中成员互访类中成员互访直接使用成员名l类外访问类外访问使用“对象名.成员名”方式访问 public 属性的成员类 和 对 象27C+语言程序设计清华大学 郑莉例例4-1类的应用举例类的应用举例#includeusing namespace std;class Clock ./类的声明略类的声明略/.类的实现略类的实现略void main(void)Clock myClock;myClock.SetTime(8,30,30);myClock.ShowTime();类 和 对 象28C+语言程序设计清华大学 郑莉构造函数构造函数l构造函数的作用是在对象被创建时使构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象用特定的值构造对象,或者说将对象初始化初始化为一个特定的状态。为一个特定的状态。l在对象创建时在对象创建时由系统自动调用由系统自动调用。l如果程序中未声明,则系统自动产生如果程序中未声明,则系统自动产生出一个出一个默认形式默认形式的构造函数的构造函数l允许为允许为内联内联函数、函数、重载重载函数、函数、带默认带默认形参值形参值的函数的函数构造函数和析构函数29C+语言程序设计清华大学 郑莉构造函数举例构造函数举例class Clockpublic:Clock(int NewH,int NewM,int NewS);/构造函数构造函数void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;构造函数和析构函数30构造函数的实现:构造函数的实现:Clock:Clock(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;建立对象时构造函数的作用:建立对象时构造函数的作用:void main()Clock c(0,0,0);/隐含调用构造函数,将初始值作为实参。隐含调用构造函数,将初始值作为实参。c.ShowTime();31 31C+语言程序设计清华大学 郑莉拷贝构造函数拷贝构造函数拷贝构造函数是一种特殊的构造函数,其形参为拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。本类的对象引用。class 类名 public:类名(形参);/构造函数 类名(类名&对象名);/拷贝构造函数 .;类名:类名(类名&对象名)/拷贝构造函数的实现 函数体 构造函数和析构函数32C+语言程序设计清华大学 郑莉例例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;构造函数和析构函数33Point:Point(Point&p)X=p.X;Y=p.Y;cout拷贝构造函数被调用拷贝构造函数被调用endl;34 34C+语言程序设计清华大学 郑莉例例4-2 拷贝构造函数举例拷贝构造函数举例l当用类的一个对象去初始化该类的另一个当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷对象时系统自动调用拷贝构造函数实现拷贝赋值。贝赋值。void main(void)Point A(1,2);Point B(A);/拷贝构造函数被调用拷贝构造函数被调用 coutB.GetX()endl;构造函数和析构函数35C+语言程序设计清华大学 郑莉例例4-2拷贝构造函数举例拷贝构造函数举例l若函数的形参为类对象,调用函数时,若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝实参赋值给形参,系统自动调用拷贝构造函数。例如:构造函数。例如:void fun1(Point p)coutp.GetX()endl;void main()Point A(1,2);fun1(A);/调用拷贝构造函数调用拷贝构造函数 构造函数和析构函数36C+语言程序设计清华大学 郑莉拷贝构造函数拷贝构造函数(例例4-2)l当函数的返回值是类对象时,系统自动调用当函数的返回值是类对象时,系统自动调用拷贝构造函数。例如:拷贝构造函数。例如:Point fun2()Point A(1,2);return A;/调用拷贝构造函数调用拷贝构造函数void main()Point B;B=fun2();构造函数和析构函数37C+语言程序设计清华大学 郑莉拷贝构造函数拷贝构造函数如果程序员没有为类声明拷贝初始如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个拷化构造函数,则编译器自己生成一个拷贝构造函数。贝构造函数。这个构造函数执行的功能是:用作这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。初始化将要建立的对象的对应数据成员。构造函数和析构函数38C+语言程序设计清华大学 郑莉析构函数析构函数l完成对象被删除前的一些清理工作。完成对象被删除前的一些清理工作。l在对象的生存期结束的时刻系统自动在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空调用它,然后再释放此对象所属的空间。间。l如果程序中未声明析构函数,编译器如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数。将自动产生一个默认的析构函数。构造函数和析构函数39C+语言程序设计清华大学 郑莉构造函数和析构函数举例构造函数和析构函数举例#includeusing namespace std;class Point public:Point(int xx,int yy);Point();/.其它函数原形其它函数原形 private:int X,int Y;构造函数和析构函数40Point:Point(int xx,int yy)X=xx;Y=yy;Point:Point()/.其它函数的实现略其它函数的实现略41 41C+语言程序设计清华大学 郑莉类的应用举例类的应用举例(例例4-3)一圆型游泳池如图所示,现在需在其周围建一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格为一圆型过道,并在其四周围上栅栏。栅栏价格为35元元/米,过道造价为米,过道造价为20元元/平方米。过道宽度为平方米。过道宽度为3米,游泳池半径由键盘输入。要求编程计算并米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。输出过道和栅栏的造价。游泳池过道42#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);/构造函数构造函数 float Circumference()const;/圆周长圆周长 float Area()const;/圆面积圆面积;43 43/类的实现类的实现/构造函数初始化数据成员构造函数初始化数据成员radiusCircle:Circle(float r)radius=r/计算圆的周长计算圆的周长float Circle:Circumference()const return 2*PI*radius;/计算圆的面积计算圆的面积 float Circle:Area()const return PI*radius*radius;44 44void main()float radius;float FenceCost,ConcreteCost;/提示用户输入半径提示用户输入半径 coutradius;/声明声明 Circle 对象对象 Circle Pool(radius);Circle PoolRim(radius+3);45 45/计算栅栏造价并输出计算栅栏造价并输出 FenceCost=PoolRim.Circumference()*FencePrice;cout Fencing Cost is¥FenceCost endl;/计算过道造价并输出计算过道造价并输出 ConcreteCost=(PoolRim.Area()-Pool.Area()*ConcretePrice;cout Concrete Cost is¥ConcreteCost yabbaDabbaDo();/错误:错误:Fred类的对象在定义之前被使用类的对象在定义之前被使用 private:Fred*x;/正确,经过前向引用声明,可以声明正确,经过前向引用声明,可以声明Fred类的对象指针类的对象指针;class Fred public:void yabbaDabbaDo();private:Barney*y;类 的 组 合58C+语言程序设计清华大学 郑莉前向引用声明注意事项前向引用声明注意事项l应该记住:当你使用前向引用声明时,应该记住:当你使用前向引用声明时,你只能使用被声明的符号,而不能涉你只能使用被声明的符号,而不能涉及类的任何细节。及类的任何细节。类 的 组 合59C+语言程序设计清华大学 郑莉UML简介简介lUML语言是一种可视化的的面向对象建模语言是一种可视化的的面向对象建模语言。语言。lUML有三个基本的部分有三个基本的部分事物(Things)UML中重要的组成部分,在模型中属于最静态的部分,代表概念上的或物理上的元素关系(Relationships)关系把事物紧密联系在一起图(Diagrams)图是很多有相互相关的事物的组UML图形标识60C+语言程序设计清华大学 郑莉UML中有中有4种类型的事物种类型的事物l结构事物(结构事物(Structural things)l动作事物(动作事物(Behavioral things)l分组事物(分组事物(Grouping things)l注释事物(注释事物(Annotational things)UML图形标识61C+语言程序设计清华大学 郑莉UML中的关系中的关系l依赖(依赖(Dependencies)l关联(关联(Association)l泛化(泛化(generalization)l实现(实现(realuzation)UML图形标识62C+语言程序设计清华大学 郑莉UML中的中的9种图种图l类图(类图(class diagram)l对象图(对象图(class diagram)l用例图(用例图(Use case diagram)l顺序图(顺序图(Sequence diagram)l协作图(协作图(Collaboration diagram)l状态图(状态图(Statechart diagram)l活动图(活动图(Activity diagram)l组件图(组件图(Compomnent diagram)l实施图(实施图(Deployment diagram)UML图形标识63C+语言程序设计清华大学 郑莉类图类图l举例:举例:Clock类的完整表示类的完整表示lClock类的简洁表示类的简洁表示Clock-Hour:int-Minute:int-Second:int+ShowTime():void+SetTime(NewH:int=0,NewM:int=0,NewS:int=0):voidClockUML图形标识64C+语言程序设计清华大学 郑莉对象图对象图myClock:Clock-Hour:int-Minute:int-Second:intmyClock:ClockUML图形标识65C+语言程序设计清华大学 郑莉类与对象关系的图形标识类与对象关系的图形标识l依赖关系依赖关系图中的“类A”是源,“类B”是目标,表示“类A”使用了“类B”,或称“类A”依赖“类B”类 A类 BUML图形标识66C+语言程序设计清华大学 郑莉类与对象关系的图形标识类与对象关系的图形标识l作用关系作用关系关联关联图中的“重数A”决定了类B的每个对象与类A的多少个对象发生作用,同样“重数B”决定了类A的每个对象与类B的多少个对象发生作用。类 A重数A类 B重数BUML图形标识67C+语言程序设计清华大学 郑莉类与对象关系的图形标识类与对象关系的图形标识l包含关系包含关系聚集和组合聚集和组合类 A类 B重数A重数B类 A类 B重数A重数B聚集表示类之间的关系是整体与部分的关系,“包含”、“组成”、“分为部分”等都是聚集关系。UML图形标识68C+语言程序设计清华大学 郑莉类与对象关系的图形标识类与对象关系的图形标识l继承关系继承关系泛化泛化父类 A父类 B子类 1子类 2UML图形标识69C+语言程序设计清华大学 郑莉注释注释l在在UML图形上,注释表示为带有褶角图形上,注释表示为带有褶角的矩形,然后用虚线连接到的矩形,然后用虚线连接到UML的其的其他元素上,它是一种用于在图中附加他元素上,它是一种用于在图中附加文字注释的机制。文字注释的机制。注释文字UML图形标识70
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!