类和对象00002.ppt

上传人:本田雅阁 文档编号:2600418 上传时间:2019-04-15 格式:PPT 页数:92 大小:413.51KB
返回 下载 相关 举报
类和对象00002.ppt_第1页
第1页 / 共92页
类和对象00002.ppt_第2页
第2页 / 共92页
类和对象00002.ppt_第3页
第3页 / 共92页
亲,该文档总共92页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《类和对象00002.ppt》由会员分享,可在线阅读,更多相关《类和对象00002.ppt(92页珍藏版)》请在三一文库上搜索。

1、Visual C+与面向对象程序设计教程,第 2章 类和对象 衡阳师范学院计算机系,教学目标,介绍面向对象程序设计方法的基本原理及主要特点抽象、封装、继承和多态。 讲解类和对象的概念以及如何利用类来解决具体问题。 类( I )has关系,学习要求,掌握面向对象的程序设计思想 掌握类的定义。 掌握对象的声明和引用。 掌握具有不同访问属性的成员的访问方式 观察构造函数和析构函数的执行过程。,授课内容,2.1 面向对象的思想 2.2 面向对象程序设计的特点 2.3 类与对象 2.4 构造函数与析构函数 2.5 数据成员的初始化 2.6 对象与指针 调试技术 程序设计举例,回顾:面向过程的设计方法,基

2、本思想: 自顶向下,逐步求精的设计方法和单入口单出口的控制结构。 特点: 如何实现问题的细节化功能分解,最终由顺序结构、选择结构和循环结构来描述。 形式: 主模块+若干个子模块(main( )+子函数)。 缺点: 效率低,程序的可重用性差(数据与操作分开)。,面向过程的思想,面向对象的方法,目的: 实现软件设计的产业化。 观点: 自然界是由实体(对象)所组成。 程序设计方法: 使用面向对象的观点来描述模仿并处理现实问题。 要求: 高度概括、分类、和抽象。,面向对象的思想,2.1 面向对象的思想,面向过程的程序设计(Structure Programming) 以功能为中心,采用函数来描述(动词

3、) 面向对象程序设计(OOP) 面向对象程序设计方法认为,客观世界是由各种各样的实体组成的,这些实体就是面向对象方法中的对象。 消息是向某对象请求服务的一种表达方式 对象之间的交互通过发送消息来实现。 消息包括:目标对象 ,请求的方法 ,参数,2.2 面向对象程序设计的特点,四个基本特征: 抽象(类)(数据抽象+代码抽象 ) 封装(过程和数据封藏起来) 继承(基类和派生类) 多态性(虚函数、函数重载),一、抽象,抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。 先注意问题的本质及描述,其次是解决问题的具体过程或细节。 一个问题的抽象包括现两方面: 数据抽象:描述某类

4、对象的属性或状态(对象相互区别的物理量)。 代码抽象:描述某类对象的共有的行为特征或具有的功能。 抽象的实现:通过类的声明。,OOP的基本特点,抽象实例钟表,分析: 时钟需要三个整数用来分别存储时、分和秒(时钟的属性)。 时钟要具有显示时间,设置时间的功能(行为特征) 数据抽象: int Hour, int Minute, int Second; 代码抽象: SetTime( ), ShowTime( );,OOP的基本特点,抽象实例钟表类,类的声明: class Clock public: void Set Time (int NewH, int NewM, int NewS); void

5、ShowTime( ); private: int Hour, Minute, Second; ;,OOP的基本特点,抽象实例人,数据抽象: char *name,char *sex,int age,int id 代码抽象: 生物属性角度: GetCloth( ), Eat( ), Step( ), 社会属性角度: Work( ), study( ) ,OOP的基本特点,二、封装,将抽象出的数据成员、代码成员相结合,将它们视为一个整体。 目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。 实现封装:类声明中的 ,OOP的基本特点,

6、二、封装,实例: class Clock public: void SetTime(int NewH,int NewM, int NewS); void ShowTime( ); private: int Hour,Minute,Second; ;,特定的访问权限,OOP的基本特点,三、继承与派生,是C+中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。 实现:声明派生类,OOP的基本特点,四、多态性,多态:指允许不同类的对象对同一消息作出响应。同一名称,不同的功能实现方式。 目的:达到行为标识统一,减少程序中标识符的个数。 实现:重载函数和虚函数,OOP的基本特

7、点,OOP的优点,开发时间短,效率高,可靠性高,所开发的程序更强壮 重用,共享,可维护性,精简 适合于大程序长时间的开发工作,2.3 类与对象,类的声明 类的定义 成员函数的定义 数据成员的定义 对象的引用 对象作函数的参数 对象作函数的返回值,01.为什么要引入类,工资单:姓名、单位、编号. 成绩单:姓名、学号、各科成绩. 简单数据单元无法将这样记录作为一个数据单位处理 一一对应关系,02. 以工资单为例,03. 类的层次关系,工作部门:字符串 姓名:字符串 职务:代码(099)int 工作时间: 年(xxxx): int 月(112): char 日(131): char 家庭情况 婚否:

8、(0,1) int 是否是双职工:int,基本工资: double 岗位津贴: double 劳保福利: double 独生子女: double 房租: double 电费: double 水费: double 取暖费: double 保育费: double 实发工资: double,类(Class)-数据类型,类是具有相同属性和相同的方法的对象的集合,它是一种既包含数据又包含函数的抽象数据类型。 类是将一类对象和其他对象区别开来的一组描述。 类是对象集合的抽象,对象是类的一个实例。 类的种类 用struct关键字声明的类 用union关键字声明的类 用class关键字声明的类,类的定义,1数

9、据成员(Data Member),即类的属性; 2成员函数(Member Function),即类的方法; 3构造函数(constructor)和析构函数(destructor),这将在2.4节介绍; 4运算符函数,在以后介绍。,对象(Object)-数据,对象是包含现实世界物体特征的抽象实体,反映了系统为之保存信息和(或)与之交互的能力。 对象=数据+作用于这些数据上的操作 =属性(Attribute)+方法(Method),消息(Message) -函数调用,消息是向某对象请求服务的一种表达方式。 对象之间通过传递消息来实现相互的通信。,1. 类的定义,class private: /私有

10、成员 ; public: /公有成员 ; protected: /保护成员 ; ;,分析:编写简单的人事系统(子程序),人,工作部门,姓名,出生日期,职务,工资,基本工资,岗位津贴,分析:编写简单的人事系统(主程序),实例: 张三 李四 王五,例2-1 定义一个Person类,用来说明人员类对象,/ Example 2-1:定义Person类 class Person private: char m_strName20; int m_nAge; int m_nSex; public: void Register(char *name, int age, char sex); char * Ge

11、tName(); int GetAge(); char GetSex(); void ShowMe(); ;,2. 成员函数的定义,成员函数的一般形式: : () ,例2-2 编写Person类成员函数的定义。,/ Example 2-2:Person类成员函数的定义 void Person: Register(char *name, int age, char sex) strcpy(m_strName, name); m_nAge = age; m_nSex = (sex = m?0:1); char *Person: GetName() return m_strName; int Per

12、son: GetAge() return m_nAge; char Person: GetSex() return (m_nSex = 0?m:f); void Person: ShowMe() cout GetName() t GetAge() t GetSex() endl; ,3. 对象的引用,类的对象是该类的 某一特定实体,即类类型的变量。 说明对象的一般形式(类的实例化,同一般变量的定义): , , 对类成员的访问 . 运算符 - 运算符 类中成员互访:直接使用成员名 类外访问:使用“对象名.成员名”方式访问 public 属性的成员,Person对象的引用,成员函数访问同类中的数据

13、成员 (公有和私有) 在对象外访问其数据成员或成员函数需使用运算符“”访问对象的成员 禁止直接访问一个对象中的私有成员 同类对象之间可以整体赋值 对象用作函数的参数时属于赋值调用;函数可以返回一个对象。 例如:Person person1,person2; int nage=person1.GetAge();person1=person2; Person *p; p=new Person; nage=p-GetAge();,例2-3 完整的人事资料输入输出程序。,/ Example 2-3:人事资料的输入和输出 void main() char name20, sex; int age; Pe

14、rson person1, person2; cout name age sex; person1.Register(name, age, sex); cout “person1: t“; person1.ShowMe(); person1.Register(“Zhang3“, 19, m); cout “person1: t“; person1.ShowMe(); person2 = person1; /对象之间的赋值 cout “person2: t“; person2.ShowMe(); ,内联成员函数,class Person private: char m_strName20; in

15、t m_nAge; int m_nSex; public: void Register(char *name, int age, char sex) strcpy(m_strName,name); m_nAge = age; m_nSex = (sex = = m?0:1); char * GetName() return m_strName; int GetAge() return m_nAge; char GetSex() return (m_nSex = = 0?m:f); ;,关于类成员的几点说明,一、成员函数 1、在类中说明原形,在类外给出函数体实现,并在函数名前使用类名加以限定。

16、成员函数定义形式: 返回值类型 类名:函数成员名(参数表) 函数体 ,关于类成员的几点说明,2、允许声明成重载函数和带缺省形参值的函数 void Clock : SetTime(int NewH=0, int NewM=0, int NewS=0) Hour=NewH; Minute=NewM; Second=NewS; ,关于类成员的几点说明,3、允许声明为内联函数 1)在类中直接定义成内联函数 class Clock public: void Set Time (int NewH, int NewM, int NewS); void ShowTime( ); coutHour“:“Minu

17、te“:“Second; private: int Hour, Minute, Second; ;,关于类成员的几点说明,2)在类外定义函数时使用inline关键字 inline void Clock : SetTime(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS; ,关于类成员的几点说明,二、成员数据 与一般的变量声明相同,但需要将它放在类的声明体中。 例: private: int Hour, Minute, Second;,关于类成员的几点说明,三、类成员的访问控制 1、公有类型成员 在关键字publ

18、ic后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。 2、私有类型成员 在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。 3、保护类型成员 与private类似,其差别表现在继承与派生时对派生类的影响不同,以后讲,2.4 构造函数与析构函数,类与对象 简单数据类型与变量 一般与特殊 每个对象区别于其他对象有两个方面: 对象的标识符 对象自身的属性(数据成员的值) 在声明对象的时候进行的数据成员设置,称为对象的初始化。 构造函数(Constructor)定义了创建对象的方法,提供了初始化对象的一种简便手段。 与构造函数相对应,析构函

19、数(Destructor)用于撤消一个对象。,构造函数,构造函数的作用:在对象被创建时使用特定的值构造对象,将对象初始化为一个特定的状态,使此对象具有区别于彼对象的特征。 构造函数完成的是一个从一般到具体的过程,它在对象被创建时由系统自动调用。 构造函数也是类的一个成员函数,具有一般成员函数的特征(允许为内联函数、重载函数、带缺省形参值的函数)和自身的特性(构造函数名与类名相同,而且没有返回值) 如果程序中未声明,则系统自动产生出一个缺省形式的构造函数,此函数不做任何事。,构造函数(Constructor),格式: (); 注意事项: 构造函数必须与类名相同 构造函数没有返回值 其功能是对对象

20、进行初始化,一般由一系列赋值语句构成 由系统自动调用,构造函数举例,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; ;,构造函数的实现: Clock:Clock(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS; 建立对象时构造函数的作用: voi

21、d main( ) Clock c (0,0,0); /隐含调用构造函数,将初始值作为实参 c.ShowTime( ); ,拷贝构造函数,生成一个对象的副本有两种途径: 建立一个新对象,将已有对象的数据成员的值一一赋给新对象。 拷贝构造函数,构造函数和析构函数,拷贝构造函数是一种特殊的构造函数: 1、其形参为本类的对象引用。 2、其作用是使用一个已存在的对象去初始化一个新的同类对象。,拷贝构造函数,拷贝构造函数的定义形式: class 类名 public : 类名(形参); /构造函数 类名(类名 &对象名);/拷贝构造函数 . ; 类名: 类名(类名 &对象名)/拷贝构造函数的实现 函数体

22、,构造函数和析构函数,拷贝构造函数举例,class Point public: Point (int xx=0,int yy=0) X=xx; Y=yy; /内联构造函数 Point (Point ,构造函数和析构函数,拷贝构造函数的实现: Point:Point (Point ,拷贝构造函数的调用情况,1、当用类的一个对象去初始化该类的另一个对象时,系统自动调用拷贝构造函数实现拷贝赋值。 void main(void) Point A(1,2); Point B(A); /拷贝构造函数被调用 coutB.GetX( )endl; ,构造函数和析构函数,拷贝构造函数的调用情况,2、若函数的形参

23、为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。例如: void fun1(Point p) coutp.GetX( )endl; void main( ) Point A(1,2); fun1(A); /调用拷贝构造函数 ,构造函数和析构函数,拷贝构造函数的调用情况,3、当函数的返回值是类对象时,函数执行完成返回调用者时,系统自动调用拷贝构造函数。 Point fun2( ) Point A(1,2); return A; /调用拷贝构造函数 void main( ) Point B; B=fun2( ); ,构造函数和析构函数,拷贝构造函数,如果程序员没有为类声明拷贝初始化

24、构造函数,则编译器自己生成一个拷贝构造函数。 这个构造函数执行的功能是:用初始值对象的每个数据成员的值,去初始化将要建立的对象的对应数据成员。,构造函数和析构函数,析构函数(Destructor),格式为: :(); 注意事项: 函数名与类名相同,只是在前边加“”符号 析构函数不得返回任何值 析构函数不得带有任何参数 其功能是释放对象成员所占用的存储,一般由一系列的delete组成 由系统自动调用,例2-4 为类Person增加构造函数和析构函数。,class Person Private: char m_strName20;int m_nAge; int m_nSex; public: pe

25、rson(const char *name, int age, char sex)/构造函数 strcpy(m_strName, name);m_nAge = age; m_nSex = (sex =m?0:1); void Register(char *Name, int Age, char Sex); void GetName(char *Name); int GetAge(); char GetSex(); ;,2.5 数据成员的初始化,1在构造函数的函数体中进行初始化。 2在构造函数的头部初始化。 3混合初始化。 4拷贝构造函数,1. 在构造函数的函数体中初始化,class Perso

26、n char m_strName20; int m_nAge; int m_nSex; public: Person() strcpy(m_strName,”XXX”); m_nAge=0; m_nSex=0; Person(char *name, int age, char sex) strcpy(m_strName, name); m_nAge = age; m_nSex = (sex = m?0:1); 例如, 当遇到声明 Person personl(“Zhang3”, 19, f); Person person2 = Person(“Zhang3”, 19, f);,2.在构造函数的

27、头部初始化。,其格式为: :():(), , () 例如 Person:Person(): m_nAge(0), m_nSex(0) ,3.混合初始化 。,例如 Person:Person(): m_nAge(0), m_nSex(0) strcpy(m_strName, “XXX”); ,4.拷贝构造函数,拷贝构造函数是一种特殊的构造函数 例如 Person( Person ,2.6 对象与指针,指向对象的指针 类名 *指针变量名表; 例: Person person1(“Zhang3”,19,f); Person *ptr= this指针:指向该对象本身的指针,例2.5 使用动态存储实现例

28、2.4程序的功能,Void main() Person *p1,*p2; p1=new Person; coutShowPerson(); p1-Register(“Zhang3”,19,m); coutShowPerson(); p2=new Person; coutShowPerson(); *p2=*p1;/对象之间的赋值 coutShowPerson(); delete p1; delete p2; ,例:定义一个线段类,计算两点之间的距离。,分析:因为线段由两个点来确定。所以首先应确定点的位置,再利用公式: 来计算线段长度。,类 的 组 合,1、先声明点类 class Point p

29、rivate: int X , Y; /点的坐标 public: Point(int xx=0; int yy=0) /构造函数 X=xx; Y=yy; int GetX() /取X坐标 return X; int GetY() /取Y坐标 return Y; ;,2、再声明线段距离类 class distance private: Point p1, p2; /线段的两个端点 double dist; /线段的长度 public: distance ( Point a , Point b ); /构造函数 double Getdis ( ) return dist; ;,组合,定义: 组合(

30、聚集):类中的成员数据是另一个类的对象。即一个类内嵌其他类的对象作为成员数据。 作用: 可以在已有的抽象的基础上实现更复杂的抽象。 原则: 创建类的对象时,如果这个类具有内嵌对象成员,则各个内嵌对象也将被自动创建。初始化时不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。,类 的 组 合,类组合的构造函数,构造函数的声明形式: 类名:类名(对象成员所需的形参表) :对象1(参数),对象2(参数), 本类初始化 ,类 的 组 合,完成对象成员的初始化,前向引用声明,类应该先声明,后使用 如果需要在某个类的声明之前,引用该类,则应进行前向引用声明。 前向引用声明只为程序引入一个标识

31、符,但具体声明在其它地方。,前向引用声明举例,class B; /前向引用声明 class A public: void f(B b); ; class B public: void g(A a); ;,自学内容,const修饰符 MFC的CString类 MFC的CTime类和CTimeSpan类 类的嵌套,2.2 const修饰符,定义常量 , 定义格式如下: const = ; 常类型的对象必须进行初始化,而且不能被更新。 例如 : const double eps = 1.0E-10; int const n=10; n=20; 常引用的声明如下: const & 用常引用作形参时,可

32、避免对实参的意外更改,常引用做形参,#include void display ( const double ,2、常对象:必须进行初始化,不能被更新。 类名 const 对象名 例: class A public: A ( int i, int j) x=i; y=j; . private: int x, y; ; A const a(3,4); /a是常对象,不能被更新,用const修饰的对象成员,常成员函数 使用const关键字说明的函数。格式: 类型说明符 函数名(参数表)const; const是函数类型的一个组成部分,因此在实现部分也要带const关键字。 常成员函数不更新对象的数

33、据成员。也不能调用该类中没有用const修饰 的成员函数(保证常成员函数绝不更新数据成员) 常对象只能调用它的常成员函数,而不能调用其他成员函数。 const关键字可以被用于参与对重载函数的区分,常成员函数举例,#include class R public: R ( int r1, int r2) R1=r1; R2=r2; void print( ); void print( ) const; private: int R1,R2; ;,void R:print( ) coutR1“:“R2endl; void R:print( ) const coutR1“;“R2endl; void

34、main( ) R a(5,4); /声明对象 a a.print( ); /调用void print( ) const R b(20,52); /声明常对象b b.print( ); /只能调用void print( )const ,用const修饰的对象成员,常数据成员 使用const说明的数据成员。 任何函数都不能对该数据成员赋值 构造函数对该数据成员进行初始化,只能通过初始化列表,常数据成员举例,#include class A public: A ( int i ); void print( ); const int ,const int A:b=10; /静态常数据成员在类进行定义

35、和初始化 A:A(int i):a(i), r(a) /常数据成员通过初始化列表进行初始化 void A:print( ) couta“:“b“:“rendl; void main( ) A a1(100), a2(0); a1.print( ); a2.print( ); ,调用构造函数,在初始化列表中完成常数据成员的赋值:,100,i(100),a(100),a的地址,r,2.8 MFC的CString类 (#include ),赋值/连接运算 =、 +、 += 比较运算 、=、=、Compare、CompareNoCase 截取运算 Mid、Left、Right 转换运算 MakeUpp

36、er、MakeLower、MakeReverse,CString类(续),查看字符信息 GetAt、GetLength、IsEmpty 修改字符信息 SetAt、Insert、Delete 格式化输出 Format,CString类举例,#include #include void main() CString s; s=“123456289“; coutsendl; s.MakeReverse(); coutsendl; s.Format(“s=%d“,100); coutsendl; ,2.9 MFC的CTime类和CTimeSpan类,构造函数 CTime、GetCurrentTime

37、截取函数 GetYear、GetMonth、GetDay 转换函数 Format 运算符 =、+、-,CTime类举例,#include #include void main() CTime t; CString s; t=CTime( 1999, 3, 19, 22, 15, 0 ); s = t.Format( “%A, %B %d, %Y“ ); coutsendl; t = CTime:GetCurrentTime(); s = t.Format( “%A, %B %d, %Y“ ); coutsendl; ,CTimeSpan类,构造函数 CTimeSpan(); CTimeSpan

38、(const CTimeSpan / 返回此CTimeSpan对象中的分钟数,CTime类和CTimeSpan类的运算,= / 赋一个新的时间值 +,- / 将 CTime对象加上或减去一个CTimeSPan对象 +=, -= / 将CTime对象加上或减去一个CTimeSpan对象 , =, =, =,!= / 比较两个CTime对象 举例 : CTime t1( 2000, 3, 19, 22, 15, 0 ); CTime t2( 2000, 3, 20, 22, 15, 0 ); CTimeSpan ts = t2 - t1; / 计算两日期的间隔 t2 += CTimeSpan( 1

39、, 0, 0, 0 );/ 在某日期上加一间隔 CString s=ts.Format(“days:%D,hours:%H,mins:%M,secs:%S“); couts; s=t2.Format(“%A,%B %d,%Y“); couts;,2.10 类的嵌套,class Employee CString m_sDepartment; / 工作部门 CString m_sName; / 姓名 CTime m_tBirthdate; / 出生日期 Position m_nPosition; / 职务 CTime m_tDateOfWork; / 参加工作时间 Salary m_Salary;

40、 / 工资 public: Employee(LPCTSTR lpszDepart, LPCTSTR lpszName, CTime tBirthdate,Position nPosition, CTime tDateOfWork);/ 构造函数 . . ,调试技术,如何在程序中使用MFC类库 使用FileView标签,程序设计举例,例2-6 编写一个职工档案管理系统。 P.112 P.119,上机练习题目,1现实世界中的物理实体和逻辑概念均可以看作是对象。分析你周围的一个对象,试用C+类来描述它。 2定义一个Dog类,包含name、age、sex、weight等属性以及对这些属性操作的方法。实现并测试这个类。 3设计并测试一个名为Ellipse的椭圆类,其属性为外接矩形的左上角与右下角两个点的坐标,并能计算出椭圆的面积。 4通过查阅MSDN帮助了解CTime类和CTimeSpan类的用法,并编程验证CString类,CTime类和CTimeSpan类各成员函数的使用方法。 5为一个小型图书馆的管理系统定义图书卡类、借书证类和借书记录类,设计其成员函数,包括书卡录入函数和借书证录入函数、借书登记函数和还书处理函数等。设计好的类可自编主函数验证之。,结 束 语,学好程序设计语言的唯一途径是 上机练习。 你的编程能力与你在计算机上投入的时间成 正比。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1