收藏 分销(赏)

类与对象(1).ppt

上传人:w****g 文档编号:13134780 上传时间:2026-01-25 格式:PPT 页数:86 大小:639.54KB 下载积分:8 金币
下载 相关 举报
类与对象(1).ppt_第1页
第1页 / 共86页
类与对象(1).ppt_第2页
第2页 / 共86页


点击查看更多>>
资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,C+,语言程序设计,回顾:面向过程的设计方法,重点,:,如何实现细节过程,将数据与函数分开。,形式:,主模块,+,若干个子模块(,main()+,子函数)。,特点:,自顶向下,逐步求精,功能分解。,缺点:,效率低,程序的可重用性差。,面向对象的思想,1,面向对象的方法,目的:,实现软件设计的产业化。,观点:,自然界是由实体(对象)所组成。,程序设计方法:,使用面向对象的观点来描述模仿并处理现实问题。,要求:,高度概括、分类、和抽象。,面向对象的思想,2,从面向过程到面向对象,面向对象的思想,对象,类,计算机世界,实体,抽象类别,现实世界,客观世界,抽象,抽象,实例化,映射,主观世界,对象、实体与类,现实世界中的实体可以抽象出类别的概念。对应于计算机世界就有一个类(,class,)的概念,因为类是一个抽象的概念的对应体,所以计算机不给它分配内存,只给对象分配内存。图,3,表达了计算机世界与现实世界之间的对应关系。,3,抽象,抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。,先注意问题的本质及描述,其次是实现过程或细节。,数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。,代码抽象:描述某类对象的共有的行为特征或具有的功能。,抽象的实现:通过类的声明。,OOP,的基本特点,4,汽车类,汽车对象,汽车对象,汽车对象,汽车对象,5,抽象实例钟表,数据抽象:,int Hour,int Minute,int Second,代码抽象:,SetTime(),ShowTime(),OOP,的基本特点,6,抽象实例钟表类,class Clock,public:,void SetTime(int NewH,int NewM,int NewS);void ShowTime();,private:,int Hour,Minute,Second;,;,OOP,的基本特点,7,抽象实例人,数据抽象:,char*name,char*gender,int age,int id,代码抽象:,生物属性角度:,GetCloth(),Eat(),Step(),社会属性角度:,Work(),Promote(),OOP,的基本特点,8,封装,将抽象出的数据成员、代码成员相结合,将它们视为一个整体。,目的是曾强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。,实现封装:类声明中的,OOP,的基本特点,9,封装,实例:,class Clock,public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();,private:int Hour,Minute,Second;,;,边界,特定的访问权限,OOP,的基本特点,外部接口,10,继承与派生,是,C+,中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。,实现:声明派生类,第,7,章,OOP,的基本特点,11,多态性,多态:同一名称,不同的功能实现方式。,目的:达到行为标识统一,减少程序中标识符的个数。,实现:重载函数和虚函数,第,8,章,OOP,的基本特点,12,c+中的类,类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。,利用类可以实现数据的封装、隐藏、继承与派生。,利用类易于编写大型复杂程序,其模块化程度比,C,中采用函数更高。,类 和 对 象,13,类的声明形式,类 和 对 象,在,C+,中,类是一种数据类型。,数组和枚举类型是由用户自己定义,自己按规则构造出来的,但其基本组成单位(数据成员)都是同一种数据类型。然而客观事物是复杂的,要描述它必须从多方面进行,也就是用不同的数据类型来描述不同的方面。,如商场中的商品可以这样描述:,商品名称(用字符串描述),该商品数量(用整型数描述),该商品单价(用浮点数描述),该商品总价(用浮点数描述)。,这里用了属于三种不同数据类型的四个数据成员(,data member,)来描述一种商品。,14,类 和 对 象,在,C+,中可以这样表述:,class CGoods,public:,char Name21;,/,对于中文可用,wchar_t name11,int Amount;,float Price;,float Total_value;,;/,最后的分号不可少,这是一条说明语句,关键字,class,是数据类型说明符,指出下面说明的是类。标识符,CGoods,是商品这个类的类型名。,花括号中是构成类体的一系列的成员,,关键字,public,是一种访问限定符,表示其后所列为公共成员,就是说可以在外部对这些成员进行访问。,15,类的声明形式,类是一种用户自定义类型,声明形式:,class 类名称,public:,公有成员(外部接口),private:,私有成员,protected:,保护型成员,;/最后的分号不可少;注意:所有说明都有分号,其中“class 类名”称为类头(class head)。花括号中的部分称为类体(class body),类体中定义了类成员表(class member list)。,类定义的更关键部分是对数据成员的操作。这可以用函数来完成。,类 和 对 象,16,类的声明形式,类 和 对 象,访问限定符(,access specifier,)有三种:,public,(公共的),private,(私有的),protected,(保护的),其中后两种说明的成员是不能从外部进行访问的。每种说明符可在类体中使用多次。它们的作用域是从该说明符出现开始到下一个说明符之前或类体结束之前结束。,如果在类体起始点无访问说明符,系统默认定义为私有(,private,)。,访问说明符,private,(私有的)和,protected,(保护的)体现了类具有封装性(,Encapsulation,)。,17,公有类型成员,在关键字public,后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。,公有成员不仅可以被成员函数访问,而且可以在程序中被引用。它提供了类的接口功能。通常将类中的全部或部分成员函数定义为公有成员。,类 和 对 象,18,私有类型成员,在关键字private,后面声明,,只允许本类中的函数访问,而类外部的任何函数都不能访问。,私有成员是被隐藏的数据,只有该类的成员函数或友元函数才可以引用它,在程序中不可访问,通常将一些数据成员定义为私有成员。,如果,紧跟在类名称的后面声明私有成员,则,关键字,private可以,省略。,类 和 对 象,19,保护类型,protected,与,private,类似,其差别表现在继承与派生时对派生类的影响不同,第,7,章讲。,保护成员除了该类的成员函数或友元函数可以引用它外,该类的派生类的成员函数也可访问它。,类 和 对 象,20,为了提高运行时的效率,对于较简单的函数可以声明为内联形式。,void SetLeft(int t)left=t;/以下皆为内联成员函数,return A;/调用拷贝构造函数,class Barney,类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。,利用类可以实现数据的封装、隐藏、继承与派生。,public:,调用拷贝构造函数的情形,Hour=NewH;,函数名与类名相同。,void f(B b);,数组和枚举类型是由用户自己定义,自己按规则构造出来的,但其基本组成单位(数据成员)都是同一种数据类型。,Fencing Cost is¥2858.,函数定义通常在类的说明之后进行,格式:,Concrete Cost is¥4335.,19,这样描述一种商品的完整方式如下:,class CGoods,private:,char Name21;,int Amount;,float Price;,float Total_value;,public:,void RegisterGoods(char*,int,float);/,输入数据,void CountTotal(void);/,计算商品总价值,void GetName(char*);/,读取商品名,int GetAmount(void);/,读取商品数量,float GetPrice(void);/,读取商品单价,float GetTotal_value(void);/,读取商品总价值,;,21,类的成员,class Clock,public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();,private:,int Hour,Minute,Second;,;,类 和 对 象,成员数据,成员函数,22,void Clock:SetTime(int NewH,int NewM,int NewS),Hour=NewH;,Minute=NewM;,Second=NewS;,void Clock:ShowTime(),coutHour:Minute:Second;,19,23,成员数据,与一般的变量声明相同,但需要将它放在类的声明体中。,类 和 对 象,24,成员函数,在类中引进了成员函数,(member function),或函数成员,也就是函数也成了数据,(,类,),中的一员。,类把数据(事物的属性)和函数(事物的行为,操作)封装为一个整体。,注意,:,四个数据成员被说明成私有的,而六个函数成员被说明成公有的;这就是说如果从外部对四个数据成员进行操作的话,只能通过六个公有函数来完成,数据受到了良好的保护,不易受副作用的影响。公有函数集定义了类的接口(,interface,)。,类是一种数据类型,定义时系统并不为类分配存储空间,所以不能对类的数据成员初始化。当然类中的任何数据成员也不能使用关键字,extern,、,auto,或,register,限定其存储类型。,成员函数可以直接使用类定义中的任一成员,可以处理数据成员,也可调用函数成员,。,25,成员函数,在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。,允许声明重载函数和带默认形参值的函数,类 和 对 象,26,成员函数定义/实现,类 和 对 象,函数定义通常在类的说明之后进行,格式:,返回值类型,类名,:,函数名,(,参数表,),/,函数体,其中运算符,“,:”,称为作用域解析运算符,(scope resolution operator),,它指出该函数是属于哪一个类的成员函数。当然也可以在类的定义中直接定义函数。但系统处理方法不一样。,27,类,CGoods,的函数可以如下定义:,void CGoods:RegisterGoods(char*name,int amount,float price),/char*,是指向字符的指针类型说明,,name,现可理解为字符串,strcpy(Name,name);/,字符串拷贝函数,Amount=amount;Price=price;,void CGoods:CountTotal(void),Total_value=Price*Amount;,void CGoods:GetName(char*name),strcpy(name,Name);,int CGoods:GetAmount(void)return(Amount);,float CGoods:GetPrice(void)return(Price);,float CGoods:GetTotal_value(void)return(Total_value);,28,内联成员函数,为了提高运行时的效率,对于较简单的函数可以声明为内联形式。,内联函数体中不要有复杂结构(如循环语句和,switch,语句)。,在类中声明内联成员函数的方式:,将函数体放在类的声明中。,使用,inline,关键字。,类 和 对 象,29,内联成员函数举例(一),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;,;,隐式声明,类 和 对 象,30,内联成员函数举例(二),class Point,public:,void Init(int initX,int initY);,int GetX(),;,int GetY(),;,private:,int X,Y;,;,显示声明,类 和 对 象,31,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,32,对象,类的对象是该类的某一特定实体,即类类型的变量。,声明形式:类名 对象名;,例:,Clock myClock;,类 和 对 象,33,类中成员的访问方式,类中成员互访,直接使用成员名,类外访问,使用“对象名,.,成员名”方式访问,public,属性的成员,类 和 对 象,34,例4-1类的应用举例,#include,using namespace std;,class Clock,./,类的声明略,/.类的实现略,void main(void),Clock myClock;,myClock.SetTime(8,30,30);,myClock.ShowTime();,类 和 对 象,35,构造函数,构造函数和析构函数,定义对象时,按现在已学过的知识无法进行初始化,即无法对数据成员进行赋初值的过程。数据成员,从封装的目的出发,应该多为私有的,要对它们进行初始化,看来必须用一个公有函数来进行。,同时这个函数应该在且仅在定义对象时自动执行一次,否则就不是初始化了。在,C+,程序设计语言中这个函数称为构造函数。必须指出:调用构造函数也是建立对象的唯一方法(联合例外)。,36,构造函数,构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。,在对象创建时由系统自动调用。,如果程序中未声明,则系统自动产生出一个默认形式的构造函数,允许为内联函数、重载函数、带默认形参值的函数,构造函数和析构函数,37,构造函数,构造函数和析构函数,对于对象的初始化,采用构造函数(,constructor,)。当需要对对象进行初始化时,总是编写一个或一组构造函数。构造函数是特殊的公有成员函数,其特征如下:,1.,函数名与类名相同。,2.,构造函数无函数返回类型说明。注意是没有而不是,void,,即什么也不写,也不可写,void,!实际上构造函数有返回值,返回的就是构造函数所创建的对象。,3.,在程序运行时,当新的对象被建立,该对象所属的类的构造函数自动被调用,在该对象生存期中也只调用这一次。,4.,构造函数可以重载。严格地讲,说明中可以有多个构造函数,它们由不同的参数表区分,系统在自动调用时按一般函数重载的规则选一个执行。,38,构造函数,构造函数和析构函数,5.,构造函数可以在类中定义,也可以在类外定义。,6.,如果类说明中没有给出构造函数,则,C+,编译器自动给出一个缺省的构造函数,:,类名,(void),但只要我们定义了一个构造函数,系统就不会自动生成缺省的构造函数。,缺省的构造函数,也可以由程序员自己来编,只要构造函数是无参的或者只要各参数均有缺省值的,,C+,编译器都认为是缺省的构造函数,并且缺省的构造函数只能有一个。,如果对象的数据成员全为公有的,也可以在对象名后加“,=”,加“,”,,在花括号中顺序填入全体数据成员的初始值,.,39,构造函数举例,class Clock,public:,Clock(int NewH,int NewM,int NewS);/,构造函数,void SetTime(int NewH,int NewM,int NewS);,void ShowTime();,private:,int Hour,Minute,Second;,;,构造函数和析构函数,40,构造函数的实现:,Clock:Clock(int NewH,int NewM,int NewS),Hour=NewH;,Minute=NewM;,Second=NewS;,建立对象时构造函数的作用:,void main(),Clock c(0,0,0);/,隐含调用构造函数,将初始值作为实参。,c.ShowTime();,31,41,拷贝构造函数,构造函数和析构函数,同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或称拷贝是完全可行的。这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。在建立对象时可用同一类的另一个对象来初始化该对象,这时所用的构造函数称为拷贝初始化构造函数(,Copy Constructor,)。,42,拷贝构造函数,拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。,class 类名,public:,类名(形参);/构造函数,类名(类名&对象名);,/拷贝构造函数,.,;,类名:类名(类名&对象名),/拷贝构造函数的实现,函数体 ,构造函数和析构函数,43,例4-2 拷贝构造函数举例,class Point,public:,Point(int xx=0,int yy=0)X=xx;Y=yy;,Point(Point,int GetX()return X;,int GetY()return Y;,private:,int X,Y;,;,构造函数和析构函数,44,Point:Point(Point&p),/,拷贝构造函数的实现,X=p.X;,Y=p.Y;,cout,拷贝构造函数被调用,endl;,34,45,调用拷贝构造函数的情形,当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。,void main(void),Point A(1,2);,Point B(A);/,拷贝构造函数被调用,coutB.GetX()endl;,构造函数和析构函数,46,拷贝构造函数,如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个拷贝构造函数。,这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。,构造函数和析构函数,47,若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。调用函数时,进行形参与实参结合时使用。这时要在内存新建立一个局部对象,并把实参拷贝到新的对象中。理所当然也调用拷贝构造函数。,例如:,void fun1(Point p),coutp.GetX()endl;,void main(),Point A(1,2);,fun1(A);/,调用拷贝构造函数,构造函数和析构函数,调用拷贝构造函数的情形,48,当函数的返回值是类对象时,系统自动调用拷贝构造函数。,函数执行完成返回调用者时使用。理由也是要建立一个临时对象中,再返回调用者。为什么不直接用要返回的局部对象呢?因为局部对象在离开建立它的函数时就消亡了,不可能在返回调用函数后继续生存,所以在处理这种情况时,编译系统会在调用函数的表达式中创建一个无名临时对象,该临时对象的生存周期只在函数调用处的表达式中。所谓,return,对象,实际上是调用拷贝构造函数把该对象的值拷入临时对象。如果返回的是变量,处理过程类似,只是不调用构造函数。,构造函数和析构函数,调用拷贝构造函数的情形,49,例如:,Point fun2(),Point A(1,2);,return A;/调用拷贝构造函数,void main(),Point B;,B=fun2();,构造函数和析构函数,调用拷贝构造函数的情形,50,析构函数,构造函数和析构函数,当一个对象定义时,,C+,自动调用构造函数建立该对象并进行初始化,那么当一个对象的生命周期结束时,,C+,也会自动调用一个函数注销该对象并进行善后工作,这个特殊的成员函数即析构函数(,destructor,):,1.,构函数名与类名相同,但在前面加上字符,,如,Clock,()。,2.,析构函数无函数返回类型,与构造函数在这方面是一样的。但析构函数不带任何参数。,3.,一个类有一个也只有一个析构函数,这与构造函数不同。析构函数可以缺省。,4.,对象注销时,系统自动调用析构函数。,51,析构函数,完成对象被删除前的一些清理工作。,在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。,如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数。,构造函数和析构函数,52,构造函数和析构函数举例,#include,using namespace std;,class Point,public:,Point(int xx,int yy);,Point();,/.,其它函数原形,private:,int X,int Y;,;,构造函数和析构函数,53,关联(Association),Minute=NewM;,Whole();,为什么不直接用要返回的局部对象呢?因为局部对象在离开建立它的函数时就消亡了,不可能在返回调用函数后继续生存,所以在处理这种情况时,编译系统会在调用函数的表达式中创建一个无名临时对象,该临时对象的生存周期只在函数调用处的表达式中。,private:,成员名”方式访问 public 属性的成员,#include,void Clock:ShowTime(),泛化(generalization),int Amount;,它们的作用域是从该说明符出现开始到下一个说明符之前或类体结束之前结束。,如商场中的商品可以这样描述:,构函数名与类名相同,但在前面加上字符,如,组件图(Compomnent diagram),/构造函数初始化数据成员radius,Point:Point(int xx,int yy),X=xx;Y=yy;,Point:Point(),/.,其它函数的实现略,41,54,类的应用举例(例4-3),一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格为,35,元,/,米,过道造价为,20,元,/,平方米。过道宽度为,3,米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。,游泳池,过道,55,#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,56,/,类的实现,/,构造函数初始化数据成员,radius,Circle:Circle(float r),radius=r;,/,计算圆的周长,float Circle:Circumference()const,return 2*PI*radius;,/,计算圆的面积,float Circle:Area()const,return PI*radius*radius;,44,57,void main(),float radius;,float FenceCost,ConcreteCost;,/,提示用户输入半径,coutradius;,/,声明,Circle,对象,Circle Pool(radius);,Circle PoolRim(radius+3);,45,58,/,计算栅栏造价并输出,FenceCost=PoolRim.Circumference()*FencePrice;,cout Fencing Cost is,¥,FenceCost endl;,/,计算过道造价并输出,ConcreteCost=(PoolRim.Area()-Pool.Area()*ConcretePrice;,cout Concrete Cost is,¥,ConcreteCost endl;,运行结果,Enter the radius of the pool:10,Fencing Cost is,¥,2858.85,Concrete Cost is,¥,4335.39,46,59,46,范例:设计一个程序,定义一个矩形类,包括数据成员和函数成员。要求有构造函数、析构函数,完成赋值、修改、显示等功能的接口,并编写,main,函数测试,要求用一个对象初始化另一对象。,分析,要确定一个矩形(四边都是水平或垂直方向,不能倾斜),只要确定其左上角和右下角的,x,和,y,坐标即可,因此应包括四个数据成员,,left,right,top,bottom,,即左右上下四个边界值。,由构造函数对数据成员赋值,赋值函数完成未初始化的矩形赋值,修改函数可以修改各数据成员,显示函数则给出该矩形参数。,class Rectangle,public:Rectangle(int l=0,int t=0,int r=0,int b=0);,/,缺省构造函数必须在此指定缺省实参,Rectangle(),;,/,析构函数,在此函数体为空,void Assign(int l,int t,int r,int b);,void SetLeft(int t)left=t;/,以下皆为内联成员函数,void SetRight(int t)right=t;,void SetTop(int t)top=t;,void SetBottom(int t)bottom=t;,void Show();,private,:,int left,top,right,bottom;,;/,将上述内容保存为,rect.h,60,46,#include,#include“rect.h”,/,构造函数,带缺省参数,缺省值为全,0,,在声明中指定,Rectangle:Rectangle(int l,int t,int r,int b),left=l;top=t;,right=r;bottom=b;,void Rectangle:Assign(int l,int t,int r,int b),left=l;top=t;,right=r;bottom=b;,void Rectangle:Show(),cout”left-top point is(”left”,”top”)”n;,cout”right-bottom point is(”right”,”bottom,”)”Rectangle(left,top,right,bottom);,/,将上述内容保存为,rect.cpp,61,46,#include,#include“rect.h”,void main(),Rectangle rect;,rect.Show();,rect.Assign(100,200,300,400);,rect.Show();,Rectangle rect1(0,0,200,200);,rect1.Show();,Rectangle rect2,(,rect1,),;,rect2.Show();,62,组合的概念,类中的成员数据是另一个类的对象。,可以在已有的抽象的基础上实现更复杂的抽象。,类 的 组 合,63,举例,class Point,private:,float x,y;/点的坐标,public:,Point(float h,float v);/构造函数,float GetX(void);/取X坐标,float GetY(void);/取Y坐标,void Draw(void);/在(x,y),处画点,;,/.函数的实现略,类 的 组 合,64,class Line,private:,Point p1,p2;/线段的两个端点,public:,Line(Point a,Point b);/,构造函数,Void Draw(void);/画出线段,;,/.,函数的实现略,49,65,拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。,void f(B b);,调用函数时,进行形参与实参结合时使用。,inline int Point:GetX(),注释事物(Annotational things),void SetBottom(int t)bottom=t;,Point B;,Y=initY;,#include,return X;,函数体 ,在C+程序设计语言中这个函数称为构造函数。,类与对象关系的图形标识,它们的作用域是从该说明符出现开始到下一个说明符之前或类体结束之前结束。,这就是说如果从外部对四个数据成员进行操作的话,只能通过六个公有函数来完成,数据受到了良好的保护,不易受副作用的影响。,类组合的构造函数设计,原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。,声明形式:,类名,:,类名,(,对象成员所需的形参,本类成员形参,),:对象,1(,参数,),对象,2(,参数,),.,本类初始化,类 的 组 合,66,类组合的构造函数调用,构造函数调用顺序:先调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造)。然后调用本类的构造函数。(析构函数的调用顺序相反),若调用默认构造函数(即无形参的),则内嵌对象的初始化也将调用相应的默认构造函数。,类 的 组 合,67,类的组合举例(二),class Part /部件类,public:,Part();,Part(int i);,Part();,void Print();,private:,int val;,;,类 的 组 合,68,class Whole,public:,Whole();,Whole(int i,int j,int k);,Whole();,void Print();,private:,Part one;,Part two;,int date;,;,53,69,Whole:Whole(),date=0;,Whole:Whole(int i,int j,int k):,two(i),one(j),date(k),/.,其它函数的实现略,54,70,前向引用声明,类应该先声明,后使用,如果需要在某个类的声明之前,引用该类,则应进行前向引用声明。,前向引用声明只为程序引入一个标识符,但具体声明在其它地方。,类 的 组 合,71,前向引用声明举例,class B;/前向引用声明,class A,public:,void f(B b);,;,class B,public:,void g(A a);,;,类 的 组 合,72,前向引用声明注意事项,使用前向引用声明虽然可以解决一些问题,但它并不是万能的。需要注意的是,尽管使用了前向引用声明,但是在提供一个完整的类声明之前,不能声明该类的对象,也不能在内联成员函数中使用该类的对象。,class Fred;/,前向引用声明,class Barney,Fred x;/,错误:类,Fred,的声明尚不完善,;,class Fred,Barney y;,;,类 的 组 合,73,前向引用声明注意事项,class Fred;/,前向引用声明,class Barney,public:,void method(),x-yabbaDabbaDo();/,错误:,Fred,类的对象在定义之前被使用,private:,Fred*x;/,正确,经过前向引用声明,可以声明,Fred,类的对象指针,;,class Fred,public:,void yabbaDabbaDo();,private:,Barney*y;,;,类 的 组 合,74,前向引用声明注意事项,应该记住:当你使用前向引用声明时,你只能使用被声明的符号,而不能涉及类的任何细节。,类 的 组 合,75,UML简介,UML,语言是一种可视化的的面向对象建模语言。,UML,有三个基本的部分,事物(,Things,),UML,中重要的组成部分,在模型中属于最静态的部分,代表概念上的或物理上的元素,关系(,Relationships,)关系把事物紧密联系在一起,图(,Diagrams,)图是很多有相互相关的事物的组,UML,图形标识,76,UML中有4种类型的事物,结构事物(Structural things),动作事物(Behavioral things),分组事物(Grouping things),注释事物(Annotational things),UML,图形标识,77,UML中的关系,依赖(Dependencies),关联(Association),泛化(generalization),实现(realuzation),UML,图形标识,78,UML中的9种图,类图(,class diagram,),对象图(,class diagram,),用例图(,Use case diagram,),顺序图(,Sequence diagram,),协作图(,Collaboration diagram,),状态图(,Statechart diagram,),活动图(,Activity diagram,),组件图(,Compomnent diagram,),实施图(,Deployment diagram,),UML,图形标识,79,类图,举例:,Clock,类的完整表示,Clock,类的简洁表示,Clock,-Hour:int,-Minute:int,-Second:int,+ShowTime():void,+SetTime(NewH:int=0,NewM:int=0,NewS:int=0):void,Clock,UML,图形标识,80,对象图,myClock:Clock,-Hour:int,-Minute:int,-Second:int,myClock:Clock,UML,图形标识,81,类与对象关系的图形标识,依赖关系,图中的“类,A”,是源,“类,B”,是目标,表示“类,A”,使用了“类,B”,,或称“类,A”,依赖“类,B”,类,A,类,B,UML,图形标识,82,类与对象关系的图形标识,作用关系,关联,图中的“重数,A”,决定了类,B,的每个对象与类,A,的多少个对象发生作用,同样“重数,B”,决定了类,A,的每个对象与类,B,的多少个对象发生作用。,类,A,重数,A,类,B,重数,B,UML,图形标识,83,类与对象关系的图形标识,包含关系聚集和组合,类,A,类,B,重数,A,重数,B,类,A,类,B,重数,A,重数,B,聚集表示类之间的关系是整体与部分的关系,“包含”、“组成”、“分为,部分”等都是聚集关系。,UML,图形标识,84,类与对象关系的图形标识,继承关系泛化,父类,A,父类,B,子类,1,子类,2,UML,图形标识,85,注释,在,UML,图形上,注释表示为带有褶角的矩形,然后用虚线连接到,UML,的其他元素上,它是一种用于在图中附加文字注释的机制。,注释文字,UML,图形标识,86,
展开阅读全文

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


开通VIP      成为共赢上传

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

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

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

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

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

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

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

客服