第6章--类与对象

第6章--类与对象

ID:81932231

大小:6.12 MB

页数:41页

时间:2022-10-14

上传者:胜利的果实
第6章--类与对象_第1页
第6章--类与对象_第2页
第6章--类与对象_第3页
第6章--类与对象_第4页
第6章--类与对象_第5页
第6章--类与对象_第6页
第6章--类与对象_第7页
第6章--类与对象_第8页
第6章--类与对象_第9页
第6章--类与对象_第10页
资源描述:

《第6章--类与对象》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1

2学习目标掌握类的概念和定义方法掌握对象的定义和使用方法了解构造函数和析构函数的特点、功能,掌握它们的定义和使用方法了解静态成员的特点以及与非静态成员的区别

36.1类6.1.1类的定义类是一种复杂的自定义数据类型。它的定义一般包括说明部分和实现部分。说明部分用来声明类包含的数据成员和成员函数,实现部分用来定义成员函数的具体实现。类的一般定义形式如下:class<类名>{[[private:]<数据成员及成员函数的说明或实现>][proteted:<数据成员及成员函数的说明或实现>][public:<数据成员及成员函数的说明或实现>]};

46.1类6.1.2类的数据成员数据成员是类的一个重要组成部分。类的数据成员同结构struct中的数据成员是一致的,不仅定义的语法一样,使用的结构也一样。

56.1类6.1.3类的成员函数成员函数实现对类中数据成员的操作。它描述了类的行为。由于对象的封装性,类的成员函数是对私有数据成员进行操作的唯一途经。1.成员函数的声明一般地,类的成员函数声明的结构如下:<返回类型><成员函数名>([<参数列表>]);<返回类型>是成员函数的返回值类型,如果没有返回值,则类型为void。<成员函数名>是一般的函数名。<参数列表>是函数的形式参数表,如Date类中Set()函数中的inty,intm和intd。

66.1类2.成员函数的实现成员函数的声明只是说明类中需要这样一个成员函数,该成员函数具体执行什么操作,需要进一步定义这个成员函数,来实现它的操作功能。成员函数定义的结构如下:<返回类型><类名>::<成员函数名>([<参数列表>]){<函数体>}成员函数定义的结构与普通函数不同的地方是:在<返回类型>和<成员函数名>之间加了一个“<类名>::”,其中双冒号“::”是作用域运算符,用来标识成员函数或数据是属于那个类的。

76.1类6.1.4成员函数的存取权限成员函数的存取权限有3级:公有的(public)、保护的(protected)和私有的(private)。(1)公有成员用public关键字声明,它定义了类的外部接口,只有公有成员才可以被用户程序直接访问。(2)私有成员用private关键字声明,它定义了类的内部使用的数据和函数,私有的数据成员只能被类本身的成员函数及友元类的成员函数访问,其他类的成员函数,包括其派生类的成员函数都不能访问它们;(3)保护成员用protected关键字声明,存取权限介于公有成员和私有成员之间,它在类的继承中使用。保护的数据成员与私有数据成员类似,除了能被类本身的成员函数和说明为友元类的成员函数可以访问外,该类的派生类的成员函数也可以访问。

86.2对象6.2.1对象的定义1.对象的定义对象的定义形式有如下2种:(1)<类名><对象名列表>;(2)在定义类的同时定义对象class<类名>{[[private:]<数据成员及成员函数的说明或实现>][proteted:<数据成员及成员函数的说明或实现>][public:<数据成员及成员函数的说明或实现>]}对象名列表;

96.2对象2.对象的存储空间对象是一个类的变量,也称为类的实例。在VC++中,在定义类时,系统不会给类分配内存空间,只有创建对象时,C++才为每个对象分配内存空间,用于存放该对象的具体数据成员值;由于所有对象的成员函数的代码是相同的,所以,系统将成员函数的存储空间处理成该类的所有对象共享同一代码空间。

106.2对象表6-1常用类型的对齐方式类型对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)char偏移量必须为sizeof(char)即1的倍数int偏移量必须为sizeof(int)即4的倍数float偏移量必须为sizeof(float)即4的倍数double偏移量必须为sizeof(double)即8的倍数short偏移量必须为sizeof(short)即2的倍数

116.2对象6.2.2对象成员的使用定义对象后,就可以用对象访问其成员,访问格式如下:<对象名>.数据成员名<对象名>.成员函数名([<参数列表>])说明(1)“.”称为成员引用符,指示对象的成员。(2)<对象名>也可以使用指向对象的指针替代,则访问对象的格式为:<指向对象的指针>->数据成员名<指向对象的指针>->成员函数名([参数列表])

126.2对象6.2.3定义类和对象的有关说明定义类和对象的有关说明如下:(1)类中数据成员的类型可以是基本数据类型(如整型、实型、字符型等)、构造数据类型(如数组类型、指针类型、引用类型、结构类型等),以及自定义的“类”类型(结构类型是“类”类型的特例)。自身类的指针或引用可以作为类的成员,但自身类的对象不可作为成员。(2)当定义一个类时,引用了另一个类,而另一个类的定义在当前类的后面,则必须对另一个类作引用性说明。

136.3对象的初始化和撤销6.3.1构造函数1.构造函数的定义构造函数的定义可以在类体内也可以在类体外。•在类体内定义构造函数的一般格式是:<类名>([<形参列表>])//此处的“类名”作为构造函数名{…//数据成员的初始化语句}在类体外定义时,必须在体内声明,声明格式为:<类名>([<形参列表>]);//构造函数的声明

146.3对象的初始化和撤销2.构造函数的运行定义了构造函数,在创建对象时,编译系统先根据类的说明,为该对象分配存储空间,然后自动调用合适的构造函数对对象进行初始化。对象的创建格式如下:<类名><对象名>(<构造函数的实参列表>);3.带默认参数值的构造函数与普通函数一样,构造函数中的参数也可以缺省,这时,如果在创建对象时不指定参数,编译系统将使用默认值来初始化数据成员。

156.3对象的初始化和撤销4.构造函数的重载在定义一个类时,可以根据需要定义一个或多个构造函数,若定义多个构造函数称为构造函数的重载。构造函数也可以根据参数个数或类型的不同进行重载。

166.3对象的初始化和撤销6.3.2析构函数析构函数也是一个特殊的成员函数,它的作用与构造函数相反,析构函数的功能是:系统在撤销对象时,自动调用它做一些清理工作。即析构函数是用来释放该对象所占用的资源。析构函数的名称和类名相同,在类名前加上了一个“~”符号。析构函数同构造函数一样,不能有任何返回类型,也不能有void类型。析构函数是无参数函数,不能重载,一个类只能有一个析构函数。析构函数的定义可以在类体内也可以在类体外。•在类体内定义析构函数的一般格式是:<~类名>()//此处的“~类名”作为析构函数名{…//清理工作语句}

176.3对象的初始化和撤销6.3.2析构函数•在类体外定义析构函数的一般格式是:<类名>::<~类名>(){…//清理工作语句}

186.3对象的初始化和撤销6.3.3拷贝构造函数拷贝构造函数是一种特殊的构造函数,它的功能是用一个已知对象来初始化一个新创建的同类对象。•在类体外定义拷贝构造函数的格式如下:<类名>::<类名>([const]类名&obj]//注意形参是实参对象的[常]引用{<函数体>}•在类体内定义拷贝构造函数的格式是:把前面的类名限定去掉即可。<类名>([const]类名&obj]//注意形参是实参对象的[常]引用{<函数体>}

196.4静态成员6.4.1静态数据成员静态数据成员不从属于任何一个具体对象,所以必须对它初始化,而且对它的初始化不能在构造函数中进行。静态数据成员的定义和使用方法如下:(1)静态数据成员的定义格式为:<数据类型><静态数据成员名>;(2)静态数据成员初始化的格式为:<数据类型><类名>::<静态数据成员名>=<值>;(3)静态数据成员的访问格式为:<类名>::<静态数据成员名>

206.4静态成员6.4.2静态成员函数类似于静态数据成员,也可以把成员函数声明为静态的,即静态成员函数。静态成员函数也是属于整个类,只要类存在,静态成员函数就可以使用。因此,对静态成员的引用不需要用对象名。在静态成员函数的实现中不能直接引用类中说明的非静态成员,但可以引用类中说明的静态成员。如果静态成员函数中要引用非静态成员时,则可通过对象来引用。(1)静态成员函数的声明格式为:<返回类型><静态成员函数名>([<形式参数列表>]);

216.4静态成员(2)静态成员函数的定义可以在类体内,也可以在类体外。•在类体内定义格式为:<返回类型><静态成员函数名>([<形式参数列表>]){<函数体>}•如果在类体外定义,首先要在类体内声明函数。在类体外定义格式为:<返回类型><静态成员函数名>([<形式参数列表>]){<函数体>}(3)静态成员函数的访问格式为:<类名>::<静态成员函数名>([<参数表>]);

226.5友元类具有封装性和隐藏性。只有类的成员函数才能访问该类的私有成员,而程序中的其它函数是无法访问的类中私有成员的,它们仅能访问类中的公有成员。这给类的数据访问带来了不便。为了解决这个问题,C++提供了友元机制。6.5.1普通函数作为友元函数要使一个函数成为某个类的友元函数,必须在该类中对此函数进行声明。声明友元函数的方式是在类中使用关键字friend,其一般格式为:friend<返回类型><友元函数名>([<参数表>]);

236.5友元6.5.3友元类不仅函数可以作为一个类的友元,一个类也可以作为另一个类的友元,这时该类称为友元类。当一个类作为另一个类的友元时,意味着这个类的所有成员函数都是另一个类的友元函数。可以按如下方式定义友元类:classA{...friendclassB;//定义类B是类A的友元类};classB{...public:voidf1();floatf2();floatf3();};于是,在B类的所有成员函数(如f1()、f2()、f3())中,均可直接访问A类的私有成员。

246.6类与指针一个对象一旦被创建,系统就给它分配了一个存储空间,该存储空间的起始地址可以象简单变量的地址一样,使用指针变量操作。对象初始化后,会占用内存空间,可以使用指针变量指向对象起始地址,称为对象指针。对于类来说,可以定义指向其对象的指针和指向类成员的指针。此外,在C++的类中,还有一种特殊的指针,即this指针。

256.6类与指针6.6.1指向类对象的指针类作为一种数据类型,可以定义变量(即对象),也可定义指针,即指向类类型变量(对象)的指针,称为指向类对象的指针或指向对象的指针。•指向类对象指针的定义格式为:类名*指针变量名;•对象指针一旦指向某一对象后,就可以用它进行访问。通常使用“->”或“(*).”运算符:指针变量->成员(*指针变量).成员

266.6类与指针6.6.2new和delete函数new和delete是C++动态申请存储单元和删除存储单元的函数。对于动态申请存储空间,只能通过指针间接访问,而没有直接访问方式。1.new运算符new运算符常用的四种格式如下:(1)格式一:<指针变量>=new<数据类型>;功能:申请一个<数据类型>变量的空间,返回该空间的起始地址,并赋给<指针变量>。

276.6类与指针(1)格式二:<指针变量>=new<数据类型>(<值>);功能:申请一个<数据类型>变量的空间,用<值>初始化该空间,返回该空间的起始地址,并赋给<指针变量>。与格式一的区别在于给定变量初值。(3)格式三:<指针变量>=new<数据类型>[<表达式>];功能:申请一个一维数组空间,数据元素类型是<数据类型>,元素的个数是<表达式>,返回该空间的起始地址,并赋给<指针变量>。(4)格式四:<指针变量>=new<数据类型>[<表达式1>][<表达式2>];功能:申请一个二维数组空间,数据元素类型是<数据类型>,行数是<表达式1>,列数是<表达式2>,返回该空间的起始地址,地址类型是行指针,并赋给<指针变量>。

286.6类与指针2.delete运算符delete运算符有两种格式:(1)格式一:delete<指针变量>;功能:释放一个由<指针变量>指向的变量的空间。用于释放由new运算符格式一及格式二分配的空间。(2)格式二:delete[N]<指针变量>;//N可省略功能:释放一个由<指针变量>指向的数组的空间,该数组有N个元素。数组可以是一维或二维数组。

296.6类与指针6.6.3this指针this是一个隐含于成员函数中(或对象内)的特殊指针。该指针指向调用成员函数的当前对象。当对象调用成员函数时,系统自动将对象自身的指针(对象的地址)传递给成员函数,在成员函数中可直接使用该指针,指针名为this。通常在成员函数中直接写变量名访问数据成员,实际上,由于成员函数中隐含着一个指针this,它指向调用成员函数的对象,所以,可以通过this指针访问它所指向的对象的成员。

306.7情景应用——图书借阅管理系统6.7.1项目描述1.客户需求描述某社区图书馆为了提高办公效率,减少因纸张浪费带来的办公开支,现欲开发一个图书借阅管理系统。该系统具有如下功能:•新进图书入库•读者注册登记•办理借还书手续•为读者提供借书查询•馆内库存图书查询

316.7情景应用——图书借阅管理系统2.实施方案按照项目所涉及的技术与教材关联知识点,分三个版本开发完善。(1)第一版:利用面向对象程序设计方法,设计三个类:图书类Item、读者类Reader和图书馆操作类CMain,能模拟图书籍入库、读者注册、借还书等功能。(2)第二版:在第一版的基础上,增加杂志的借阅功能。利用继承和派生的知识,从书籍和杂志中抽象出共性,建立图书基类Book,将书籍和杂志作为其派生类。(3)第三版:在第二版的基础上,增加数据存储功能,完善图书借阅管理系统。

326.7情景应用——图书借阅管理系统6.7.2类的设计在一个信息系统内识别对象是最基本的,通过识别不同对象并进行抽象和分类,就能识别出相同属性和行为的对象归纳类。在图书借阅管理系统内,有书籍名Title、读者Author、借书证Code、管理人员借还书行为等对象和事件,他们分别各是一个类。确定图书借阅管理系统的各个类,并确定各个类对象的属性。1.图书类Item图书馆有成千上万的书,每册书都是一个对象,它们形成图书类(Item)。图书类,从流通管理的角度来看,应包含书名Title、作读者Author、分类号IndexCode、条形码BarCode等属性。并包含为各数据成员赋值操作、读取条码(GetCode)、显示图书的基本信息等操作。

336.7情景应用——图书借阅管理系统6.7.2类的设计classItem{charTitle[40];//书名charAuthor[20];//作者charIndexCode[10];//分类号longBarCode;//条形码public:Item();voidSetTitle(char[]);voidSetAuthor(char[]);voidSetIndexCode(char[]);voidSetBarCode(long);longGetBarCode(){returnBarCode;}voidShow();//显示书的信息};

346.7情景应用——图书借阅管理系统2.读者类Reader读者类(Reader),包含姓名(Name)、职务(Position)、借书证号(Code)等属性。一个读者允许借若干册书,用一个Item的数组保存相应信息。另外对读者所借书的统计itemCounter。对其属性的操作行为定义为类的成员函数。即:需定义为各属性赋值的操作、读取借书证的操作。借还书需要修订所借书数组,定义AddBook()和DelBook()两个操作,显示所借书的操作ShowBook()。3.操作类CMain在图书借阅管理系统内,操作类(CMain),包含统计库存书籍总册数、已注册的读者人数等属性。同时,包含为新书籍入库CreateBookItem()()的操作、为新来读者注册CreateReader()操作、以及借还图书、查询已借图书等操作。

356.7情景应用——图书借阅管理系统6.7.3类成员函数的实现1.图书类ItemItem::Item(){}//构造函数voidItem::SetTitle(chartl[]){strcpy(Title,tl);}voidItem::SetAuthor(chartl[]){strcpy(Author,tl);}voidItem::SetIndexCode(chartl[]){strcpy(IndexCode,tl);}voidItem::SetBarCode(longt){BarCode=t;}voidItem::Show()//显示书的信息{cout<

366.7情景应用——图书借阅管理系统6.7.4系统实现及测试1.主函数主函数是程序的入口,程序从主函数开始执行,通过调用菜单显示函数将菜单显示在屏幕上,当用户选择特定功能时,通过控制类CMain调用相应的成员函数实现用户所选择的功能。2.运行测试操作步骤如下:(1)运行程序,主界面如图6-5所示。(2)按数字“1”键,选择“新书入库”菜单,进入书籍入库操作界面,如图6-6所示,按系统提示,录入书名、作者、分类号、条码。(3)按数字“2”键,选择“读者登级”菜单,进入读者登记注册操作界面,如图6-7所示,按系统提示,录入姓名、职务、借书证号。

376.7情景应用——图书借阅管理系统2.运行测试图6-5主界面

386.7情景应用——图书借阅管理系统2.运行测试图6-6图书登记入库

396.7情景应用——图书借阅管理系统2.运行测试图6-7读者登记注册

40

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
最近更新
更多
大家都在看
近期热门
关闭