




已阅读5页,还剩45页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二部分面向对象程序设计 第十一章构造函数和析构函数 11 11 1类与对象 第十一章目录 11 3析构函数 11 2构造函数 11 4带参数的构造函数 11 5重载构造函数 11 6缺省构造函数 第十一章小结 11 7拷贝构造函数 11 8拷贝构造函数的其他用处 c 中构造函数和析构函数是类的特殊成员函数 构造函数用于创建类对象 初始化其成员 析构函数用于撤销类对象 本章介绍构造函数 析构函数 缺省构造函数 拷贝构造函数等相关内容 第十一章构造函数和析构函数 一个类描述一类事物 描述这些事物所应具有的属性 对象是类的一个实例 它具有确定的属性 如学生类与某学生对象 类的名字只有一个 但由该类创建的对象可以任意多个 属于不同类的对象可以在不同时刻 不同环境分别创建或撤销 与定义变量相同 可定义具有不同存储属性的各类对象 定义对象时 c 编译器为其分配存储空间 如果需要 11 1类与对象 例如 下面程序定义了两个类 创建了全局对象和局部对象 静态对象和堆对象 classdesk defineclassdesk public intweight inthigh intwidth intlength classstool defineclassstool public intweight inthigh intwidth intlength deskda globleobjectdastoolsa globleobjectsavoidfn staticstoolss localstaticobjectdeskda localobject voidmain stoolbs localobjectdesk pd newdesk heapobject desknd 50 localarrayofobject deletepd cleanupobjectandreleaseresources 前面已经介绍过变量定义时若未显式初始化 全局变量和静态变量在定义时初值为0 局部变量在定义时初值为随机数 与定义变量不同 一旦建立一个对象 对象通常都需要有一个有意义的初值 c 建立和初始化对象的过程专门由该类构造函数完成 对象建立时 调用该构造函数 给对象分配存储空间并进行初始化 当对象撤销时 调用析构函数作善后处理 11 2构造函数 类创建对象时需要对对象初始化 但初始化任务 只有由成员函数完成 因此 在类中必须定义一个具有初始化功能的成员函数 每当创建一个对象时 就调用这个成员函数 实现初始化 例如 classstudent public voidinit semeshours 100 gpa 3 5 protected intsemeshours intgpa voidfn students s init 调用类的初始化函数 这种将初始化工作交由初始化成员函数完成的方式使系统多了一道处理过程 增加了书写代码 实现的机制并不理想 另一种方法是建立对象的同时 自动调用构造函数 省去上述麻烦 使定义类对象时包含了为对象分配存储空间和初始化的双重任务 这种实现机制较为理想 由于类的唯一性和对象的多样性 因此c 规定构造函数与类同名 其特点是 constructorisafunctionwiththeexplicitpurposeofinitializingobject becausesuchafunctionconstructsvaluesofagiventype itiscalledaconstructor aconstructorisrecognizedbyhavingthesamenameastheclassitself whenaclasshasaconstructor allobjectsofthatclasswillbeinitializedbyaconstructorcall 构造函数的使用方式有 构造函数在类体内定义 例如 includeclassdesk public desk weight 10 high 5 width 5 length 5 protected intweight inthigh intwidth intlength voidfn deskda constructorcall 构造函数可以在类体外定义 例如 includeclassdesk public desk protected intweight inthigh intwidth intlength desk desk constructordefinition weight 10 high 5 width 5 length 5 cout weight high width length endl voidfn deskda voidmain fn 结果 10555 da对象的内存空间分配及初始化 weight high width length da 若将fn 函数改为voidfn deskdd 5 则执行定义数组语句时 构造函数将被调用5次 即对每个数组成员对象的创建都要调用一次构造函数 weight high width length weight high width length dd 0 dd 4 dd 5 对象的内存空间分配及初始化 输出结果为 555105555551055510555 注意 1 类体外定义构造函数 其函数名前要加上 类名 2 构造函数无返回类型 3 在定义时 若类的数据成员是另一个类的对象 则在调用构造函数创建对象时 对作为数据成员的对象先要自动调用其自身的构造函数 下面程序的tutorpair类 帮教派对 中 其成员包含有学生类对象和老师类对象 程序说明了调用构造函数的方法 ch11 5 cpp includeclassstudent public student cout constructingstudent n semeshours 100 gpa 3 5 protected intsemeshours floatgpa classteacher public teacher cout constructingteacher n classtutorpair public tutorpair cout constructingtutorpair n nomeetings 0 protected studentstudent classobjectasmemberdatateacherteacher classobjectasmemberdataintnomeetings voidmain tutorpairtp cout backinmain n 运行结果 constructingstudent constructingteacher constructingtutorpair backinmain 当调用构造函数tutorpair 创建的对象tp时 首先根据对象成员被说明的次序 依次调用student 构造函数和teacher 构造函数创建成员对象student和teacher 然后执行它自己的构造函数的函数体 如运行结果所示 theconstructorisusedtoinitializeobjects anddestructorisusedtocleanupobjectsandreleaseresourcesbeforetheyarebecomeunusable 例如在下面情况下需要使用析构函数 一个对象当结束其生命期时 比如在函数体内定义的对象 当该函数调用结束时 局部对象被释放 构造函数打开一个文件 使用完文件时 需要关闭文件 从堆中分配了动态内存区 在对象消失之前必须释放 11 3析构函数 析构函数的特点 无返回类型 无参数 不能随意调用 不能重载 而构造函数可以有参数 也可以重载 析构函数与构造函数的功能相对应 所以析构函数名是构造函数名前加一个逻辑反运算符 例如 下面程序段在classxyz类中定义了一个构造函数和一个析构函数 classxyz public xyz constructordefinition name newchar 20 xyz destructordefinition deletename protected char name 该类定义的构造函数在对象之外分配一段堆内存空间 撤销时 由析构函数收回堆内存 注意 析构函数以调用构造函数相反的顺序被调用 例如 在ch11 5 cpp程序中为每个类增加析构函数则有 ch11 7 cpp includeclassstudent public student cout constructingstudent n semeshours 100 gpa 3 5 studeng cout destructingstudent n protected intsemeshours floatgpa classteacher public teacher cout constructingteacher n teacher cout destructingteacher n classtutorpair public tutorpair cout constructingtutorpair n nomeetings 0 tutorpair cout destructingtutorpair n protected studentstudent teacherteacher intnomeetings voidmain tutorpairtp cout backinmain n constructingstudent constructingteacher constructingtutorpair backinmain destructingtutorpair destructingteacher destructingstudent 运行结果 不带参数的构造函数不能完全满足初始化的要求 因为这样创建的类对象具有相同的初始化值 如果需要对类对象按不同特征初始化不同的值 应采用带参数的构造函数 如下面程序所示 tdate1 hclasstdate1 public tdate1 inty intm intd tdate1 voidprint 11 4带参数的构造函数 private intyear month day tdate1 tdate1 inty intm intd year y month m day d cout constructorcalled n tdate1 tdate1 cout destructorcalled n voidtdate1 print cout year month day endl include include tdate1 h voidmain tdate1today 2001 5 1 tomorrow 2001 5 2 cout todayis today print cout tomorrowis tomorrow print 结果 constructorcalled constructorcalled todayis2001 5 1tomorrowis2001 5 2destructorcalled destructorcalled 注意 构造函数可采用以下两种方式将值赋给其成员 1 在构造函数体内进行成员变量的赋值 如前例中所示 又如 classx inta b defaultprivatepublic x inti intj a i b j valueassignedwithinconstructor 2 使用函数体前的初始值表 例如 classx inta b public x inti intj a i b j 下面是使用构造函数创建对象 使用析构函数撤销对象的另一个例子 ch11 9 cpp include includeclassstudent public student char pname intxhours intxgpa cout constructingstudent pname endl strncpy name pname sizeof name name sizeof name 1 0 semeshours xhours gpa xgpa student cout destructing name endl 其它成员函数protected charname 20 intsemeshours floatgpa voidmain studentone liming 22 3 5 运行结果 constructingstudentlimingdestructingliming创建对象one的情况如下 学生名 liming name 20 学期学时数22semeshours平均成绩3 5gpa 构造函数可以被重载 c 根据类体中声明构造函数的参数类型和个数选择合适的构造函数 例如 下面程序中声明了4个重载的构造函数 ch11 9 cpp includeclasstdate public tdate tdate intd tdate intm intd tdate intm intd inty 11 5重载构造函数 protected intmonth day year tdate tdate mothe 4 day 15 year 1995 cout month day year endls tdate tdate intd mothe 4 day d year 1996 cout month day year endls tdate tdate intm intd mothe m day d year 1997 cout month day year endls tdate tdate intm intd inty mothe m day d year y cout month day year endls voidmain tdateaday tdatebday 10 tdatecday 2 12 tdatedday 1 2 1998 结果为 4 15 19954 10 19962 12 19971 2 1998 adefaultconstructorisaconstructorthatcanbecalledwithoutsupplyinganargument ifauserhasdeclaredadefaultconstructor thatonewillbeused otherwise thecompilerwilltrytogenerateoneifneeded andiftheuserhasn tdeclaredotherconstructors 11 6缺省构造函数 defaultconstructors 1 c 规定 每一个类必须有一个构造函数 没有构造函数就不能创建任何对象 2 若未定义一个类的构造函数 则c 提供了一个缺省的构造函数 该缺省构造函数是一个无参数的构造函数 仅仅负责创建对象 而不做任何初始化工作 3 只要一个类定义了一个构造函数 c 就不再提供缺省的构造函数 如还需要无参数构造函数 则必须自己定义 4 与变量定义类似 在用缺省构造函数创建对象时 如果创建的是全局对象或静态对象 则对象成员数据全为0 局部对象创建时 其成员数据是无意义的随机数 本章第一个例子中 创建的全局对象 静态对象及局部对象都是由编译器提供的缺省构造函数自动创建的 仅对成员数据分配了内存空间 未做初始化工作 c 中 提供了用一个对象值创建并初始化另一个对象的方法 完成该功能的是拷贝构造函数 例如 tdated1 2002 3 1 tdated2 d1 用构造函数创建d1的值初始化新创建的对象d2 拷贝构造函数的特点 1 拷贝构造函数名字与类同名 没有返回类型 2 拷贝构造函数只有一个形参数 该参数是该类的对象的引用 11 7拷贝构造函数 copyconstructor 3 拷贝构造函数的格式如下 copyconstructordeclaration tpoint cout destructorcalled n intxcoord returnx intycoord returny private intx y tpoint tpoint tpoint voidmain tpointp1 5 7 tpointp2 p1 cout p2 p2 xcoord p2 ycoord endl 结果 copy initializationconstructorcalled p2 5 7destructorcalled destructorcalled 拷贝构造函数除了用于使用已知对象的值创建一个同类的新对象外 还有两个主要用处 1 把对象作为实参数进行函数调用时 系统自动调用拷贝构造函数实现把对象值传递给形参对象 2 当函数的返回值为对象时 系统自动调用拷贝构造函数对返回对象值创建一个临时对象 然后再将这个临时对象值赋给接收函数返回值的对象 例如 下面程序中共创建了7个对象 使用了3次拷贝构造函数 11 8拷贝构造函数的其他用处 include tpoint h tpointfun tpointq voidmain tpointm 12 20 p 0 0 s 0 0 tpointn m p fun n s m cout p p xcoord p ycoord endl cout s s xcoord s ycoord endl tpointfun tpointq cout ok n intx q xcoord 10 inty q ycoord 15 tpointr x y returnr tpoint h includeclasstpoint public tp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 天津医保考试题目及答案
- 支付系统应急响应-洞察及研究
- 2025年公需课专业技术人员的职业发展与时间管理考试题(含答案)
- 2025年高压低压电工证考试题库附答案(含各题型)
- 2025年高级经济师《工商管理》试题及答案
- 2025年高级会计师资格实战演练真题解析与答案
- 旅营体制考试题及答案
- 生活类口语试题及答案
- 运动健康饮食试题及答案
- 财务内部群管理办法
- 泛海煤制60万吨甲醇项目可行性研究报告
- 《复杂世界简单规律》课件
- 性别平等培训讲义
- 大于号小于号等于号田字格描红
- 普通心理学第六版PPT完整全套教学课件
- DISC沟通风格测试
- 大学体育:轮滑教案
- DB31-T 1380-2022 社会消防技术服务机构质量管理要求
- 常见天气系统课件
- 不良资产项目尽调指引
- 深基坑钢板桩支护方案
评论
0/150
提交评论