第--章-类与对象优秀文档.ppt
《第--章-类与对象优秀文档.ppt》由会员分享,可在线阅读,更多相关《第--章-类与对象优秀文档.ppt(119页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第 7 7章章 类与对象类与对象7.1 7.1 C+C+的的OOPOOP程序结构框架程序结构框架7.2 7.2 类类(class)class)类型类型7.3 7.3 类的构造函数与析构函数类的构造函数与析构函数7.4 7.4 简单类应用程序简单类应用程序7.5 7.5 类的静态类的静态(static)static)成员及常量成员及常量(const)const)成员成员7.6 7.6 友元友元7.7 7.7 结构体与联合体结构体与联合体7.8 7.8 创建一个集合类型创建一个集合类型setset7.9 7.9 利用利用StackStack类型解迷宫问题类型解迷宫问题7.10 7.10 含有对象
2、成员的类含有对象成员的类lineline7.11 7.11 运算符重载运算符重载7.12 7.12 利用运算符重载实现集合利用运算符重载实现集合setset类型类型1 7.1 7.1 C+C+的的OOPOOP程序结构框架程序结构框架 -参看书参看书 C+C+程程 序序 的的 SPSP结结 构构 程程 序序 设设 计计 程程 序序 框框 架架(Structured Structured Programming)Programming),以以函函数数为为核核心心,其其程程序序主主体体为为一一批批函函数数定定义义的的集集合合,具具体体内内容容已在第已在第5 5章介绍过。章介绍过。第第二二种种为为OO
3、POOP面面向向对对象象程程序序设设计计程程序序框框架架(Object-Oriented Object-Oriented Programming)Programming),它它 以以 类类(class)class)为为核核心心,其其程程序序主主体体为为一一批批类类定定义义的的集合。集合。2 一个大的一个大的C+C+之之OOPOOP程序主体的一般格式为:程序主体的一般格式为:file_1.cpp(file_1.cpp(源程序文件源程序文件1)1)class class 11 11 成员函数的类体外定义成员函数的类体外定义 ././其他类其他类classclass 3 class class i
4、i 成员函数的类体外定义成员函数的类体外定义 main()main()././通过对象及相关方法与手段对所定义类进行使用通过对象及相关方法与手段对所定义类进行使用 ./其他文件其他文件filefile4file_n.cpp(file_n.cpp(源程序文件源程序文件n)n)class class n1 n1 成员函数的类体外定义成员函数的类体外定义 ./其他类其他类class class class class nm nm 成员函数的类体外定义成员函数的类体外定义 5使用要点:使用要点:(1)(1)有有且且仅仅有有一一个个mainmain函函数数,从从它它开开始始执执行行,它它结结束束则整个程
5、序结束。则整个程序结束。(2)(2)类类以以数数据据为为中中心心,把把相相关关的的一一批批函函数数组组成成为为一一体体。类类与与类类之之间间一一方方面面通通过过封封装装而而具具有有明明确确的的独独立立性性;另另一一方方面面,类类与与类类之之间间又又可可通通过过成成员员、友友元元和和参参数数的的关关系系,通通过过继继承承和和派派生生的的关关系系,进进行行相相互互的的通通讯讯和和联联络络,从从而而形形成成一一个有机的整体。个有机的整体。(3)(3)除除上上述述主主体体部部分分外外,如如有有必必要要,还还可可在在类类之之外外加加入全局量说明或全局函数定义等语法成分。入全局量说明或全局函数定义等语法成
6、分。6 (4)(4)可可以以从从以以下下两两个个角角度度来来看看待待类类与与对对象象概概念在编程中所起的作用。念在编程中所起的作用。第第一一,从从程程序序的的组组织织角角度度看看,C+C+通通过过classclass把把数数据据以以及及对对这这些些数数据据进进行行处处理理和和运运算算的的函函数数封封装装为为互互相相关关联联的的程程序序模模块块,提提高高程程序序的的可可读读性性、可维护性及可重用性。可维护性及可重用性。第第二二,从从数数据据类类型型的的角角度度看看,C+C+通通过过classclass引引入入了了抽抽象象数数据据类类型型的的概概念念。一一个个由由数数据据成成员员及及函数成员组成的
7、一个类就是一种新的数据类型。函数成员组成的一个类就是一种新的数据类型。77.2 7.2 类类(class)class)类型类型 -参看书小节参看书小节 1.1.通过如下一般方式来自定义类通过如下一般方式来自定义类(class)class)类型:类型:class class private:private:;public:public:;8 有以下几点需要注意:有以下几点需要注意:(1)(1)privateprivate关关键键字字后后列列出出本本类类的的私私有有成成员员;publicpublic后后列出本类的公有成员。列出本类的公有成员。(2)(2)成成员员又又区区分分为为数数据据成成员员与与
8、函函数数成成员员两两种种。数数据据成成员员代代表表该该类类对对象象含含有有的的数数据据(描描述述属属性性);而而函函数数成成员员则则代代表表如如何何对对该该类类对对象象所所含含数数据据进进行行操操作作的的代代码码(描描述述对对该该类类对对象象的处理方法)。的处理方法)。函函数数成成员员既既可可放放于于类类定定义义体体的的花花括括号号之之中中,也也可可按按类类外外定定义义方方式式放放于于之之外外(但但要要求求类类体体内内必必须须有有其其函函数数原原型型,且且类类体体外外函函数数说说明明的的前前面面必必须须用用“:”:”来来限限定定)。凡凡在在类类体中定义的函数成员均隐含为内联函数。体中定义的函数
9、成员均隐含为内联函数。9 (3)(3)以以friendfriend说说明明的的友友元元并并不不是是本本类类的的成成员员,被被说说明明为为本本类类友友元元的的那那些些函函数数享享有有本本类类成成员函数的员函数的“权利权利”-”-可以访问本类的私有成员。可以访问本类的私有成员。(4)(4)privateprivate、publicpublic以以及及friend“friend“说说明明段段”的的顺顺序序可可以以任任意意;每每一一类类型型的的“说说明明段段”均均可可以以出现多次,或者一次也不出现。出现多次,或者一次也不出现。若若紧紧随随左左花花括括号号后后的的第第一一个个“说说明明段段”为为priv
10、ateprivate的话,则该的话,则该privateprivate关键字可以省略。关键字可以省略。102.2.按如下方式来说明对象按如下方式来说明对象 (类类型的变量、类的实例):(类类型的变量、类的实例):,1,.,;n;如:如:class MyClassType1 class MyClassType1 private:private:int x int x,y;y;public:public:int getx()return x;int getx()return x;void setx(int x0)x=x0;void setx(int x0)x=x0;.;MyClassType1 ob
11、j1,obj2,objArr10;MyClassType1 obj1,obj2,objArr10;MyClassType1*pobj1,*pobj2;/MyClassType1*pobj1,*pobj2;/定义指针定义指针11 3.3.按如下方式来使用对象成员按如下方式来使用对象成员(数据成员、函数成员):(数据成员、函数成员):.如:如:obj1.x obj1.x objArr0.y objArr0.y obj2.setx()obj2.setx()objArri.getx()objArri.getx()(*pobj1).x (*pobj1).x 或或 pobj1-xpobj1-x(*pobj
12、2).getx()(*pobj2).getx()或或 pobj2-getx()pobj2-getx()124.4.类成员以及对它们的访问类成员以及对它们的访问 (1)(1)privateprivate私私有有成成员员 -只只可可在在类类中中以以及及本本类类的的友友元元函函数数内对这些成员进行访问,在别处是内对这些成员进行访问,在别处是“不可见的不可见的”。(2)(2)publicpublic公公有有成成员员 -这这些些成成员员不不仅仅在在类类中中可可以以访访问问,而且在建立类对象的其它模块中,也可以通过对象来访问它们。而且在建立类对象的其它模块中,也可以通过对象来访问它们。5.5.除除上上述述
13、提提到到的的对对象象数数组组、指指向向对对象象的的指指针针等等概概念念及及用用法外,对对象还可进行如下一些操作与使用法外,对对象还可进行如下一些操作与使用:.同类型的对象间可以相互赋值。同类型的对象间可以相互赋值。.对对象象可可作作为为函函数数参参数数(如如,对对象象作作形形参参,对对象象指指针针作作函函数数参数等)。参数等)。.函数的返回值可以是对象(或指向对象的指针)。函数的返回值可以是对象(或指向对象的指针)。.可以在一个类中说明具有类类型的成员。可以在一个类中说明具有类类型的成员。13自定义类自定义类(类型类型)程序示例程序示例#includeclassMyClassType1priv
14、ate:intx,y;public:intgetx()returnx;intgety();voidsetx(intx0)x=x0;voidsety(inty0);voiddisplayx()coutx=xendl;voiddisplayy()couty=yendl;intMyClassType1:gety()returny;voidMyClassType1:sety(inty0)y=y0;14 voidmain()MyClassType1obj1,*p,objArr10;obj1.setx(111);/coutobj1.xendl;/ERR!coutobj1.getx()sety(78);in
15、tk=(*p).getx();intm=p-gety();coutk=kendl;coutm=mendl;15 for(inti=0;i=&objArr5)p-setx(88);p-sety(99);p-;for(i=0;i10;i+)coutobjArri.getx()objArri.gety()endl;16 程序执行后的显示结果如下:程序执行后的显示结果如下:111111x=111x=111k=56k=56m=78m=7810 2010 2011 2111 2112 2212 2213 2313 2314 2414 2488 9988 9988 9988 9988 9988 9988 9
16、988 9988 9988 99177.3 7.3 类的构造函数与析构函数类的构造函数与析构函数 -参看书小节参看书小节7.3.1 7.3.1 概述概述1.1.类的构造函数类的构造函数 构造函数具有以下特征:构造函数具有以下特征:1)1)函数名与类名相同。函数名与类名相同。2)2)无函数返回类型说明。无函数返回类型说明。3)3)主要完成对象的初始化工作。主要完成对象的初始化工作。4)4)当当一一个个新新的的对对象象被被建建立立时时(通通过过对对象象说说明明语语句句或或通通过过newnew),系统自动调用其相应的构造函数。系统自动调用其相应的构造函数。5)5)可有多个构造函数(各自的参数表不相同
17、)。可有多个构造函数(各自的参数表不相同)。6)6)若若某某个个类类定定义义中中没没有有给给出出任任一一个个显显式式的的构构造造函函数数的的话话,则则系系统自动给出一个缺省的(隐式的)如下形式的构造函数:统自动给出一个缺省的(隐式的)如下形式的构造函数:(void)void)此函数无参,且什么事情也不做。此函数无参,且什么事情也不做。182.2.类的析构函数类的析构函数析构函数具有以下特征:析构函数具有以下特征:1)1)函数名为:函数名为:。2)2)无函数返回类型说明且无参数。无函数返回类型说明且无参数。3)3)主要完成对象撤消前的善后工作。主要完成对象撤消前的善后工作。4)4)当对象退出其说
18、明区域,当对象退出其说明区域,或使用或使用deletedelete释放动态对象释放动态对象时,系统自动调用其析构函数。时,系统自动调用其析构函数。5)5)一个类只可有一个析构函数,也可以缺省。一个类只可有一个析构函数,也可以缺省。6)6)若某个类定义中没有给出显式的析构函数的话,则系统若某个类定义中没有给出显式的析构函数的话,则系统自动给出一个缺省的(隐式的)如下形式的析构函数:自动给出一个缺省的(隐式的)如下形式的析构函数:(void)void)此函数什么事情也不做。此函数什么事情也不做。197.3.2 7.3.2 构造与析构函数示例构造与析构函数示例 1.1.构造函数与析构函数示例构造函数
19、与析构函数示例1 1 自定义类自定义类MyClassType1MyClassType1中设有三个显式的构中设有三个显式的构造函数。造函数。在说明在说明MyClassType1MyClassType1的类对象时,系统将根的类对象时,系统将根据实参的多少去自动调用相应的构造函数。据实参的多少去自动调用相应的构造函数。类定义中没出现显式的析构函数类定义中没出现显式的析构函数(意味着使意味着使用系统隐含的什么事也不做的析构函数用系统隐含的什么事也不做的析构函数)。20分析如下程序的执行结果分析如下程序的执行结果#includeclassMyClassType1private:intx,y;public
20、:MyClassType1()x=0;y=0;MyClassType1(intx0)x=x0;y=0;MyClassType1(intx0,inty0);voiddisplay()coutx=x,y=yendl;MyClassType1:MyClassType1(intx0,inty0)x=x0;y=y0;21void main()void main()MyClassType1 obj1;MyClassType1 obj1;MyClassType1 obj2(21),obj3(31,32);MyClassType1 obj2(21),obj3(31,32);obj1.display();obj
21、1.display();obj2.display();obj2.display();obj3.display();obj3.display();程序执行后的显示结果如下:程序执行后的显示结果如下:x=0,y=0 x=0,y=0 x=21,y=0 x=21,y=0 x=31,y=32x=31,y=3222 2.2.构造函数与析构函数示例构造函数与析构函数示例2 2 类类StringString具有一个显式的构造函数与一个显式的析构函具有一个显式的构造函数与一个显式的析构函数。在说明数。在说明StringString的类对象时,系统将自动调用其构造函数。的类对象时,系统将自动调用其构造函数。在在m
22、ainmain函数结束时(类对象生命期也将结束时),系统将自函数结束时(类对象生命期也将结束时),系统将自动调用其析构函数。动调用其析构函数。本例中,对象本例中,对象“诞生诞生”时,在构造函数中通过时,在构造函数中通过newnew分配分配了动态空间(系统资源),对象了动态空间(系统资源),对象“死亡死亡”时,在析构函数中时,在析构函数中应通过应通过deletedelete来释放所申请到的动态空间。来释放所申请到的动态空间。分析下述程序执行后会显示出什么结果分析下述程序执行后会显示出什么结果?23#include#include#include#include class String clas
23、s String char*text;char*text;public:public:String(char*str);String(char*str);String();String();void printStr()couttextendl;void printStr()couttextendl;String:String(char*str)String:String(char*str)coutstrendl;coutstrendl;text=new charstrlen(str)+1;text=new charstrlen(str)+1;strcpy(text,str);strcpy(t
24、ext,str);24String:String:String()String()couttextendl;deletetext;deletetext;void main()void main()String str1(a1d11);String str1(a1d11);String str2(s22g22);String str2(s22g22);str1.printStr();str1.printStr();str2.printStr();str2.printStr();coutending main!endl;coutending main!a1d11enter String:Strin
25、g,str=a1d11enter String:String,str=s22g22enter String:String,str=s22g22a1d11a1d11s22g22s22g22ending main!ending main!enter String:String,text=s22g22enter String:String,text=s22g22enter String:String,text=a1d11enter String:String,text=a1d11267.4 7.4 简单类应用程序简单类应用程序1.1.用户自定义用户自定义cylindercylinder类并对该类进行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 对象 优秀 文档
限制150内