《第二章类与对象PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第二章类与对象PPT讲稿.ppt(185页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第二章类与对象第二章类与对象第1页,共185页,编辑于2022年,星期二本章主要内容本章主要内容l面向对象的思想面向对象的思想l类概念和声明类概念和声明l类的成员类的成员l构造函数与析构函数构造函数与析构函数l用用const保护数据保护数据l友元友元l静态成员静态成员lthis指针指针第2页,共185页,编辑于2022年,星期二l重点重点:根据具体问题的算法编写程序,重点考虑本根据具体问题的算法编写程序,重点考虑本问题的解决方法和流程问题的解决方法和流程l形式:形式:主模块主模块+若干个子模块(若干个子模块(main()+子函数)。子函数)。每个函数实现一项功能每个函数实现一项功能l特点:特点
2、:设计者必须考虑每一个细节设计者必须考虑每一个细节数据与函数分离,所有数据都是公用的。数据与函数分离,所有数据都是公用的。面向过程设计方法回顾2.1 面向对象程序设计面向对象程序设计第3页,共185页,编辑于2022年,星期二l缺点:缺点:数据与代码分离导致数据改变时需重新编写函数数据与代码分离导致数据改变时需重新编写函数程序功能扩充时程序的可重用性差,效率低。程序功能扩充时程序的可重用性差,效率低。面向过程设计方法回顾2.1 面向对象程序设计面向对象程序设计主函数主函数函数函数1函数函数2函数函数3函数函数11函数函数12函数函数31函数函数32数据数据1数据数据2数据数据3第4页,共185
3、页,编辑于2022年,星期二l例例:编写小型公司人员信息管理系统编写小型公司人员信息管理系统某小型公司主要有人员,经理、兼职技术人某小型公司主要有人员,经理、兼职技术人员、销售经理和兼职推销员。现在需要存储员、销售经理和兼职推销员。现在需要存储这些人员的姓名、编号、级别、当月薪水、这些人员的姓名、编号、级别、当月薪水、计算月薪总额并显示全部信息。计算月薪总额并显示全部信息。月薪计算方法:月薪计算方法:经理经理拿固定月薪拿固定月薪8000元元兼职兼职技术人员技术人员按每小时按每小时100元领取月薪兼职推销员元领取月薪兼职推销员月薪按当月销售额的月薪按当月销售额的4%提成提成销售经理销售经理既拿固
4、既拿固定月薪也领取销售提成,固定月薪为定月薪也领取销售提成,固定月薪为5000元,元,销售提成为所管辖部门当月销售额的销售提成为所管辖部门当月销售额的5。面向过程设计方法回顾2.1 面向对象程序设计面向对象程序设计第5页,共185页,编辑于2022年,星期二l分析:分析:一般数据描述用结构体一般数据描述用结构体structemployeechar*name;/姓名姓名intno;/编号编号char*job;/职位职位floatpaytotal;/月薪总额月薪总额floathourlyRate;/每小时酬金每小时酬金intworkHours;/当月工作时数当月工作时数floatCommRate;
5、/销售额提取百分比销售额提取百分比floatsales;/当月销售额当月销售额不同职位月薪计算方法和需要数据个数不同,专用与公用数不同职位月薪计算方法和需要数据个数不同,专用与公用数据混杂据混杂,数据结构过于庞大数据结构过于庞大,结构不清结构不清面向过程设计方法回顾2.1 面向对象程序设计面向对象程序设计第6页,共185页,编辑于2022年,星期二l程序结构:程序结构:函数:函数:Eemployee*input()输入全部数据输入全部数据必须输入全部数据,即使不使用的部分专有数据也不例外,必须输入全部数据,即使不使用的部分专有数据也不例外,且输入顺序要与数据文件顺序匹配且输入顺序要与数据文件顺
6、序匹配E月薪计算函数月薪计算函数pay利用函数重载编写各类人员月薪计算函数利用函数重载编写各类人员月薪计算函数pay,这样主函,这样主函数中必须要有相应分支结构,按职位调用相应数中必须要有相应分支结构,按职位调用相应pay函数函数Evoidoutput(employeeperson)输出全部数据输出全部数据除输出公用数据外除输出公用数据外,其中应有分支结构,根据职位不同输其中应有分支结构,根据职位不同输出其专有数据。如:兼职技术人员要输出每小时薪金数及出其专有数据。如:兼职技术人员要输出每小时薪金数及小时数等信息小时数等信息面向过程设计方法回顾2.1 面向对象程序设计面向对象程序设计第7页,共
7、185页,编辑于2022年,星期二l分析:分析:修改:修改:E添加钟点工:添加钟点工:4小时以内每小时小时以内每小时5元,元,4小时以上每小时以上每小时小时8元。元。E程序修改范围:添加程序修改范围:添加pay函数,修改所有其他函数函数,修改所有其他函数包括包括main函数包括数据文件函数包括数据文件l结论:结论:面向过程的程序设计在程序的通用性、扩展面向过程的程序设计在程序的通用性、扩展性方面存在缺陷。性方面存在缺陷。面向过程设计方法回顾2.1 面向对象程序设计面向对象程序设计第8页,共185页,编辑于2022年,星期二2.1 面向对象程序设计面向对象程序设计l观点:观点:从程序的通用性入手
8、,将程序潜在使用者作为对象进行从程序的通用性入手,将程序潜在使用者作为对象进行全面研究。认为所有问题由彼此相关且能够相互通信的全面研究。认为所有问题由彼此相关且能够相互通信的实体(对象)所组成,并总结出对象的共性特点。实体(对象)所组成,并总结出对象的共性特点。例:公司:问题。公司中的一个人员:对象。例:公司:问题。公司中的一个人员:对象。l特点:特点:每个对象都有自己的特征每个对象都有自己的特征(对象的属性对象的属性)(数据数据)每个对象都有自己的行为。每个对象都有自己的行为。(操作操作)例:王经理有自己的编号、月薪等数据属性和自己的行为:例:王经理有自己的编号、月薪等数据属性和自己的行为:
9、月薪计算函数月薪计算函数l要求:要求:高度概括、分类、和抽象现实问题。高度概括、分类、和抽象现实问题。将数据与对数据进行的操作封装。将数据与对数据进行的操作封装。面向对象的思想第9页,共185页,编辑于2022年,星期二l抽象:抽象:将研究对象(问题)分类并总结将研究对象(问题)分类并总结出每类对象的公共性质并加以描述出每类对象的公共性质并加以描述将具有相同结构和特性的一批对象总结出将具有相同结构和特性的一批对象总结出来用来用“类类”这种数据结构描述,称为这种数据结构描述,称为对象对象的抽象的抽象数据抽象数据抽象:总结出同类对象的基本特点:总结出同类对象的基本特点(属性)用物理量(变量等)描述
10、(属性)用物理量(变量等)描述代码抽象:总结出同类对象的共有的行为代码抽象:总结出同类对象的共有的行为特征(操作或具有的功能),编写相应专特征(操作或具有的功能),编写相应专用函数用函数E例:编写兼职技术人员的月薪计算函数例:编写兼职技术人员的月薪计算函数2.1 面向对象程序设计面向对象程序设计面向对象的基本特点第10页,共185页,编辑于2022年,星期二l封装封装:将数据和操作放在一起,视为一个:将数据和操作放在一起,视为一个整体称为整体称为类类,与外界相对分隔。,与外界相对分隔。面向对象的基本特点2.1 面向对象程序设计面向对象程序设计类类数据数据操作代码操作代码l例:兼职技术人员例:兼
11、职技术人员特有数据:每小时薪金数和月工作时间特有数据:每小时薪金数和月工作时间特有代码:求月薪函数特有代码:求月薪函数封装成:封装成:技术人员类技术人员类第11页,共185页,编辑于2022年,星期二2.1 面向对象程序设计面向对象程序设计l例:兼职技术人员的封装例:兼职技术人员的封装classtechnician:publicemployee/技术人员类技术人员类private:floathourlyRate;/每小时酬金每小时酬金intworkHours;/当月工作时数当月工作时数public:voidpay()/计算月薪函数计算月薪函数cinworkHours;accumPay=hour
12、lyRate*workHours;第12页,共185页,编辑于2022年,星期二2.1 面向对象程序设计面向对象程序设计l封装封装特点:特点:数据只能在内部使用,外界及其他类只能数据只能在内部使用,外界及其他类只能通过程序接口联系,可以保护数据通过程序接口联系,可以保护数据使用者不必了解具体的实现细节,只通过使用者不必了解具体的实现细节,只通过外部接口以特定的访问权限,使用类的成外部接口以特定的访问权限,使用类的成员员程序扩充功能时可直接编写新的封装模块,程序扩充功能时可直接编写新的封装模块,设计接口接入程序即可设计接口接入程序即可面向对象的基本特点第13页,共185页,编辑于2022年,星期
13、二2.1 面向对象程序设计面向对象程序设计l继承与派生:继承与派生:在一个类基础上可派生出新的类在一个类基础上可派生出新的类新类继承原类的所有成员并可产生新的功新类继承原类的所有成员并可产生新的功能能实际操作时通常将所有对象共用的数据及实际操作时通常将所有对象共用的数据及操作作为基础类,不同对象专有数据都从操作作为基础类,不同对象专有数据都从基类中基类中派生派生得出得出面向对象的基本特点第14页,共185页,编辑于2022年,星期二面向对象的基本特点2.1 面向对象程序设计面向对象程序设计基类公共数据公共数据操作代码操作代码经理数据数据操作代码操作代码技术人员数据数据操作代码操作代码销售人员数
14、据数据操作代码操作代码钟点工数据数据操作代码操作代码第15页,共185页,编辑于2022年,星期二2.1 面向对象程序设计面向对象程序设计l面向对象程序设计总结:面向对象程序设计总结:抽象:将对象分类,并总结同类对象的数抽象:将对象分类,并总结同类对象的数据属性和相应代码(函数)据属性和相应代码(函数)封装:将同类对象所属数据及函数封装在封装:将同类对象所属数据及函数封装在一个类中一个类中派生:类复杂时,将许多类的共同属性及派生:类复杂时,将许多类的共同属性及代码用一个公用类(基类)封装,自己类代码用一个公用类(基类)封装,自己类的特有属性及代码用从公用类派生出的派的特有属性及代码用从公用类派
15、生出的派生类封装生类封装第16页,共185页,编辑于2022年,星期二2.2 类与对象的定义类与对象的定义第二章 类和对象第17页,共185页,编辑于2022年,星期二l类是一种用户自定义类型,它是从结构体引申而类是一种用户自定义类型,它是从结构体引申而来:来:structstudentintnum;charname10;intscore;studentstu,stu2;结构体只包括数据,没有操作,结构体成员在结构体只包括数据,没有操作,结构体成员在本作用域中是本作用域中是“敞开敞开”的,使用不受限制的,使用不受限制2.2 类与对象的定义类与对象的定义类类的的引引入入结结构构体体扩扩展展第18
16、页,共185页,编辑于2022年,星期二2.2 类与对象的定义类与对象的定义l结构体成员在任何函数中均可用直接使用结构体成员在任何函数中均可用直接使用格式:格式:结构体变量名结构体变量名.成员名成员名voidmain()/no2.2-1.cpp studentstu;cinstu.numstu.namestu.score;display(stu);voiddisplay(studentstu)coutstu.numstu.namestu.scoreendl;类类的的引引入入结结构构体体扩扩展展第19页,共185页,编辑于2022年,星期二l结构体类型的扩展在定义中加入代码(函数):结构体类型的
17、扩展在定义中加入代码(函数):structstudentintnum;charname10;intscore;voiddisplay()coutnum:numendl;coutname:nameendl;coutscore:scoreendl;2.2 类与对象的定义类与对象的定义数据成员数据成员函数成员函数成员(代码代码)扩展的结构体扩展的结构体student实现了将数据与对此数据进行实现了将数据与对此数据进行的操作封装在一起的功能的操作封装在一起的功能类类的的引引入入结结构构体体扩扩展展数据是内部成员,直接使用数据是内部成员,直接使用第20页,共185页,编辑于2022年,星期二l封装后的结
18、构体仍然开放,所有成员均可直接使用,但封装后的结构体仍然开放,所有成员均可直接使用,但须按格式使用包括函数成员。须按格式使用包括函数成员。voidmain()/no2.2-1A.cppstudentstu;coutstu.numstu.namestu.score;stu.display();l封装后的结构体仍然开放,所有成员均可直接使封装后的结构体仍然开放,所有成员均可直接使用用2.2 类与对象的定义类与对象的定义类类的的引引入入结结构构体体扩扩展展第21页,共185页,编辑于2022年,星期二l为保护专有数据兼顾外界使用,设置访问权限,为保护专有数据兼顾外界使用,设置访问权限,让专有成员只能
19、内部使用,公开成员则任意使用让专有成员只能内部使用,公开成员则任意使用stuctstudentprivate:intnum;charname10;charsex;public:voiddisplay()coutnum:numendl;coutname:nameendl;coutsex:sexendl;2.2 类与对象的定义类与对象的定义私有成员,只能内部使用私有成员,只能内部使用公有成员,外界可以调用公有成员,外界可以调用类类的的引引入入结结构构体体扩扩展展第22页,共185页,编辑于2022年,星期二l设置访问权限后,主函数作为外部,只能使用公有成设置访问权限后,主函数作为外部,只能使用公有
20、成员。员。voidmain()studentstu;coutstu.numstu.namestu.score;stu.display();2.2 类与对象的定义类与对象的定义类类的的引引入入结结构构体体扩扩展展正确:公有函数可以使用正确:公有函数可以使用错误:私有成员不可使用错误:私有成员不可使用第23页,共185页,编辑于2022年,星期二l解决方案:绕弯使用,增加公有成员函数间接使用内解决方案:绕弯使用,增加公有成员函数间接使用内部成员部成员structstudentprivate:intnum;charname10;charsex;public:voidinput()coutnumnam
21、escore;voiddisplay()coutnum:numendl;coutname:nameendl;coutsex:sexendl;类类的的引引入入结结构构体体扩扩展展为外部使用增加的公有函数为外部使用增加的公有函数 前一页 下一页第24页,共185页,编辑于2022年,星期二l主函数通过公有函数主函数通过公有函数input间接使用内部成员间接使用内部成员voidmain()/no2.2-1B.cppstudentstu;stu.input();stu.display();2.2 类与对象的定义类与对象的定义类类的的引引入入结结构构体体扩扩展展注意:必须用注意:必须用“变量名变量名.函
22、数名函数名”的格式使用的格式使用第25页,共185页,编辑于2022年,星期二2.2 类与对象的定义类与对象的定义l总结:总结:通过扩展结构体数据类型,增加函数成员通过扩展结构体数据类型,增加函数成员和访问权限,使结构体实现了面向对象程和访问权限,使结构体实现了面向对象程序设计中的封装序设计中的封装为更好进行面向对象程序设计,将扩展的为更好进行面向对象程序设计,将扩展的结构体类型改造产生新的数据类型结构体类型改造产生新的数据类型类类类和结构体有着相似的结构,但更为复杂,类和结构体有着相似的结构,但更为复杂,功能更加扩展,能够实现更加复杂的面向功能更加扩展,能够实现更加复杂的面向对象的程序设计对
23、象的程序设计类类的的引引入入结结构构体体扩扩展展第26页,共185页,编辑于2022年,星期二l类的一般声明形式:类的一般声明形式:class类名称类名称private:私有数据和成员函数私有数据和成员函数protected:保护型数据和成员函数保护型数据和成员函数public:公有数据和成员函数公有数据和成员函数;类类的的定定义义2.2 类与对象的定义类与对象的定义类关键字类关键字成员定义成员定义访问权限访问权限第27页,共185页,编辑于2022年,星期二2.2 类与对象的定义类与对象的定义l例例:classABCprivate:inta;protected:intb;voidset(in
24、tx,inty,intz)a=x;b=y;c=z;public:intc;voidprint()coutabcendl;l私有成员:变量私有成员:变量al保护成员:变量保护成员:变量b及函数及函数setl公有成员:变量公有成员:变量c及函数及函数print类类的的声声明明形形式式第28页,共185页,编辑于2022年,星期二l公有权限:在关键字公有权限:在关键字public后面声明,是后面声明,是类与外部的接口,任何外部函数都可以访问。类与外部的接口,任何外部函数都可以访问。l私有权限:在关键字私有权限:在关键字private后面声明,后面声明,只只允许本类中的函数访问,而类外部的任何函允许本
25、类中的函数访问,而类外部的任何函数都不能访问。数都不能访问。l如果如果紧跟在类名称的后面声明私有成员,则紧跟在类名称的后面声明私有成员,则关键关键字字private可以可以省略。省略。类类的的访访问问权权限限2.2 类与对象的定义类与对象的定义第29页,共185页,编辑于2022年,星期二l在关键字在关键字protected后面声明后面声明,与,与private类似,其差别表现在继承与派生时对派类似,其差别表现在继承与派生时对派生类的影响不同。生类的影响不同。2.2 类与对象的定义类与对象的定义类类的的访访问问权权限限第30页,共185页,编辑于2022年,星期二classABCinta;pr
26、otected:intb;public:intc;voidset(intx,inty,intz)a=x;b=y;c=z;voidprint()couta=anb=bnc=cendl;注意:内部函数可以使用全部数据成员而外部(如主注意:内部函数可以使用全部数据成员而外部(如主函数中函数中)只能使用公有数据成员只能使用公有数据成员c及公有函数成员及公有函数成员set和和print且必须通过且必须通过对象对象使用使用不不同同权权限限的的成成员员例例 前一页 下一页 休息 休息默认权限为默认权限为private第31页,共185页,编辑于2022年,星期二2.2 类与对象的定义类与对象的定义l类的对象
27、是该类的某一特定实体,即类类的对象是该类的某一特定实体,即类类型的变量类型的变量l定义形式:定义形式:存储类型存储类型类名类名对象名对象名;l举例:举例:ABCd1;l定义的三种方式:定义的三种方式:先定义类,后定义对象;先定义类,后定义对象;定义类的同时,定义对象;定义类的同时,定义对象;无类名,直接定义对象无类名,直接定义对象对对象象的的定定义义第32页,共185页,编辑于2022年,星期二2.2 类与对象的定义类与对象的定义l对象与结构体变量一样,一般不能整体对象与结构体变量一样,一般不能整体使用,只能使用成员使用,只能使用成员l一般格式:一般格式:对象名对象名.成员名成员名上例:如已有
28、定义:上例:如已有定义:ABCd1;则:则:d1.c=28;d1.set(1,2,3);都是正确的对象使用都是正确的对象使用对对象象的的使使用用 定义第33页,共185页,编辑于2022年,星期二2.2 类与对象的定义类与对象的定义l对象的位置在类外,因此不是所有类的对象的位置在类外,因此不是所有类的成员都能通过对象使用,它受到访问权成员都能通过对象使用,它受到访问权限的限制。限的限制。l只有只有public属性的成员可以通过对象在属性的成员可以通过对象在类外使用类外使用例:例:coutd1.cendl;coutd1.ad1.bendl;对对象象的的使使用用 定义第34页,共185页,编辑于2
29、022年,星期二2.2 类与对象的定义类与对象的定义l提醒:类中的成员函数要使用数据成员提醒:类中的成员函数要使用数据成员时不受访问权限的限制时不受访问权限的限制l使用方法:直接使用成员名使用方法:直接使用成员名例:例:ABC类的成员函数类的成员函数set中:中:a=x;b=y;c=z;其中其中a、b是禁止外界使用的私有和保护是禁止外界使用的私有和保护成员,而成员,而c是任意使用的公有成员是任意使用的公有成员对对象象的的使使用用 定义第35页,共185页,编辑于2022年,星期二l例:不同类型成员的使用例:不同类型成员的使用classABCinta;protected:intb;public:
30、intc;voidset(intx,inty,intz)a=x;b=y;c=z;voidprint()couta=anb=bnc=cendl;类类中中成成员员的的访访问问实实例例 前一页 下一页 休息 休息类中访问直接用成员名且不受权限限制类中访问直接用成员名且不受权限限制第36页,共185页,编辑于2022年,星期二voidmain()/no2.2-2.cppintx,y,z;ABCabc;abc.c=10;/类外访问:公有成员直接引用类外访问:公有成员直接引用abc.a=5;abc.b=8;/私有及保护成员不能直接引用私有及保护成员不能直接引用/私有及保护成员只能通过公有成员函数引用私有及
31、保护成员只能通过公有成员函数引用coutxyz;abc.set(x,y,z);abc.print();类中成员的访问方式 前一页 休息 休息 下一页第37页,共185页,编辑于2022年,星期二l成员函数:成员函数:成员函数可是带缺省形参值的函数。成员函数可是带缺省形参值的函数。成员函数可以重载成员函数可以重载成员函数较长时可写在类定义外面成员函数较长时可写在类定义外面此时函数首行形式为:此时函数首行形式为:函数类型函数类型类名类名:函数名函数名(形参表形参表)成成员员函函数数的的特特殊殊性性成员函数的变化成员函数的变化实例实例实例实例1 1实例实例实例实例2 2实例实例实例实例3 3第40页
32、,共185页,编辑于2022年,星期二类的应用举例类的应用举例一圆型游泳池如图所示,现在需在其周围建一圆型一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格为过道,并在其四周围上栅栏。栅栏价格为35元元/米,过道米,过道造价为造价为20元元/平方米。过道宽度为平方米。过道宽度为3米,游泳池半径由键盘米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。输入。要求编程计算并输出过道和栅栏的造价。游泳池过道第51页,共185页,编辑于2022年,星期二类的应用举例类的应用举例l分析:分析:算法:算法:E栅栏造价栅栏造价=单价单价大圆周长大圆周长E过道造价过道造价
33、=单价单价(大圆面积大圆面积小圆面积小圆面积)数据结构:数据结构:E反复进行圆计算,考虑定义圆类反复进行圆计算,考虑定义圆类CirleE数据成员:小圆半径:数据成员:小圆半径:floatradius;大圆半径比小圆固定大大圆半径比小圆固定大3,直接运算,直接运算造价和单价与圆无关不编入圆类造价和单价与圆无关不编入圆类E函数成员函数成员voidInit(floatr):为半径赋值:为半径赋值floatCircumference():求圆周长求圆周长floatArea():求圆面积:求圆面积第52页,共185页,编辑于2022年,星期二#include/no2.2-6.cppconstfloatP
34、I=3.14159;constfloatFencePrice=35;constfloatConcretePrice=20;/声明类声明类Circle及其数据和方法及其数据和方法classCircleprivate:floatradius;public:voidInit(floatr);/赋值函数赋值函数floatCircumference();/圆周长圆周长floatArea();/圆面积圆面积;下一页 前一页 休息 休息第53页,共185页,编辑于2022年,星期二/类的实现类的实现/为数据成员为数据成员radius赋值赋值voidCircle:Init(floatr)radius=r;/计
35、算圆的周长计算圆的周长floatCircle:Circumference()return2*PI*radius;/计算圆的面积计算圆的面积floatCircle:Area()returnPI*radius*radius;下一页 前一页 休息 休息第54页,共185页,编辑于2022年,星期二voidmain()floatradius;floatFenceCost,ConcreteCost;/提示用户输入半径提示用户输入半径 coutradius;/声明声明Circle对象并赋值对象并赋值 CirclePool,PoolRim;Pool.Init(radius);PoolRim.Init(rad
36、ius+3);前一页 下一页 休息 休息第55页,共185页,编辑于2022年,星期二/计算栅栏造价并输出计算栅栏造价并输出FenceCost=PoolRim.Circumference()*FencePrice;coutFencingCostis¥FenceCostendl;/计算过道造价并输出计算过道造价并输出ConcreteCost=(PoolRim.Area()-Pool.Area()*ConcretePrice;coutConcreteCostis¥ConcreteCostendl;运行结果运行结果Entertheradiusofthepool:10FencingCostis¥285
37、8.85ConcreteCostis¥4335.39 前一页 下一页 休息 休息第56页,共185页,编辑于2022年,星期二2.3 组合类组合类第二章 类和对象的定义第57页,共185页,编辑于2022年,星期二2.3 组合类组合类l类中的成员数据是另一个类的对象时称此类为类中的成员数据是另一个类的对象时称此类为组合类组合类l必须用已有对象为组合类中的对象成员赋值必须用已有对象为组合类中的对象成员赋值l使用对象成员时因其在类外,要受访问权限控制使用对象成员时因其在类外,要受访问权限控制类的组合概念第58页,共185页,编辑于2022年,星期二2.3 组合类组合类classPoint/普通类普
38、通类public:voidInit(intxx=0,intyy=0)/设置函数设置函数X=xx;Y=yy;intGetX()returnX;/取取X的值的值intGetY()returnY;/取取Y的值的值private:intX,Y;类的组合举例第59页,共185页,编辑于2022年,星期二classDistance/组合类组合类public:voidSet(Pointxp1,Pointxp2);/设置函设置函数数doubleGetDis();/求距离求距离private:Pointp1,p2;/Point类对象,两端点坐标类对象,两端点坐标doubledist;/两点间距离两点间距离;下一
39、页 前一页 休息 休息形参是其他类对象形参是其他类对象第60页,共185页,编辑于2022年,星期二voidDistance:Set(Pointxp1,Pointxp2)p1=xp1;/同类对象可直接赋值同类对象可直接赋值p2=xp2;/形参对象赋值给成员对象形参对象赋值给成员对象doubleDistance:GetDis()doublex,y;x=double(p1.GetX()-p2.GetX();y=double(p1.GetY()-p2.GetY();dist=sqrt(x*x+y*y);returndist;下一页 前一页 休息 休息现在位置是现在位置是Point类外,须通过类外,须
40、通过对象名使用成员,且只能使用对象名使用成员,且只能使用公有成员函数公有成员函数本类成员直接使用本类成员直接使用第61页,共185页,编辑于2022年,星期二voidmain()/no2.3-1.cppPointmyp1,myp2;myp1.Init(1,1);myp2.Init(4,5);/为为Point类对象赋值类对象赋值Distancemyd;myd.Set(myp1,myp2);/为为Distance类对象赋值类对象赋值coutThedistanceis:;coutmyd.GetDis()endl;下一页 前一页 休息 休息结果为:结果为:Thedistanceis:5第62页,共18
41、5页,编辑于2022年,星期二2.4 构造函数构造函数第二章 类和对象的定义第65页,共185页,编辑于2022年,星期二2.4 构造函数构造函数l构造函数是一种特殊的类成员函数构造函数是一种特殊的类成员函数l构造函数的作用构造函数的作用初始化初始化对象中的数据成员对象中的数据成员l特点:特点:构造构造函数名函数名必须与类名相同。必须与类名相同。构造函数构造函数无返回值无返回值且不必用类型名且不必用类型名void构构造造函函数数概概念念第66页,共185页,编辑于2022年,星期二构造函数举例构造函数举例#include/no2.4-1.cppclassPointpublic:Point(in
42、ta,intb)/构造函数,给对象赋初值构造函数,给对象赋初值X=a;Y=b;voidInit(intinitX,intinitY)/赋值函数,修改对象值赋值函数,修改对象值X=initX;Y=initY;intGetX()returnX;/取取X值函数值函数intGetY()returnY;/取取Y值函数值函数private:intX,Y;构构造造函函数数举举例例函数名与类名相同且无类型名函数名与类名相同且无类型名第67页,共185页,编辑于2022年,星期二2.4 构造函数构造函数l对象定义另一格式:对象定义另一格式:类名对象名(实参表)类名对象名(实参表)例:例:PointP1(1,2)
43、定义对象定义对象P1,且为其两个数据成员,且为其两个数据成员X、Y分别赋初值分别赋初值1和和2l构造函数的调用方法:构造函数的调用方法:创建对象时用户给定实参,创建对象时用户给定实参,由系统自动由系统自动调用调用构构造造函函数数的的调调用用第68页,共185页,编辑于2022年,星期二构造函数举例构造函数举例intmain()PointA(1,2);/定义对象定义对象A,同时系,同时系统自动调用构造函数为统自动调用构造函数为A赋初值赋初值coutA.GetX()tA.GetY()endl;return0;构构造造函函数数举举例例执行结果:执行结果:12第69页,共185页,编辑于2022年,星
44、期二2.4 构造函数构造函数l构造函数可以构造函数可以有参亦可无参有参亦可无参上例:如上例:如X、Y默认初值为默认初值为0,则构造函,则构造函数可为:数可为:Point()X=Y=0;对应对象定义:对应对象定义:PointA注意:不可带实参,也不必带括号注意:不可带实参,也不必带括号构构造造函函数数特特性性第70页,共185页,编辑于2022年,星期二2.4 构造函数构造函数l程序可不定义构造函数,此时系统自程序可不定义构造函数,此时系统自动产生一个动产生一个默认默认的构造函数,为无参的构造函数,为无参空函数。空函数。上例,系统自动定义的构造函数为:上例,系统自动定义的构造函数为:Point(
45、)l构造函数允许为构造函数允许为内联函数内联函数、重载函数重载函数、带默认形参值带默认形参值的函数。的函数。构构造造函函数数特特性性第71页,共185页,编辑于2022年,星期二l实例:定义一个时间类,并测试实例:定义一个时间类,并测试/no2.4-2.cppclassTimepublic:Time();/重载构造函数重载构造函数Time(intNewH,intNewM,intNewS);voidSetTime(intNewH,intNewM,intNewS);/设置时间设置时间voidShowTime();/显示时间显示时间private:intHour,Minute,Second;重重载载
46、构构造造函函数数举举例例2.4 构造函数构造函数第72页,共185页,编辑于2022年,星期二/构造函数的实现:构造函数的实现:Time:Time()Hour=0;Minute=0;Second=0;Time:Time(intNewH,intNewM,intNewS)Hour=NewH;Minute=NewM;Second=NewS;Time:voidSetTime(intNewH,intNewM,intNewS)Hour=NewH;Minute=NewM;Second=NewS;Time:voidShowTime()coutHour:Minute:Secondendl;休息 前一页 下一页第
47、73页,共185页,编辑于2022年,星期二/建立对象时构造函数的作用:建立对象时构造函数的作用:voidmain()Timeb;/调用无参构造函数调用无参构造函数Timec(12,30,0);/调用构造函数,将初始值调用构造函数,将初始值作为实参作为实参b.ShowTime();c.ShowTime();结果为:结果为:0:0:012:30:0 休息 前一页 下一页第74页,共185页,编辑于2022年,星期二2.4 构造函数构造函数l构造函数的另一种形式构造函数的另一种形式构造函数还可用在函数外直接为其成员初始构造函数还可用在函数外直接为其成员初始化的方法为成员赋初值化的方法为成员赋初值成
48、员初始化格式:成员初始化格式:成员名成员名1(形参形参1),成员名成员名2(形参形参2)构造函数另一格式:构造函数另一格式:类名类名(形参表形参表):成员初始化成员初始化例例:上例上例Time类无参构造函数可写为:类无参构造函数可写为:Time():Hour(0),Minute(0),Second(0)构构造造函函数数特特性性第75页,共185页,编辑于2022年,星期二l实例:定义时间类,并测试实例:定义时间类,并测试/no2.4-2A.cppclassTimepublic:Time(intNewH=0,intNewM=0,intNewS=0);voidSetTime(intNewH,int
49、NewM,intNewS);/设置时间设置时间voidShowTime();/显示时间显示时间private:intHour,Minute,Second;带带默默认认值值构构造造函函数数举举例例2.4 构造函数构造函数第76页,共185页,编辑于2022年,星期二/构造函数的实现:构造函数的实现:Time:Time(intNewH,intNewM,intNewS)Hour=NewH;Minute=NewM;Second=NewS;Time:voidSetTime(intNewH,intNewM,intNewS)Hour=NewH;Minute=NewM;Second=NewS;Time:voi
50、dShowTime()coutHour:Minute:Secondendl;休息 前一页 下一页第77页,共185页,编辑于2022年,星期二/建立对象时构造函数的作用:建立对象时构造函数的作用:voidmain()Timeb;/构造函数中使用默认值构造函数中使用默认值Timec(12,30,0);/构造函数中使用形参初始构造函数中使用形参初始化化b.ShowTime();c.ShowTime();结果为:结果为:0:0:012:30:0 休息 前一页 下一页第78页,共185页,编辑于2022年,星期二classsample/no2.4-3.cppinti;public:sample()i=