cpp04类与对象.PPT

上传人:m**** 文档编号:569359345 上传时间:2024-07-29 格式:PPT 页数:104 大小:1.28MB
返回 下载 相关 举报
cpp04类与对象.PPT_第1页
第1页 / 共104页
cpp04类与对象.PPT_第2页
第2页 / 共104页
cpp04类与对象.PPT_第3页
第3页 / 共104页
cpp04类与对象.PPT_第4页
第4页 / 共104页
cpp04类与对象.PPT_第5页
第5页 / 共104页
点击查看更多>>
资源描述

《cpp04类与对象.PPT》由会员分享,可在线阅读,更多相关《cpp04类与对象.PPT(104页珍藏版)》请在金锄头文库上搜索。

1、计算机学院 计算机网络与信息安全研究室 张荣博 Shenyang Aerospace University第四章第四章 类与对象类与对象4.1面向对象程序设计的基本特点面向对象程序设计的基本特点4.2类和对象类和对象()4.3构造函数和析构函数构造函数和析构函数()4.4类的组合类的组合()1Shenyang Aerospace University回顾:面向过程的设计方法重点:l如何实现细节过程,将数据与函数分开。形式:l主模块+若干个子模块(main( )+子函数)。特点:l自顶向下,逐步求精功能分解。缺点:l效率低,程序的可重用性差。2Shenyang Aerospace Univers

2、ity面向对象的方法目的:l实现软件设计的产业化。观点:l自然界是由实体(对象)所组成。程序设计方法:l使用面向对象的观点来描述模仿并处理现实问题。要求:l高度概括、分类、和抽象。3Shenyang Aerospace University抽象先注意问题的本质及描述,其次是实现过程或细节。先注意问题的本质及描述,其次是实现过程或细节。l数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。l行为抽象:描述某类对象的共有的行为特征或具有的功能。抽象的实现:通过类的声明抽象的实现:通过类的声明抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。4Shenyang Ae

3、rospace University抽象实例钟表数据抽象:int Hourint Minute int Second行为抽象:SetTime( )ShowTime( )5Shenyang Aerospace University自行车抽象抽象6Shenyang Aerospace University人事档案属性:姓名、身份证号、工作经历等。处理:分类、检索、修改、插入记录、删除记录等数据结构中的“图”属性:数据数组,有向图或无向图。处理:遍历;求两点之间的最短路径;求关键路径等7Shenyang Aerospace University抽象实例人数据抽象:数据抽象:char *name, c

4、har *sex, int age, int id行为抽象:行为抽象:生物属性角度:生物属性角度:GetCloth( ), Eat( ), Step( ),社会属性角度:社会属性角度:Work( ), Promote( ) ,注意注意:同一问题可能有不同的抽象结果同一问题可能有不同的抽象结果根据解决问题的要求不根据解决问题的要求不同,产生的抽象成员可能不同。同,产生的抽象成员可能不同。8Shenyang Aerospace University简单的图书馆管理系统简单的图书馆管理系统系统功能需求系统功能需求l借阅者可以通过网络查询书籍信息和预订书籍借阅者可以通过网络查询书籍信息和预订书籍l借阅

5、者能够借阅和还书借阅者能够借阅和还书l图书管理员能够处理借阅者的借阅和还书请求图书管理员能够处理借阅者的借阅和还书请求l系统管理员可以对系统的数据进行维护,如增加、删系统管理员可以对系统的数据进行维护,如增加、删除、更改书目,增加、删除和更新借阅者帐户,增加除、更改书目,增加、删除和更新借阅者帐户,增加和删除书籍。和删除书籍。 9Shenyang Aerospace University读者(借阅者)l登录系统l查询自己的借阅信息l查询书籍信息l预订书籍l借阅书籍l归还书籍图书管理员l处理书籍借阅l处理书籍归还l删除预订信息系统维护者l查询读者信息l查询书籍信息l增加数目l删除或更新数目l增加

6、书籍l删除书籍l添加读者帐号l删除或更新读者帐号10Shenyang Aerospace University读者属性:借阅者帐号、姓名、班级、系别、所属性:借阅者帐号、姓名、班级、系别、所借书目等借书目等操作:预订书籍、借书操作:预订书籍、借书 和还书。和还书。图书管理员、系统维护员帐号帐号姓名姓名权限权限11Shenyang Aerospace University其它的类 l记录书目信息的类(Title):包括书籍的名字(BookName)、作者(author)、ISSBN号,此书籍的总数量(totle_number)、借出数量,是否允许借出等属性。l书籍类(Book):书号、操作包括预

7、订(reserve)、按数目查询等。l借阅信息类(loan):包括所借图书的ISBN编号、借阅时间等。l预订信息类(Reservation):每个预订信息的日期、书籍的ISBN、预订用户ID等。12Shenyang Aerospace University封装l目的是曾强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。l实现封装:类声明中的 将抽象出的数据成员、函数成员相结合,将它们视将抽象出的数据成员、函数成员相结合,将它们视为一个整体。为一个整体。几点几点几点几点如何调整如何调整如何调整如何调整13Shenyang Aerospace

8、 University实例: classclass ClockClock publicpublic: :void SetTime(int NewH,int NewM,int NewS );void SetTime(int NewH,int NewM,int NewS );void ShowTime( );void ShowTime( );privateprivate: : int Hour,Minute,Second; int Hour,Minute,Second;边界边界外部接口外部接口特定的访问权限特定的访问权限封装实例钟表类14Shenyang Aerospace University继

9、承与派生是C+中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。实现:声明派生类见第7章15Shenyang Aerospace University多态性多态:同一名称,不同的功能实现方式。目的:达到行为标识统一,减少程序中标识符的个数。实现:重载函数和虚函数见第8章16Shenyang Aerospace Universityc+中的类类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。利用类可以实现数据的封装、隐藏、继承与派生。利用类易于编写大型复杂程序,其模块化程度比C中采用函数更高。17S

10、henyang Aerospace University类的声明形式 类是一种用户自定义类型,声明形式:类是一种用户自定义类型,声明形式:class 类名称类名称 public: 公有成员(外部接口)公有成员(外部接口) private: 私有成员私有成员 protected: 保护型成员保护型成员;18Shenyang Aerospace University类成员的访问控制公有成员在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。class 类名称 public: 公有成员 private: 私有成员 protected: 保护型成员;19She

11、nyang Aerospace University私有成员在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。如果紧跟在类名称的后面声明私有成员,则关键字private可以省略。class 类名称 public: 公有成员 private: 私有成员 protected: 保护型成员;20Shenyang Aerospace University保护类型与private类似,其差别表现在继承与派生时对派生类的影响不同,第七章讲。class 类名称 public: 公有成员 private: 私有成员 protected: 保护型成员;21Shenyang A

12、erospace University类的成员class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime( ); private: int Hour, Minute, Second;成员数据成员数据成员函数成员函数22Shenyang Aerospace University类的成员数据成员与一般的变量声明相同,但需要将它放在类的声与一般的变量声明相同,但需要将它放在类的声明体中。明体中。class Clock public: void SetTime(int H, int M, int S); v

13、oid ShowTime( ); private: int Hour, Minute, Second;23Shenyang Aerospace University类的成员成员函数通常在类中说明原形,在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。允许声明重载函数和带缺省形参值的函数24Shenyang Aerospace Universityclass Clock public: void SetTime(int H, int M, int S); void ShowTime( ); private: int Hour, Minute, Se

14、cond;25Shenyang Aerospace Universityvoid Clock : SetTime(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS;void Clock : ShowTime( ) coutHour:Minute:成员名”方式访问public属性的成员37Shenyang Aerospace University#includeusing namespace std;class Clock ./类的声明略类的声明略/.类的实现略类的实现略int main() Clock myClo

15、ck; myClock . SetTime(8,30,30); myClock . ShowTime();38Shenyang Aerospace University#includeclass Clock public: void SetTime(int H, int M, int S); void ShowTime( );private: int Hour, Minute, Second; ;void clock:SetTime(int H, int M, int S) Hour = H; Minute = m; Second = S; /类中成员互访类中成员互访,直接使用成员名直接使用成

16、员名void main(void) Clock myClock ,*pClock; myClock.SetTime(8,30,30);/使用使用“对象名对象名.成员名成员名”方式访问方式访问 public 属属性的成员性的成员 pClock = &myClock;myClock-ShowTime(); /使用使用“对象指针对象指针-成员名成员名”方式访问方式访问 public 属性的成员属性的成员类中成员的访问举例39Shenyang Aerospace University在成员函数中访问成员与this指针# include Using namespace std;class type pu

17、blic : void set ( int a , int b ) x = a ; y = b; ;/ 类中访问成员不指定对象类中访问成员不指定对象 void print ( ) cout x “,” y endl ; ; private : int x , y ; ;void main ( ) type t1 , t2 ; t1 . set (10 , 20 ) ; t1 . print ( ) ; t2 . set ( 30 , 40 ) ; t2 . print ( ) ;t1 的成员的成员?t2 的成员的成员?40Shenyang Aerospace University C+为成员函

18、数提供了一个隐含参数为成员函数提供了一个隐含参数 this 指针指针 当一个类的对象被创建时,当一个类的对象被创建时,this 指针就被初始化指向该指针就被初始化指向该对象对象 this 是一个隐含指针,不能被显式说明是一个隐含指针,不能被显式说明 this 是一个局部量,局部于某一对象,在任何非静态成是一个局部量,局部于某一对象,在任何非静态成员内可见员内可见 this 是一个常指针,不能被修改和赋值是一个常指针,不能被修改和赋值41Shenyang Aerospace University# include Using namespace std;class type public : v

19、oid set ( int a , int b ) x = a ; y = b; ;/ 类中访问成员不指定对象类中访问成员不指定对象 void print ( ) cout x “,” y x = a ; this-y = b;this -x = a ; this-y = b; 即:即:即:即: t1.x = a ; t1. y = b ;t1.x = a ; t1. y = b ;42Shenyang Aerospace University# include Using namespace std;class type public : void set ( int a , int b )

20、 x = a ; y = b; ;/ 类中访问成员不指定对象类中访问成员不指定对象 void print ( ) cout x “,” y x = a ; this-y = b;this -x = a ; this-y = b; 即:即:即:即: t2.x = a ; t2. y = b ;t2.x = a ; t2. y = b ;t2 . set ( 30 , 40 ) ;t2 . set ( 30 , 40 ) ;43Shenyang Aerospace University所以,所以,this this 可以在成员中显式使用:可以在成员中显式使用: void set ( int a ,

21、 int b ) this - x = a ; this - y = b ; ; void print ( ) cout x “ , ” y endl ; ; 44Shenyang Aerospace University构造函数与析构函数构造函数与析构函数45Shenyang Aerospace UniversityC+中对象成员赋值的方法class A private: int x, y; public: int z; void set( int xx, int yy ) x = xx ; y=yy ; ;void main() A a; a . z = 10; a . x = 1; a

22、. y = 2; a . set(1,2); /ok,z为公有成员为公有成员/error,x为私有成员为私有成员/error,x为私有成员为私有成员/okset为公有成员。为公有成员。46Shenyang Aerospace University普通变量的初始化:普通变量的初始化:float pi = 3.1415;int a3 = 1, 2, 3 ;struct Saving int No; float Money;Saving A=1,20;Saving B=2,23.5类对象是否也能像普通变量一样类对象是否也能像普通变量一样赋值呢?例如:赋值呢?例如:class Point float

23、x; float y; 可以通过下面的形式初始化:可以通过下面的形式初始化:Point A=1,20;或或 Point B=(1,2);由于类具有封装性,不能对私有变量直接进行赋值!由于类具有封装性,不能对私有变量直接进行赋值!构造函数构造函数 是在对象创建时使用特定的值构造对象,或者说是是在对象创建时使用特定的值构造对象,或者说是将对象将对象初始化初始化为一个特定的状态。为一个特定的状态。class Point public: Point(); int GetX(); int GetY(); private: int X= 0, Y= 0 ; ;47Shenyang Aerospace Un

24、iversity构造函数n 构造函数的作用是在对象被创建时使用特定的值构构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象造对象,或者说将对象初始化初始化为一个特定的状态。为一个特定的状态。n 在对象创建时在对象创建时由系统自动调用由系统自动调用。n 如果程序中未声明,则系统自动产生出一个如果程序中未声明,则系统自动产生出一个默认形默认形式式的构造函数。的构造函数。n 允许为允许为内联内联函数、函数、重载重载函数、函数、带默认形参值带默认形参值的函数。的函数。48Shenyang Aerospace University说明构造函数名与类名相同。构造函数名与类名相同。一个类可以拥

25、有多个构造函数(重载)。一个类可以拥有多个构造函数(重载)。构造函数构造函数可以有任意类型的参数可以有任意类型的参数,但,但不能具有不能具有返回类型返回类型。49Shenyang Aerospace Universityclass Clockclass Clock public:public:Clock();/Clock();/构造函数构造函数void SetTime(int NewH,int NewM,int NewS);void SetTime(int NewH,int NewM,int NewS);void ShowTime();void ShowTime();private:priva

26、te:int Hour,Minute,Second;int Hour,Minute,Second;50Shenyang Aerospace University构造函数的实现:构造函数的实现:Clock:ClockClock:Clock() ) Hour= 0;Hour= 0;Minute= 0;Minute= 0;Second= 0;Second= 0; 建立对象时构造函数的作用:建立对象时构造函数的作用:int main()int main() Clock c;Clock c; /隐含调用构造函数,将初始值作为实参。隐含调用构造函数,将初始值作为实参。 c.ShowTime();c.Sho

27、wTime(); 51Shenyang Aerospace University#includeusing namespace std;class Point public: Point(int xx, int yy);/ 带参数的带参数的构造函数构造函数 int GetX(); int GetY(); private: int X, Y;Point:Point(int xx, int yy) / 初始化数据成员初始化数据成员 X=xx; Y=yy; coutConstructor called.endl; Point:Point() coutDestructor called.endl; i

28、nt Point:GetX() return X; int Point:GetY() return Y; void main() Point A(10,20); / 构造函数被调用构造函数被调用 coutA.GetX(),A.GetY()endl; / 析构函数被调用析构函数被调用带参数的构造函数52Shenyang Aerospace University/exp#includeclass Point public: Point(int xx, int yy);Point(int xx, int yy);/ 构造函数 Point();/ 析构函数 int GetX(); int GetY()

29、; private: int X, Y;Point:Point(int xx, int yy) X=xx; Y=yy; coutConstructor called.endl; Point:Point() coutDestructor called.endl; int Point:GetX() return X; int Point:GetY() return Y; void main() Point A(10,20)Point A(10,20);/ 构造函数被调用 coutA.GetX(),A.GetY()endl;/ 析构函数被调用注意:注意: 构造函数的参数个数和类型规定了声明一个对象时

30、,为构造函数的参数个数和类型规定了声明一个对象时,为对这个对象进行初始化所需要的初始值的个数和类型。对这个对象进行初始化所需要的初始值的个数和类型。例如:例如: Point A (100, 200) ;/ OKPoint B (10) ;/ errorPoint A ;/ error 若有多个重载构造函数,系统自动寻找匹配若有多个重载构造函数,系统自动寻找匹配53Shenyang Aerospace University重载构造函数 p 与一般函数一样,与一般函数一样,C+C+允许重载构造函数。允许重载构造函数。p 若类若类 X X 具有一个或多个构造函数,创建具有一个或多个构造函数,创建类类

31、 X X 的对象时,的对象时,C+C+会根据参数选择调用会根据参数选择调用其中一个。其中一个。54Shenyang Aerospace University/ 不同构造函数的匹配不同构造函数的匹配class Date public: Date(); Date(int d); Date(int m, int d); Date(int m, int d, int y); void print(); protected: int month; int day; int year;void Date:print() cout month / day / year endl ; 55Shenyang A

32、erospace UniversityDate : Date() month = 10 ; day = 1; year = 2000 ; print(); Date : Date ( int d ) month = 10 ; day = d ; year = 2000 ; print();Date : Date ( int m, int d ) month = m ; day = d; year = 2000 ; print();Date : Date ( int m, int d, int y ) month=m; day=d; year=y; print();void main ( ) D

33、ate aday ; Date bday ( 5 ) ; Date cday ( 2, 12 ) ; Date dday ( 1, 2, 1998 ) ; 10/1/2000 10/ 5/2000 2/12/2000 1/2/1998 56Shenyang Aerospace University默认参数的构造函数n在构造函数中允许指定函数参数的默认值,这在构造函数中允许指定函数参数的默认值,这些默认值在函数调用者不确定参数时可以作为些默认值在函数调用者不确定参数时可以作为参数来使用。参数来使用。n对于所有参数都定义了默认值的构造函数,当对于所有参数都定义了默认值的构造函数,当它被调用时,允许

34、改变传递参数的个数。它被调用时,允许改变传递参数的个数。如下如下例:例:57Shenyang Aerospace University #include using namespace std; class Point private: int x,y; public:Point(int vx=0,int vy=0 ); /声明缺省参数的构造函数声明缺省参数的构造函数 void print() coutx= x; y= yendl; ; 58Shenyang Aerospace UniversityPoint:Point(int vx,int vy) x=vx ; y=vy; /用传递来的参数

35、对私有变量用传递来的参数对私有变量x,y赋初值赋初值 coutConstruct is called!endl;void main() Point p1(10,10);/传两参数传两参数 p1.print(); Point p2; /不传参数取缺省值不传参数取缺省值 p2.print(); Point p3(5); /传一个参数,第二个用缺省值传一个参数,第二个用缺省值 p3.print(); Construct is called!x= 10; y= 10Construct is called!x= 0; y= 0Construct is called!x= 5; y= 0 50对象对象p3

36、1010对象对象p100对象对象p259Shenyang Aerospace University#includeusing namespace std;class Pointprivate: int x,y;public: Point(); /声明无参数的构造函声明无参数的构造函数数 /声明带声明带2个参数的构造函数个参数的构造函数 Point(int vx=2,int vy=2 ); void print() coutx= x ; y= yendl; ;Point:Point() x=0;y=0; coutConstruct0 is called! “ endl;Point:Point(i

37、nt vx,int vy) /用传递来的参数对私有变量用传递来的参数对私有变量x,y赋初值赋初值 x=vx ; y=vy; coutConstruct2 is called!“ endl;void main() Point p; p.print();重载与默认参数引起的二义性60Shenyang Aerospace University 对象对象p在定义过程中,没有传递参数,此时有两在定义过程中,没有传递参数,此时有两种可能:第一是在创建对象时调用不带参数的构种可能:第一是在创建对象时调用不带参数的构造函数造函数Point()来对对象初始化;另一种是在创建来对对象初始化;另一种是在创建对象时调

38、用带缺省参数的构造函数对象时调用带缺省参数的构造函数Point(int vx=2,int vy=2)来初始化对象。来初始化对象。这两种情况的存在这两种情况的存在使系统无法确定到底调用哪个构造函数,这就出使系统无法确定到底调用哪个构造函数,这就出现了二义性。编译将不能通过。现了二义性。编译将不能通过。61Shenyang Aerospace University拷贝构造函数拷贝初始化构造函数是一种特殊的成员函数。拷贝初始化构造函数是一种特殊的成员函数。功能:用一个已知的对象来初始化一个被创建的同类功能:用一个已知的对象来初始化一个被创建的同类的对象。拷贝初始化构造函数实际上也是构造函数。的对象。

39、拷贝初始化构造函数实际上也是构造函数。特点:特点: 1 1、函数名与类同名,该函数没有返回类型;、函数名与类同名,该函数没有返回类型; 2 2、函数只有一个参数,且是对类对象的引用;、函数只有一个参数,且是对类对象的引用; 3 3、每个类都必须有一个拷贝构造函数。、每个类都必须有一个拷贝构造函数。n如果类中没有说明拷贝构造函数,则编译系统自动生如果类中没有说明拷贝构造函数,则编译系统自动生成一个缺省拷贝构造函数。作为该类的公有成员。成一个缺省拷贝构造函数。作为该类的公有成员。62Shenyang Aerospace Universityq格式:格式: class 类名 public : 类名(

40、形参);/构造函数 类名(类名 &对象名);/拷贝构造函数 .;类名:类(类名 &对象名)/拷贝构造函数的实现 函数体 63Shenyang Aerospace University#includeusing namespace std;class Pointprivate: int x,y;public:Point(int vx,int vy)x=vx ; y=vy; Point(const Point & p) x = p.x; y = p.y; Point() ;void main() Point p1(10,20); Point p2(p1);1020对象对象p11020对象对象p2调

41、用拷贝构造函数调用拷贝构造函数调用拷贝构造函数调用拷贝构造函数64Shenyang Aerospace University调用拷贝构造函数的时机-1当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。int main()int main() Point A(1,2); Point A(1,2); Point B(A); / Point B(A); /拷贝构造函数被调用拷贝构造函数被调用 Point C=APoint C=A; /拷贝构造函数被调用拷贝构造函数被调用 coutB.GetX()endl;coutB.GetX()endl; 65Shenyang Aero

42、space University调用拷贝构造函数的时机-2若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。void fun1(Point p)void fun1(Point p) coutp.GetX()endl; coutp.GetX()endl; int main()int main() Point A(1,2); Point A(1,2); fun1(A); / fun1(A); /调用拷贝构造函数调用拷贝构造函数 66Shenyang Aerospace University调用拷贝构造函数的时机-3当函数的返回值是类对象时,系统自动调用拷贝构造函数。Poi

43、nt fun2()Point fun2() Point A(1,2); Point A(1,2); return A; / return A; /调用拷贝构造函数调用拷贝构造函数 int main()int main() Point B; Point B; B=fun2(); B=fun2(); 67Shenyang Aerospace University默认的拷贝构造函数q如果程序员没有为类声明拷贝初始化构造函数,如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个默认的拷贝构造函数。则编译器自己生成一个默认的拷贝构造函数。q这个构造函数执行的功能是:用作为初始值的这个构造函数执

44、行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。的对应数据成员。68Shenyang Aerospace University析构函数 析构函数析构函数析构函数析构函数 是用于释放对象所占空间的成员函数。是用于释放对象所占空间的成员函数。是用于释放对象所占空间的成员函数。是用于释放对象所占空间的成员函数。 当一个对象作用域结束时,系统自动调用析构函数。当一个对象作用域结束时,系统自动调用析构函数。当一个对象作用域结束时,系统自动调用析构函数。当一个对象作用域结束时,系统自动调用析构函数。 没有用户定义析构函数时,

45、系统提供缺省版本的析没有用户定义析构函数时,系统提供缺省版本的析没有用户定义析构函数时,系统提供缺省版本的析没有用户定义析构函数时,系统提供缺省版本的析构函数。构函数。构函数。构函数。 析构函数名为:析构函数名为:析构函数名为:析构函数名为: 类名类名类名类名 析构函数没有参数,也没有返回类型析构函数没有参数,也没有返回类型析构函数没有参数,也没有返回类型析构函数没有参数,也没有返回类型69Shenyang Aerospace University#includeusing namespace std;class Pointprivate: int x,y;public: Point();/构

46、造函数声明构造函数声明Point();/析构函数声明析构函数声明void print()coutx= x;y= yendl;Point:Point() /构造函数定义构造函数定义 x=0;y=1;coutConstruct is called!endl;Point:Point() /析构函数定义析构函数定义 coutDestruct is called! endl;void fun()cout对象对象p1:;Point p1; p1.print();void main() fun();cout对象对象p2:;Point p2;p2.print(); 01对象对象p101对象对象p2对象对象p1

47、:Construct is called!x= 0; y= 1Destruct is called!对象对象p2:Construct is called!x= 0; y= 1Destruct is called!70Shenyang Aerospace University组合的概念 描述的是一个类内嵌其他类的对象作为成员的情况,描述的是一个类内嵌其他类的对象作为成员的情况,它们之间的关系是一种包含与被包含的关系,常被称它们之间的关系是一种包含与被包含的关系,常被称作组合关系作组合关系计算机系统软件系统硬件系统应用软件系统软件cpu存储器输入输出设备71Shenyang Aerospace U

48、niversityclass Pointint x;int y;public:Point();Point();void print();class CirclePoint centre;double radius;public:Circle(double);Circle();void print();C+中组合关系的表示72Shenyang Aerospace University类组合的构造函数设计当创建类的对象时,如果这个类具有内嵌对象当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌对象将首先被自动创建。成员,那么各个内嵌对象将首先被自动创建。在创建对象时,既要对本类的数据成员进

49、行初在创建对象时,既要对本类的数据成员进行初始化,又要对内嵌对象成员进行初始化。始化,又要对内嵌对象成员进行初始化。73Shenyang Aerospace University#includeusing namespace std;class Pointint x;int y;public:Point() x=10; y=12; cout构造点构造点:10-12; ; Point() cout析构点析构点:x-yendl; void print() cout坐标坐标:x-yendl;内嵌对象被自动创建的过程74Shenyang Aerospace Universityclass Circle

50、 Point centre; double radius;public: Circle(double vr)coutn构造圆构造圆:构造半径构造半径vrn;radius=vr; Circle() cout析构圆析构圆:析构半径析构半径 radiusn; void print ()centre.print();cout半径半径=radiusendl;void main() Circle c(4.3); c.print();1020对象对象c类成员类成员4.3构造点构造点:10-12;:10-12;构造圆构造圆: :构造半径构造半径 4.34.3坐标坐标:10-12:10-12半径半径=4.3=4

51、.3析构圆析构圆: :析构半径析构半径 4.34.3析构点析构点:10-12:10-1275Shenyang Aerospace University在创建对象时,既要对本类的数据成员进行在创建对象时,既要对本类的数据成员进行初始化,又要对内嵌对象成员进行初始化。初始化,又要对内嵌对象成员进行初始化。class CirclePoint centre;double radius;public:Circle(int,int,double);Circle();void print();class Pointint x;int y;public:Point(int ,int );Point();voi

52、d print();76Shenyang Aerospace Universityclass CirclePoint centre; double radius;public:Circle(int,int,double);Circle()cout析构圆析构圆:析构半径析构半径 radiusn;void print();Circle:Circle(int vvx,int vvy,double vr) : centre(vvx,vvy)coutn构造圆构造圆:构造半径构造半径 vr; ;radius=vr;void Circle:print()centre.print();cout半径半径=rad

53、iusendl;void main()Circle c(2,2,4.3); c.print();22对象对象c类成员类成员4.3构造点构造点:2-2;:2-2;构造圆构造圆: :构造半径构造半径 4.3; 4.3; 坐标坐标:2-2:2-2半径半径=4.3=4.3析构圆析构圆: :析构半径析构半径 4.34.3析构点析构点:2-2:2-2内嵌对象的初始化77Shenyang Aerospace Universityq冒号语法初始化常量成员和引用数据成员冒号语法初始化常量成员和引用数据成员class Expe public: Expe (int& i) : ten(10) , refI(i) p

54、rotected:const int ten;int& refI;冒号语法应用扩展78Shenyang Aerospace University构造函数调用顺序:构造函数调用顺序:l先先调用内嵌对象的构造函数(按内嵌时的声明顺序,调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造)。先声明者先构造)。l然后然后调用本类的构造函数。调用本类的构造函数。析构函数的调用顺序相反析构函数的调用顺序相反对象构造与析构的顺序79Shenyang Aerospace Universityclass Window public:Window() cout “Window 对象被创建对象被创建”;Win

55、dow() cout “Window 对象被析构对象被析构”; ;class Door public:Door() cout “ Door 对象被创建对象被创建”; Door()cout “Door 对象被析构对象被析构”; ;对象构造与析构的顺序举例80Shenyang Aerospace UniversityclassHouseWindowswindows;Doordoor;public:House()()cout“House对象被创建对象被创建”;House()()coutyabbaDabbaDo(); ; class Fred public: void yabbaDabbaDo();

56、private: Barney* y; ; /错误:错误:FredFred类的对象在定义之前被使用类的对象在定义之前被使用/正确,经过前向引用声明,可以声明正确,经过前向引用声明,可以声明Fred类的对象指针类的对象指针85Shenyang Aerospace University类的应用举例 一圆形游泳池如图所示,现在需在其周围建一圆形过道,一圆形游泳池如图所示,现在需在其周围建一圆形过道,并在其四周围上栅栏。栅栏价格为并在其四周围上栅栏。栅栏价格为3535元元/ /米,过道造价米,过道造价为为2020元元/ /平方米。过道宽度为平方米。过道宽度为3 3米,游泳池半径由键盘输米,游泳池半径由

57、键盘输入。要求编程计算并输出过道和栅栏的造价。入。要求编程计算并输出过道和栅栏的造价。游泳池过道86Shenyang Aerospace University/声明类声明类Circle 及其数据和方法及其数据和方法const float PI = 3.14159;class Circle private: float radius; public: void SetRadius ( float r ); float Circumference( ) const; /圆周长圆周长 float Area( ) const; /圆面积圆面积;圆类的设计 87Shenyang Aerospace Un

58、iversity/ 类的实现类的实现/ 构造函数初始化数据成员构造函数初始化数据成员radiusvoid Circle:SetRadius(float r) radius=r;/ 计算圆的周长计算圆的周长float Circle:Circumference( ) const return 2 * PI * radius; / 计算圆的面积计算圆的面积 float Circle:Area( ) const return PI * radius * radius;圆类的实现 88Shenyang Aerospace University/ 计算栅栏造价并输出计算栅栏造价并输出 cost = Poo

59、lRim.Circumference( ) * 35; / 计算过道造价并输出计算过道造价并输出 cost = (PoolRim.Area( ) - Pool.Area( ))*20; Circle Pool, PoolRim;如何应用设计的类? 游泳池过道89Shenyang Aerospace University#include const float FencePrice = 35; /栅栏造价栅栏造价const float ConPrice = 20; /过道造价过道造价void main ( ) float radius; /半径半径 cout radius; Circle Poo

60、l, PoolRim; Pool . SetRadius (radius); PoolRim . SetRadius (radius + 3); 90Shenyang Aerospace University/ 计算栅栏造价并输出计算栅栏造价并输出 float FenceCost, /栅栏费用栅栏费用 FenceCost = PoolRim.Circumference( ) * FencePrice; cout Fencing Cost is ¥ FenceCost endl; / 计算过道造价并输出计算过道造价并输出float ConCost; /过道费用过道费用 ConcreteCost

61、= (PoolRim.Area( ) - Pool.Area( ))*ConPrice; cout Concrete Cost is ¥ ConcreteCost 0)mod = src % r;src /= r; s.Push(mod);98Shenyang Aerospace University2 68 余 数 2 34 0 低位 2 17 0 2 8 1 2 4 0 2 2 0 2 1 0 0 1 高位所以 681010001002cout “结果:”;while( !s.IsEmpty()mod = s.Pop();coutmod;cout endl;/从堆栈中把结果取出,并显示在屏

62、幕中。99Shenyang Aerospace Universityint main()Stack s(20);int src = 0, r=2,mod=0;cout 请输入要转换的整数! src;cout 请输入转换后的进制 r;while(src 0)mod = src % r;src /= r; s.Push(mod);cout 结果:;while( !s.IsEmpty()mod = s.Pop();coutmod;cout endl;return 0; 100Shenyang Aerospace University类的设计-队列定义定义定义定义l l队列是只允许在一端删除,在另一端

63、插入的顺队列是只允许在一端删除,在另一端插入的顺队列是只允许在一端删除,在另一端插入的顺队列是只允许在一端删除,在另一端插入的顺序表序表序表序表l l允许删除的一端叫做允许删除的一端叫做允许删除的一端叫做允许删除的一端叫做队头队头队头队头( (frontfront) ),允许插入的,允许插入的,允许插入的,允许插入的一端叫做一端叫做一端叫做一端叫做队尾队尾队尾队尾( (rearrear) )。特性特性特性特性l l先进先出先进先出先进先出先进先出( (FIFOFIFO, , First In First OutFirst In First Out) )101Shenyang Aerospace University102Shenyang Aerospace University本节作业本节作业P123-4.10103

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号