




已阅读5页,还剩45页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机程序设计 第10章类与对象 2 主讲 杨振平E mail zpyang 2011 2012第2学期 构造函数析构函数对象与指针 授课内容 10 1构造函数 构造函数 类中特殊的成员函数 创建对象并初始化对象 声明格式 定义格式 成员名 初值 例1带有构造函数的日期类 将对象的成员初始化为1900 1 1 classDate intday month year public Date 构造函数声明voidinit int int int 对数据成员赋值voidprint ymd voidprint mdy Date Date 构造函数定义 year 1900 month 1 day 1 在创建对象时 为对象提供确定的初值 1900 1 1 voidDate init intyy intmm intdd year yy month mm day dd 在对象创建后 可以修改对象的数据值 intmain Datedate1 创建1个日期类对象date1 print ymd 输出对象的初始值date1 print mdy date1 init 2011 5 10 改变date1数据值date1 print ymd date1 print mdy return0 输出结果 1900 1 11 1 19002011 5 105 10 2011 创建date1对象时 系统自动访问Date类的构造函数 为date1的三个数据成员进行初始化 例2带有构造函数的日期类 对象成员的初值由用户自定义 classDate intday month year public Date int intint 构造函数声明voidinit int int int 对数据成员赋值voidprint ymd voidprint mdy Date Date intyy intmm intdd 构造函数定义 year yy month mm day dd 在创建对象时 由用户提供初值例如 intmain DateDate1 2011 11 7 Date1 print ymd Date1 init 2011 11 8 Date1 print mdy return0 intmain inty m d cin y m d DateDate1 y m d Date1 print ymd cin y m d Date1 init y m n Date1 print mdy return0 一 对象初始化 类的数据成员不能在声明时初始化如 classDate intday 1 intmonth 1 intyear 1900 类的私有和保护成员必须通过构造函数进行初始化 类中未定义构造函数时 系统会使用一个默认的构造函数创建对象 这时对象成员的初值是不确定的 默认构造函数格式 类名 void 如果一个类所有的成员都是公有的 在定义对象时可以直接进行初始化 如 classDate public intday intmonth intyear voidinit int int int 对数据成员赋值voidprint ymd voidprint mdy Dated1 8 5 2012 一 对象初始化 续 重载的构造函数中 其参数个数或类型必须有区别 二 构造函数的重载 例2定义带有重载构造函数的日期类 classDate intday month year public Date 构造函数Date int int int 构造函数voidinit int int int voidprint ymd voidprint mdy Date Date year 1900 month 1 day 1 Date Date intyy intmm intdd init yy mm dd voidDate init intyy intmm intdd month mm day dd year yy intmain 使用2个不同的重载构造函数创建2个日期类对象Datedate1 date2 2011 5 10 自动访问构造函数date1 print ymd date2 print ymd date1 init 2011 5 14 修改date1的日期date1 print ymd date2 init 2011 5 15 修改date2的日期date2 print ymd return0 结果 1900 1 1 2011 5 10 2011 5 14 2011 5 15 三 构造函数中数据初始化的其它形式 1 在构造函数的函数体中初始化 2 在构造函数的头部初始化 3 混合初始化4 使用默认参数初始化 1 在构造函数的函数体中初始化 Date Date intyy intmm intdd year yy month mm day dd 例如 创建对象Datedate1 2011 5 10 2 在构造函数的头部初始化 例如 Date Date intyy intmm intdd year yy month mm day dd 例如 Date Date intyy intmm intdd month mm day dd year yy 3 混合初始化 4 使用默认参数初始化 Date intyy 1900 intmm 1 intdd 1 year yy month mm day dd 例如 创建对象Datedate1 Datedate1 2011 Datedate2 2011 5 Datedate3 2011 5 8 四 拷贝构造函数 声明格式 类名 类名 Date Date Date 使用一个已有初值的对象初始化另一个对象如 Datedate1 2011 5 15 date2 date1 注意 多数情况下 用户可以不定义拷贝构造函数 因为系统自动创建的默认的拷贝构造函数足以完成将一个对象的各个成员复制到另一个对象中 例 classDate intday month year public Date year 1900 month 1 day 1 Date intyy intmm 1 intdd 1 带默认参数的声明格式Date Date 例3构造函数中数据成员初始化的不同方法 其中带有默认参数的构造函数Date intyy intmm 1 intdd 1 定义如下 Date Date intyy intmm intdd year yy month mm day dd 注意 成员函数在声明时已带默认参数 则函数定义中默认参数不能重复 阅读理解 构造函数的定义及作用 类中带有拷贝构造函数 使用拷贝构造函数 该例去掉拷贝构造函数后 运行结果不变 10 2析构函数 析构函数 执行与构造函数相反的操作 通常用于释放对象的内存空间 声明格式 类名 析构函数名 类名该函数无返回值类型无参数 定义格式 类名 类名 classA private longnum char name charsex intage public A longNum char Name charSex intAge voidshowA A A longNum char Name charSex intAge num Num name newchar strlen Name 1 strcpy name Name sex Sex age Age 分析程序 intmain As1 100001L WANGDAHAI f 20 s1 showA return0 voidA showA cout num name sex age endl 程序能执行 结果也正确 但对象s1中动态分配的空间 系统通常不能自动释放 定义析构函数可以达到释放对象全部空间的目的 A A cout A 析构被调用 endl deletename 在A类中 添加如下析构函数 大多数情况下 用户可以不定义析构函数 因为系统自动创建的默认的析构函数足以完成释放对象内存空间的功能 Person 析构函数 多个对象释放时 释放顺序与创建顺序相反 即先创建的对象后释放 系统会自动访问析构函数释放对象 例4分析Person类中析构函数的作用 classPerson private charName 20 intAge charSex public Person 构造函数 Person 析构函数voidRegister char name intage charsex voidShowMe Person Person 构造函数 strcpy Name XXX Age 0 Sex m Person Person 析构函数 cout NowdestroyingtheinstanceofPerson Name endl voidPerson ShowMe cout Name t Age t Sex endl voidPerson Register char name intage charsex strcpy Name name Age age Sex sex intmain Personperson1 person2 使用不带参数的构造函数创建对象cout person1 t person1 ShowMe person1 Register 张三 19 m cout person1 t person1 ShowMe cout person2 t person2 ShowMe person2 Register 李四 19 m cout person2 t person2 ShowMe return0 10 3对象与指针 一 指向对象的指针类名 指针变量名 例 Personperson1 Person ptr 例5对象动态存储分配与释放 intmain Person p1 声明指向对象的指针p1 newPerson 动态生成一个Person对象 同时自动访问构造函数coutShowMe p1 Register 张三 19 m coutShowMe deletep1 释放p1指针指向对象所占的空间 同时自动访问析构函数return0 三 指向对象成员的指针1 指向对象中数据成员的指针例 classDate public 公有部分intyear month day voidinit intyy intmm intdd voidprint ymd 定义指向int成员的指针 Datedate1 定义Date对象date1int p 定义指针变量pp 2 指向成员函数的指针定义格式 返回值类型 类名 指针变量名 参数表 指针赋值格式 指针变量名 类名 成员函数名 例 Datedate1 void Date p int intint p Date init 指向有3个形参 无返回值的成员函数 date1 p 2009 5 15 调用date1中p所指的成员函数 四 this指针每个成员函数中都有一个隐含的指向本类对象的指针变量 this 它接受调用该成员函数对象的地址 通过this能获得对象的数据成员和成员函数 例 Date类中的voidinit intyy intmm intdd 相当于 voidinit Date this intyy intmm intdd voidDate init intyy intmm intdd month mm day dd year yy this month mm this day dd this year yy 例 执行语句date1 init 2009 5 8 相当于执行date1 init 例 classDate intyear month day public Date intyear intmonth intday print ymd voidDate Date intyear intmonth intday this year year this 不能省略this month month this 不能省略this day day this 不能省略 下例中应恢复this指针 例 演示this指针的使用方法 classTest 声明Test类 intx public Test int 0 voidprint Test Test inta x a 定义成员函数voidTest print coutx x n this x this x endl intmain 测试主函数 TesttestObject 12 testObject print return0 输出结果 x 12this 12 this x 12 程序设计举例 例10 8简单的日期计算程序功能 给定的一个日期 计算出增加若干天后的日期 算法设计 定义一个日期类Date 数据成员 year month day 适当增加一些成员函数 如构造函数 日期设置函数 输出函数 日期增加一天的函数 日期增加任意天的函数 判断闰年的函数 判断月末的函数等 classDate intday month year voidIncDay 日期增加一天public Date inty 1900 intm 1 intd 1 构造函数voidSetDate intyy intmm intdd 日期设置boolIsLeapYear 是否闰年 boolIsEndofMonth 是否月末 voidprint ymd 输出日期yy mm ddvoidprint mdy 输出日期mm dd yyvoidAddDay int 日期增加任意天 日期类Date 私有成员数据和成员函数 公有成员函数 Date Date inty intm intd SetDate y m d voidDate SetDate intyy intmm intdd month mm 1 构造函数 设置日期初值函数 switch month case4 case6 case9 case11 day dd 1 boolDate IsEndofMonth switch month case4 case6 case9 case11 returnday 30 case2 if IsLeapYear returnday 29 elsereturnday 28 default returnday 31 判断月末成员函数 voidDate IncDay if IsEndofMonth if month 12 年末 day 1 month 1 year else 月末 day 1 month elseday voidDate AddDay intdays for inti 0 i days i IncDay 增加一天成员函数 增加任意天成员函数 intDate DayCalc intdays intyy year 1900 days yy 365 if yy days yy 1 4 switch month case12 days days 30 case11 days days 31 case10 days days 30 case9 days days 31 case8 days days 31 case7 days days 30 case6 days days 31 case5 days days 30 case4 days days 31 case3 if IsLeapYear days days 29 elsedays days 28 case2 days days 31 default break days days
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 出版工作发言稿
- 2013.1.13法律逻辑学试题及答案(经典)
- 林场护林员培训
- 夏季高温防暑培训
- 二零二五版建筑工程设计施工一体化转让合同
- 2025版节能建筑瓷砖供货与绿色生活推广合同
- 2025版离婚后共同财产分割子女抚养及财产分割协议
- 2025版文化艺术交流活动组织服务合同模板
- 二零二五版科技研发资源共享服务合同
- 二零二五年度电商跨境电商支付与清算培训合同
- 2025年云南省事业单位招聘考试综合类专业能力测试试卷(工程类)难点解析
- 2025年秋期人教版2年级上册数学核心素养教案(第6单元)(教学反思有内容+二次备课版)
- 2025内蒙古西部天然气蒙东管道有限公司招聘20人笔试参考题库附带答案详解(10套)
- 2025店铺租赁合同协议书下载
- 2025年国企财务招聘笔试题和答案(基础知识测试题)
- 9型人格培训课件
- 2025年银行安全保卫知识考试题库(含答案)
- 曲靖市商务局招聘公益性岗位人员考试真题2024
- 2025年青岛市中考英语试卷(含答案解析)
- 投资评价管理办法
- 达州水务集团有限公司员工招聘考试真题2024
评论
0/150
提交评论