第06章-类与对象.ppt_第1页
第06章-类与对象.ppt_第2页
第06章-类与对象.ppt_第3页
第06章-类与对象.ppt_第4页
第06章-类与对象.ppt_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章类与对象6.1面向对象程序设计的基本概念6.2类与对象的定义(重点)6.3对象的初始化(重点)6.4对象数组与对象指针(重点)6.5友元6.6类成员的共享与保护6.7程序实例,6.1从面向过程到面向对象6.1.1面向对象程序设计的基本概念1对象对象(Object)是面向对象程序设计的核心,是程序的主要组成部分,一个程序就是一组对象的总和。对象=数据+处理数据的行为对象是具有一定数据(属性)和行为方式(方法)的实体。每个对象都有其自身的数据(属性)和行为方式(方法)。,2类类是同一类型对象(具有相似行为的对象)的集合和抽象,是由用户定义的数据类型。人们把具有相同状态、行为和访问机制的多个对象抽象成一个类。定义类之后,属于这种类的一个对象称为类实例或类对象。类代表一般,而类的一个对象代表具体。,3消息和方法消息(Message):就是用来请求对象执行某一处理或回答某些信息的要求。程序的执行是靠对象间消息的传递来完成的。方法(Method):是类的行为的总称,是允许作用于该类对象上的各种操作。一个类可以有多个方法,表示该类具有多种功能和操作。,4面向对象程序设计的基本特征(1)封装性:是指把对象属性和操作结合在一起,构成独立的单元,它的内部信息对外界是隐蔽的,不允许外界直接存取对象的属性,只能通过有限的接口与对象发生联系。(2)继承性:是指从已有的一个类可以构造新的类,使得新类具有原类的所有特性,并且新类还可以增加一些新的特性。(3)多态性:同样的消息被不同的对象接收时可导致完全不同的行动,这种现象称为多态性。,6.2.1C+面向对象程序的结构一个面向对象的C+程序一般由类的声明(定义)和类的使用两部分组成。类的使用部分一般由主函数和有关子函数组成。,6.2类与对象的定义,includeusingnamespacestd;/类的定义部分classCintx,y,z;/类C的数据成员声明f();/类C的成员函数声明;,/类的使用部分voidmain()Ca;/建立一个类C的对象aa.f();/调用对象a的成员函数f(),以下是一个典型的C+面向对象程序的结构:,在C+程序中,程序设计始终围绕“类”展开。【例6.1】类的应用示例。(1)定义一个number类:包含2个成员函数2个数据成员(变量);(2)主函数使用该number类:包括先由类产生对象;然后使用对象的成员函数、数据成员。,class类名public:数据成员或成员函数的定义private:数据成员或成员函数的定义protected:数据成员或成员函数的定义;,6.2.2类的定义一个类指定一个独立的对象集合。类的定义中一般包括两部分说明内容:数据成员(变量);成员函数(操作)。,1类的定义形式,classnumberpublic:/定义公有数据成员voidset(intm,intn)a=m;b=n;voidprint().;.;private:inta,b;/定义私有数据成员;,2类成员函数的定义对类的成员函数的定义通常有两种实现形式:一种是在类的定义中直接定义函数;另一种是在类外定义。例6.1是在类内部实现成员函数,下面例子则分别在类内部、类外部实现成员函数。【例6.2】求,其中。本题要求将此函数f(n)作为类的成员函数之一。,在类定义中只给出成员函数的原型;在类外部定义具体的成员函数(此时函数名前要加:类名:)。,函数返回值的类型类名:函数名(形参表)/这里省略号表示函数体的内容,其中,双冒号:是作用域运算符,它指出该函数是属于哪一个类的成员函数。,在类外部实现成员函数的语法规则:,6.2.3对象的定义与使用1对象的定义定义对象采用如下的一般形式:类名对象名表;其中,对象名表代表有多个对象名,各对象名之间以逗号分隔。对象定义举例:numberob;/类名number,对象名obcalculateob1,ob2;/类名calculate,对象名ob1,ob2,2对象成员引用具体引用形式为:对象名.数据成员名对象名.成员函数名(实参表)【例6.3】定义一个时钟类,类中有3个私有数据成员(Hour、Minute和Second)和两个公有成员函数(SetTime和ShowTime)。SetTime根据传递的3个参数为对象设置时间,ShowTime负责将对象表示的时间显示输出。在主函数中,建立一个时间类的对象,先利用默认时间设置,再设置时间为10时23分45秒并显示该时间。,6.2.4类与结构体的区别在C+语言中,结构体除了具有原先C语言定义的功能外,还具有类似于类的功能,即结构体中也可以定义函数。它们之间的区别是:在结构体中,成员的默认访问权限是public,而类成员的默认访问权限是private。【例6.4】用结构体定义类的示例。,6.3对象的初始化在类的定义中不能给数据成员赋初值。从封装的目的出发,类的数据成员应该多为私有的,对私有数据成员的访问只能通过成员函数,而不能通过成员引用的方式来赋值。C+中定义了一种特殊的初始化函数,称之为构造函数(Constructor)。在特定对象使用结束时,还将进行一些清除工作。对象清除工作由析构函数(Destructor)来完成。,6.3.1构造函数1构造函数的特点(1)构造函数名与类名相同,且没有返回值,不能指定函数类型。(2)构造函数必须具有公有属性,但它不能被显式地调用,它是在定义对象的同时被系统自动调用的。(3)构造函数是特殊的成员函数,函数体可以写在类体内,也可以写在类体外。(4)构造函数可以重载,即一个类中可以定义多个不同的构造函数(函数名相同,但函数的参数个数或参数类型不同)。,【例6.5】使用构造函数替代例6.3中SetTime()成员函数,并在主函数中,使用构造函数设置时间为15时19分56秒并显示该时间。构造函数也可以重载。所谓函数重载是指多个函数具有相同函数名,但这些函数的参数、返回值类型、函数的实现代码不同。【例6.6】构造函数重载定义示例。,构造函数的定义、功能:综上所述,构造函数是一个有着特殊名字,在对象创建时被自动调用的一种函数。构造函的功能就是完成对象的初始化。,2默认的构造函数如果类定义中没有给出构造函数,则C+编译器会自动给出一个默认的构造函数,而且默认的构造函数只能有一个,形式如下:类名:默认构造函数名(),当类中没有定义过任何形式的构造函数时,系统会自动为创建的对象生成默认的构造函数。若类中已经定义过构造函数,则系统不会自动生成默认的构造函数;一旦需要,则要求显式地定义这种形式的构造函数。在程序中,若定义一个静态对象而没有指明初始值时,编译器会按默认的构造函数将对象的数据成员初始化为0或空。【例6.7】默认构造函数示例。【例6.8】构造函数的调用。,6.3.2析构函数1析构函数的特点当对象创建时,会自动调用构造函数进行初始化。当对象撤消时,也会自动调用析构函数进行一些清理工作,如释放分配给对象的内存空间等。与构造函数类似的是:析构函数也与类同名,但在名字前有一个“”符号,析构函数也具有公有属性,也没有返回类型和返回值,但析构函数不带参数,不能重载,所以析构函数只有一个。【例6.9】析构函数程序举例。,2默认的析构函数和默认构造函数一样,如果类定义中没有给出析构函数,系统也会自动生成一个默认的析构函数,其格式如下:类名称:默认析构函数名(),例如,编译系统为类Point生成默认的析构函数如下:Point:Point()对于大多数类而言,默认的析构函数就能满足要求。只有在一个对象完成其操作之前需要做一些内部处理时,才显式地定义析构函数。,6.3.3复制构造函数复制构造函数何时存在?有对象复制现象的时候存在。复制构造函数的作用:是使用一个已存在的对象去初始化另一个同类对象。复制构造函数的特征:它也是一种构造函数,具有一般构造函数的特征;此外还有一些新特征。,复制构造函数的定义格式如下:类名:复制构造函数名(const类名/定义Point类的对象数组P,与普通数组一样,在使用对象数组时也只能访问单个数组元素,也就是一个对象,通过这个对象,可以访问它的公有成员,访问对象元素的一般形式如下:数组名下标.成员名和普通数组一样,对象数组既可以在定义时初始化,也可以在定义后赋值。【例6.12】对象数组应用示例。,6.4.2对象指针对象指针就是指向对象的指针,其定义的格式如下:类名*对象指针名;对象成员也可以通过指向对象的指针来引用,引用数据成员的具体形式如下:指向对象的指针-数据成员名或:(*指向对象的指针).数据成员名指向对象变量的指针类似于指向结构体变量的指针。,用对象的指针去引用对象的成员函数的具体形式:指向对象的指针-成员函数名(实参表)或:(*指向对象的指针).成员函数名(实参表)【例6.13】对象指针应用示例。,6.4.3指向类成员的指针1指向数据成员的指针指向数据成员的指针定义格式如下:类型说明符类名:*数据成员指针名;定义了指向数据成员的指针后,需要对其进行赋值,也就是要确定指向类的哪一个成员。对数据成员指针赋值的一般格式如下:数据成员指针名=,将指针指向类的数据成员后,就可以通过类的对象引用指针所指向的数据成员,其格式有两种:对象名.*数据成员指针名;或:对象指针名-*数据成员指针名;【例6.14】指向数据成员指针应用举例。,2指向成员函数的指针指向成员函数的指针定义格式如下:函数返回值类型(类名:*成员函数指针名)(参数表);定义成员函数指针后要对其赋值,也就是确定指向类的哪一个成员函数。给指向成员函数指针赋值的一般格式如下:成员函数指针名=,调用成员函数指针所指向函数的格式如下:(对象名.*成员函数指针名)(实参表)或:(对象指针名-*成员函数指针名)(实参表)【例6.15】指向类成员函数指针应用举例。,*6.4.4this指针类的每一个成员函数都有一个隐含的常量指针,通常称为this指针。this指针的类型就是成员函数所属类的类型。当调用成员函数时,它被初始化为被调用函数的对象的地址。this指针在系统中是隐含地存在的,也可以显式地使用。,【例6.16】this指针应用举例。需要注意的是,this指针是一个const指针,不能在程序中修改它,而且this指针的作用域仅在一个对象的内部。,6.5友元6.5.1友元函数友元函数是类定义中由关键字friend修饰的非成员函数。友元函数可以是一个普通函数,也可以是其它类的成员函数,它不是本类的成员函数,但是在它的函数体中可以通过“对象.成员名”访问类的私有成员和保护成员。,友元函数声明的格式为:friend函数返回值类型友元函数名(参数表);【例6.19】友元函数应用举例。,6.5.2友元类和函数一样,类也可以说明为另一个类的友元,这时称该类为友元类。如果A类是B类的友元类,则A类中的私有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。友元类说明的格式为:friendclass类名;类说明语句可以放在公有部分,也可以放在私有部分或保护部分。【例6.20】友元类应用举例。,友元提供了一种非成员函数访问类的私有成员的方法,这在某些情况下为程序设计提供了一定的方便性。但是面向对象的程序设计要求类的接口与类的实现分开,对对象的访问通过其接口函数进行。如果直接访问对象的私有成员,就破坏了面向对象程序的数据隐藏和封装特性,虽然提供了一些方便,但有可能是得不偿失的,所以,需要慎用友元。,此外,还有两点需要注意:(1)友元关系不能传递。例如,B类是A类的友元,C类是B类的友元,如果C类和A类之间没有显式说明,C类和A类之间不是友元关系。(2)友元关系的单向性。例如,如果B类是A类的友元,则B类的成员函数都是A类的友元函数,可以访问A类的所有数据成员,但A类的成员函数就不是B类的友元函数,也就不能访问B类的所有数据成员。,6.6类成员的共享与保护6.6.1静态成员1.静态数据成员静态数据成员的定义格式如下:static数据类型变量名;,静态数据成员初始化的方式也与一般的数据成员不同。静态数据成员初始化应在类外进行,而且应在对象定义之前。一般在main()函数之前,类定义之后的位置对它进行初始化,格式如下:数据类型类名:静态数据成员名初始值;引用静态数据成员的格式如下:类名:静态数据成员名【例6.17】静态数据成员应用举例。,2.静态成员函数定义静态成员函数的格式如下:static函数返回值的类型静态成员函数名(形参表)(函数体),静态成员函数仅能访问静态的数据成员,不能访问非静态的数据成员,也不能访问非静态的成员函数,这是由于静态的成员函数没有this指针。静态成员函数的调用不需要对象名。类似于静态的数据成员,公有的、静态的成员函数在类外的调用方式如下:类名:静态成员函数名(实参表),也允许用对象或指向对象的指针调用静态成员函数,一般格式如下:对象名.静态成员函数名(实参表)对象指针-静态成员函数名(实参表)【例6.18】静态成员函数应用举例。,6.6.2常对象和常成员1.常对象和常成员函数如果在定义对象时用const修饰,则被定义的对象为常对象。常对象的数据成员值在对

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论