收藏 分销(赏)

C++类与对象PPT学习课件.ppt

上传人:丰**** 文档编号:10040593 上传时间:2025-04-19 格式:PPT 页数:77 大小:567.50KB 下载积分:16 金币
下载 相关 举报
C++类与对象PPT学习课件.ppt_第1页
第1页 / 共77页
C++类与对象PPT学习课件.ppt_第2页
第2页 / 共77页


点击查看更多>>
资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,1,本章主要内容,*,面向对象的思想,OOP,及其基本特点,类概念和声明,对象,构造函数,析构函数,拷贝构造函数,内联成员函数,类的聚集,静态成员,友元,this,1,2,回顾:面向过程的设计方法,重点,:,如何实现细节过程,将数据与函数分开。,形式:,主模块,+,若干个子模块(,main,(),+,子函数)。,特点:,自顶向下,逐步求精,功能分解。,缺点:,效率低,可维护性差,可重用性差。,一 面向对象的思想,2,3,面向对象的方法,目的:,高效快捷地实现软件设计的产业化。,观点:,自然界是由实体(对象)所组成。,程序设计方法:,使用面向对象的观点来描述模仿并处理现实问题。,要求:,高度概括、分类、和抽象。,面向对象的思想,3,面向对象,(Object Oriented,OO),是当前计算机界关心的重点,它是,20,世纪,90,年代以来软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、,CAD,技术、人工智能等领域。,面向对象的基本概念,面向对象的思想,4,对象:,现实世界中的各种具体的或抽象的“,事物,”,简单对象,:简单类型的对象。如,int,类型的常量或变量。,复杂对象,:复杂类型的对象。如用,class,、,struct,和,union,定义的类型的常量或变量。,函数成员,操作,行为,数据成员,属性,特征,程序设计,对象模型,现实世界,面向对象的基本概念,5,人类的定义:,struct HUMANKIND,char *name;,double weight;,public:,void eat();,void wear();,void reside();,void travel();,;,人类的实例:,HUMANKIND Zhang;,特征、属性、数据成员,行为、操作、函数成员,面向对象的基本概念,6,7,面向对象程序设计(,OOP,),面向对象程序设计的四个阶段,:,系统分析,系统设计,对象设计,对象实现。,系统分析,:,理解应用系统的定义及建立应用系统的对象模型。分析和发现对象,定义对象的属性和内部状态变换,定义外部事件和对象之间的联系及约束,最终建立应用系统的,对象模型,、,动态模型,及,功能模型,。,系统设计,:,确立对象模型的实现方法,。,分解系统,确定系统固有的并发性,分配处理器的任务,选择数据存储的管理手段,处理全局资源的访问,确立应用系统的边界。,二,OOP,及其基本特点,7,8,面向对象程序设计的四个阶段(续),:,对象设计,:将,系统分析阶段建立的三种模型转换成类,。,将对象模型转换为类的属性,将动态模型转换为类的方法,将功能模型转换为主控或子控模块。转换对象模型时要考虑对象关联,;,转换动态模型应选用事件驱动,;,转换功能模型时用顺序或事件驱动实现流程控制。,对象实现,:,用面向对象的程序设计语言实现对象设计阶段定义的类。选择合适的程序语言及开发环境,定义类的属性及其方法,编写主控模块及子控模块,针对具体语言进行性能调整。,面向对象程序设计(,OOP,),二,OOP,及其基本特点,8,9,抽象,抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。,先注意问题的本质及描述,其次是实现过程或细节。,属性抽象:描述某类对象的属性或状态(对象相互区别的物理量)。,行为抽象:描述某类对象的共有的行为特征或具有的功能。,抽象的实现:通过类的声明。,OOP,的基本特点,9,10,抽象实例钟表,属性抽象:,int,Hour,int,Minute,int,Second,行为抽象:,setTime,(),showTime,(),OOP,的基本特点,10,11,抽象实例钟表类,class Clock,public,:,void,s,etTime,(int NewH,int NewM,int NewS);void,s,howTime,(),;,private,:,int Hour,Minute,Second;,;,OOP,的基本特点,11,12,抽象实例人,属性抽象:,char*,name,char*,sex,int,age,int,id,行为抽象:,生物属性角度:,g,etCloth,(),e,at,(),s,tep,(),社会属性角度:,w,ork,(),p,romote,(),OOP,的基本特点,12,13,封装,将抽象出的属性成员、行为成员相结合,将它们视为一个整体。,目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。,实现封装:类声明中的,OOP,的基本特点,13,14,封装,实例:,class Clock,public,:void,setTime,(int NewH,int NewM,int NewS);void,showTime,(),;,private,:int Hour,Minute,Second;,;,边界,特定的访问权限,OOP,的基本特点,外部接口,14,15,继承与派生,是,C+,中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。,实现:声明派生类,OOP,的基本特点,15,16,多态性,多态:同一名称,不同的功能实现方式。,目的:达到行为标识统一,减少程序中标识符的个数。,实现:重载函数和虚函数,OOP,的基本特点,16,17,OOP,的基本特点,OOP,的四个基本特征,(,小结,),:,抽象,封装,继承,多态,对具体对象,(,问题,),进行概括,抽出这一类对象的公共性质并加以描述的过程。,将抽象出的数据及方法结合为一个整体的信息隐蔽技术。,对具有层次关系的类的数据和操作进行共享的一种方式。,不同的对象接受同一消息时产生不同的行动的现象。,17,18,c+,中的类,类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。,利用类可以实现数据的封装、隐藏、继承与派生。,利用类易于编写大型复杂程序,其模块化程度比,C,中采用函数更高。,三 类 和 对 象,18,19,类的声明形式,类是一种用户自定义类型,声明形式:,class,类名称,public:,公有成员,(外部接口),private:,私有成员,protected:,保护型成员,类 和 对 象,19,20,公有类型成员,在关键字,public,后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。,20,21,私有类型成员,在关键字,private,后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。,如果紧跟在类名称的后面声明私有成员,则关键字,private,可以省略。,21,22,保护类型,与,private,类似,其差别表现在继承与派生时对派生类的影响不同,后面章讲。,22,23,类的成员,class Clock,public:void,s,etTime,(int NewH,int NewM,int NewS);void,s,howTime,(),;,private:,int,Hour,Minute,Second,;,;,类 和 对 象,成员变量,成员函数,23,void Clock:,s,etTime(int NewH,int NewM,int NewS),Hour=NewH;,Minute=NewM;,Second=NewS;,void Clock:,s,howTime,(),coutHour:Minute:Second;,24,25,成员变量,与一般的变量声明相同,但需要将它放在类的声明体中。,25,26,成员函数,在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。,允许声明重载函数和带缺省形参值的函数,26,27,内联成员函数,为了提高运行时的效率,对于较简单的函数可以声明为内联形式。,内联函数体中不要有复杂结构(如循环语句和,switch,语句)。,在类中声明内联成员函数的方式:,将函数体放在类的声明中。,使用,inline,关键字。,类 和 对 象,27,28,内联成员函数举例,(,一,),class Point,public:,inline void,i,nit(,int initX,int initY),x,=initX;,y,=initY;,inline int,g,etX,(),return,x,;,inline int,g,etY,(),return,y,;,private:,int,x,y,;,;,类 和 对 象,28,29,内联成员函数举例,(,二,),class Point,public:,inline,void,i,nit(int initX,int initY);,inline,int,g,etX,();,inline,int,g,etY,();,private:,int,x,y,;,;,类 和 对 象,29,inline,void Point:Init(int initX,int initY),X=initX;,Y=initY;,inline,int Point:getX,(),return X;,inline,int Point:getY,(),return Y;,30,31,对象,类的对象是该类的某一特定实体,即类类型的变量。,声明形式:类名 对象名;,例:,Clock myClock;,类 和 对 象,31,32,类中成员的访问方式,类中成员互访,直接使用成员名,类外访问,使用“,对象名,.,成员名,”方式访问,public,属性的成员,类 和 对 象,32,33,例4-1,类的应用举例,#include,class Clock,./,类的声明略,/.,类的实现略,void main(void),Clock,myClock,;,myClock.,s,etTime,(8,30,30);,myClock.,s,howTime,(),;,类 和 对 象,33,34,构造函数,构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象,初始化,为一个特定的状态。,在对象创建时,由系统自动调用,。,如果程序中未声明,则系统自动产生出一个,缺省形式,的构造函数,允许为,内联,函数、,重载,函数、,带缺省形参值,的函数,构造函数和析构函数,34,35,构造函数举例,class Clock,public:,Clock(int NewH,int NewM,int NewS);/,构造函数,void,s,etTime(int NewH,int NewM,int NewS);,void,s,howTime,(),;,private:,int Hour,Minute,Second;,;,构造函数和析构函数,35,构造函数的实现:,Clock:Clock(int NewH,int NewM,int NewS),Hour=H;,Minute=M;,Second=S;,建立对象时构造函数的作用:,void main,(),Clock c(0,0,0);/,隐含调用构造函数,将初始值作为实参。,c.,s,howTime,(),;,36,37,拷贝构造函数,拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。,class,类名,public:,类名(形参);,/,构造函数,类名(类名,&,对象名);,/,拷贝构造函数,.,;,类名,:,类名(类名,&,对象名),/,拷贝构造函数的实现,函数体,构造函数和析构函数,37,38,例,4-2,拷贝构造函数举例,class Point,public:,Point(int xx=0,int yy=0)x=xx;y=yy;,Point(const Point,int getX,(),return x;,int getY,(),return y;,private:,int x,y;,;,构造函数和析构函数,38,Point:Point(const Point&p),x=p.x;,y=p.y;,cout,拷贝构造函数被调用,endl;,39,40,例,4-2,拷贝构造函数举例,当用类的一个对象去初始化该类的另一个对象时系统自动调用它实现拷贝赋值。,void main(void),Point A(1,2);,Point B(A);/,拷贝构造函数被调用,coutB.getX,(),endl;,构造函数和析构函数,40,41,拷贝构造函数举例,(,例,4-2),若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。例如:,void fun1(Point p),coutp.getX,(),endl;,void main,(),Point A(1,2);,fun1(A);/,调用拷贝构造函数,构造函数和析构函数,41,42,拷贝构造函数举例,(,例,4-2),当函数的返回值是类对象时,系统自动调用拷贝构造函数。例如:,Point fun2,(),Point A(1,2);,return A;/,调用拷贝构造函数,void main,(),Point B;,B=fun2,(),;,构造函数和析构函数,42,43,拷贝构造函数,如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个拷贝构造函数。,这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。,构造函数和析构函数,43,44,析构函数,完成对象被删除前的一些清理工作。,在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。,如果程序中未声明析构函数,编译器将自动产生一个缺省的析构函数。,构造函数和析构函数,44,45,构造函数和析构函数举例,#include,class Point,public:,Point(int xx,int yy);,Point,(),;,/.,其它函数原形,private:,int x,int y;,;,构造函数和析构函数,45,Point:Point(int xx,int yy),x=xx;y=yy;,Point:Point,(),/.,其它函数的实现略,46,47,例4-3,类的应用举例,键盘输入多个点数据,并计算这些点顺次连成的折线的总长度。,double calculateDistance(Point&p1,Point&p2),return sqrt(p1.getX()*p2.getX()+p1.getY()*p2.getY();,47,48,49,组合的概念,组合:类中的成员变量是另一个类的对象。,类 的 组 合,49,50,举例,类 的 组 合,class Line,private:,P,oint p1,p2,;/,线段的两个端点,public:,Line(Point a,Point b);/,构造函数,Void Draw(void);/,画出线段,;,/.,函数的实现略,50,51,类组合的构造函数设计,原则:不仅要负责对本类中的基本类型成员变量赋初值,也要对对象成员初始化。,声明形式:,类名,:,类名,(,对象成员所需的形参,本类成员形参,),:对象,1(,参数,),,对象,2(,参数,),,,.,本类初始化,类 的 组 合,51,52,类组合的构造函数调用,构造函数调用顺序:先调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造)。然后调用本类的构造函数。(析构函数的调用顺序相反),若调用缺省构造函数(即无形参的),则内嵌对象的初始化也将调用相应的缺省构造函数。,类 的 组 合,52,53,类的组合举例(二),class Part /,部件类,public:,Part,(),;,Part(int i);,Part,(),;,void Print,(),;,private:,int val;,;,类 的 组 合,53,class Whole,public:,Whole,(),;,Whole(int i,int j,int k);,Whole,(),;,void Print,(),;,private:,Part one;,Part two;,int date;,;,54,Whole:Whole,(),/,调用,Part,的默认构造函数,date=0;,Whole:Whole(int i,int j,int k):,two(i),one(j),date(k),/,调用,Part,的带参数构造函数,/.,其它函数的实现略,55,56,前向引用声明,类应该先声明,后使用,;,如果需要在某个类的声明之前,引用该类,则应进行,前向引用声明,。,前向引用声明只为程序引入一个标识符,但具体声明在其它地方。,56,57,前向引用声明举例,class B;/,前向引用声明,class A,public:,void f(B b);,;,class B,public:,void g(A a);,;,57,58,声明及用途,template ,类声明,使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括系统预定义的和用户自定义的)。,类 模 板,58,59,例,4-4,类模板应用举例,类 模 板,键盘输入多个点数据,并计算这些点顺次连成的折线的总长度。(,与例4-3功能一样,但是点的数据类型要采用float实现,是否需要再设计一个类型为float的Point对象呢?,),59,60,61,62,静态成员,需要为某个类的所有对象分配一个共享存储空间。,C,语言采用全局变量来解决,但这种做法不安全,容易重名。,C+,中采用静态成员的方式来实现,可以把一个成员变量定义成静态的,这样不管定义多少个对象,这个静态成员只有一个实例。并被所有对象所共享。,静态成员包括:静态成员变量和静态成员函数,静态成员,62,63,静态成员,63,64,静态成员的初始化与调用,静态成员,:,:,(参数列表),64,静态成员,在类定义时,使用关键字,static,可将成员(数据成员和函数成员)定义为静态成员。,特征是,不管这个类创建了多少个对象,其静态成员只有一个副本,这个副本被所有的对象共享。(不是独有的),静态数据成员,静态函数成员,65,静态数据成员的初始化,静态数据成员必须进行初始化,。在程序一开始运行时静态数据成员就必须存在,因为在程序运行中要调用,所以静态数据成员不能在任何函数内分配空间和初始化。最好在类的实现部分中完成静态数据成员的初始化。,静态数据成员初始化与一般数据成员初始化不同,其格式如下:,:=;,66,静态成员的调用,调用,公有,静态成员时,可采用如下格式之一:,:,对象,.,对象指针,-,静态成员,67,静态函数成员,静态成员函数属于整个类,此类所有对象所共享的成员函数。,使用,公有,静态成员函数的调用方式,类名,:,静态成员函数,(,实参表,);,对象名,.,静态成员函数,(,实参表,);,对象指针,-,静态成员函数,(,实参表,);,68,注意:,静态成员函数可以直接访问该类的静态数据和静态函数成员,但由于静态成员函数不属于某一个特定的对象,因此它不能随意访问类的非静态数据成员,69,a=2,b=16,a=4,b=16,?,70,71,友元,根据封装性,一般将类中的数据成员声明为私有成员,外部可以通过类的公有成员函数对私有成员进行访问。,但有时类体外的一些函数需要直接访问类的数据成员,又不改变其数据成员的访问权限,这时,需要定义友元。,友元,71,72,友元的作用,友元提供了不同类或对象的成员函数之间、类的成员函数与普通函数之间进行数据共享的机制。,友元可以访问类中所有成员,但不是类的成员。,友元虽然不是类的成员,但它是类的朋友,可以直接访问类的所有成员。,友元,72,73,友元的定义,如果友元是普通函数或另一个类的成员函数,称为,友元函数,;如果友元是一个类,则称为,友元类,,友元类的所有成员函数都成为友元函数。友元函数和友元类在被访问的类中声明,其格式分别如下:,友元,friend ();,friend;,73,单向性,一厢情愿的友元,A,是,B,的友元,但,B,不一定是,A,的友元,友员没有传递性,A,是,B,的友元,,B,是,C,的友元,但,A,不一定是,C,的友元,例如,:,class A;,friend B,;,/,说明类,B,是类,A,的友员,public:,void Display()cout x endl;,private:int x;,;,class B,public:,void Set(int i),a.x=i,;,/,使用类,A,对象,a,的私有数据成员,void Display()a.Display();,private:,A a,;,/,类,A,对象,a,是私有数据成员,;,main(),B b;b.set(100);b.display();,74,75,this,指针,this,指针是一个特殊的隐含指针,它隐含于每一个类的成员函数中,也就是说,每个成员函数都有一个,this,指针参数,,指向调用该函数的对象,。,当一个对象调用成员函数时,编译程序先将对象的地址赋给,this,指针,然后调用成员函数,每次成员函数存取数据成员时,则隐含使用,this,指针,通常不显式地使用,this,指针来引用数据成员。,可以使用*,this,来标识调用该成员函数的当前对象。,静态成员中不能访问,this,指针,,因为静态成员函数不从属于任何对象。,this,指针一般用于返回当前对象自身。,this,75,76,77,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服