c++之对象的初始化与销毁构造函数与析构函数ppt课件

上传人:钟*** 文档编号:4964813 上传时间:2020-01-15 格式:PPT 页数:17 大小:484KB
返回 下载 相关 举报
c++之对象的初始化与销毁构造函数与析构函数ppt课件_第1页
第1页 / 共17页
c++之对象的初始化与销毁构造函数与析构函数ppt课件_第2页
第2页 / 共17页
c++之对象的初始化与销毁构造函数与析构函数ppt课件_第3页
第3页 / 共17页
点击查看更多>>
资源描述
第四章对象的初始化与销毁 构造函数与析构函数 本章主要内容 1 构造函数 拷贝构造函数 重点2 构造函数的初始化列表 重点 难点3 析构函数 重点 总体要求 理解构造函数与析构函数的必要性与特殊性 掌握它们的使用方法 1 1对象的初始化 1 成员变量全部公有时的初始化类的成员变量都是公有的 此时对该类对象的初始化可以与C中对结构体变量的初始化一样 classperson public charname 15 intage addressaddr classaddress public longtelenum charaddr 30 personp1 张三 23 8911114 LanZhouUniversity 缺点 数据完全外露 没有实现信息隐藏 实质是对象中成员变量的初始化 有3种常见方法 2 2 使用公有的成员函数完成对象的初始化 在类中提供公有的成员函数 对象通过调用这样的成员函数对其内部的成员进行初始化 例 银行帐户类 classAccount charsName 32 charsID 20 floatfBalance public voidInitialze char char float voidAccount Initialize char name char id floatamount strcpy sName name strcpy sID id fBalance amount voidmain Accountacc acc Initialize 张三 s9801 1000 缺点 客户程序员容易忘记调用这样的函数 对象的初始化得不到保障 3 3 构造函数 constructor 构造函数是类中特殊的成员函数 其函数名与类名相同创建对象时系统自动调用构造函数创建对象的两种方法 定义类类型的变量 用new运算符动态产生对象无论用那种方法 都会自动调用构造函数 不是由客户程序员人为调用 而是自动调用 例 银行帐户类 日期类 把给成员变量赋初值的操作写在构造函数中 就能初始化成员变量 对象一旦被创建 马上调用构造函数 在能对对象进行其它操作之前 对象的成员变量已具有确定的值 4 构造函数的特殊性与必要性 例 DatedtObj 2004 10 11 Date pDtObj newDate 2004 10 12 DatedtObjDft Date pDt newDate 5 构造函数的特殊性与必要性 续 类中未显式提供构造函数时 C 会自动添加一个默认构造函数 该构造函数不带有形参 且函数体为空 在后台起作用 若类中显式提供了构造函数 则不再添加默认构造函数使用默认构造函数的情况下 若创建的对象是全局对象或静态对象 则成员变量的值全部被置为相应类型的0值 否则成员变量的值不确定应尽可能提供自己的构造函数 而不使用默认的构造函数 6 2拷贝构造函数 copy constructor 一种特殊的构造函数创建对象时 用一个已经存在的对象对新创建的同类对象进行初始化 此时要求构造函数的参数为自身类类型的引用 这种构造函数称为拷贝构造函数 拷贝构造函数的一般形式为类名 类名 const 类名其中const是可选的 例 拷贝构造函数 classA public A int cout A endl A constA voidmain Aa 1 Ab a Ac b 7 拷贝构造函数调用的时机 用已经存在的对象初始化新创建的对象时 调用拷贝构造函数 例 Location类 对象做形参 调用函数时用实参对象初始化形参 调用拷贝构造函数 voidf Locationp cout Functin p getX p getY endl 推荐使用对象的引用做形参 可降低函数调用过程中的开销 函数返回对象 此时要通过拷贝构造函数创建临时对象 Locationg LocationA 1 2 returnA 8 浅拷贝与深拷贝 类中未显式提供拷贝构造函数时 C 会自动添加一个默认拷贝构造函数 该拷贝构造函数完成位对位的拷贝 亦即将已存在对象中的每一位复制到新创建的对象中对应的位 亦即将已存在对象中的每个成员拷贝到新建对象中对应的成员 此时称完成的拷贝是浅拷贝默认的拷贝构造函数在一般情况下可以很好地工作 但一些特殊情况下 仅使用默认的拷贝构造函数可能会引起问题 此时必须提供自己的拷贝构造函数并按需要自己完成拷贝工作才能解决问题 称这时完成的拷贝是深拷贝 例 内部包含指针成员变量的类 浅拷贝 深拷贝 例 自动记录本类对象数目的类 浅拷贝 深拷贝 9 3构造函数的初始化列表 类的成员变量是const的或是另外一个类的对象时 对其进行初始化 需要在定义构造函数时使用初始化列表 初始化列表的一般形式类名 类名 形参列表 成员变量名1 初始值列表 成员变量名n 初始值列表 函数体 10 一 const的成员变量 对简单类型的非静态成员变量初始化 既可以在构造函数的函数体中对其赋值 也可以使用初始化列表 Fred cppFred Fred size 0 x 0 Fred Fred intsz intxx size sz x xx voidFred Print cout size endl Fred hclassFred constintsize intx public Fred Fred intsz intxx voidPrint 对const成员变量初始化 只能通过构造函数的初始化列表进行 而不能在函数体中赋值 Fred Fred intsz intxx size sz x xx 11 二 成员变量是另一个类的对象 把作为成员变量的对象称为成员对象或内嵌对象 而把包含该成员对象的类称为外围类 例 Circle类 其中Circle类是外围类 而成员变量ptCenter是成员对象或内嵌对象 成员对象的初始化只能通过外围类的构造函数的初始化列表 调用成员对象本身的构造函数来进行若成员对象所属的类有多个构造函数 则通过外围类构造函数的初始化列表调用参数类型 数目均能匹配的一个 若调用成员对象的不带参数的构造函数 则初始化列表中可以省略对该构造函数的显式调用 此时由系统自动调用有多个成员对象时 每个成员对象都必须出现在初始化列表中 且它们的构造函数的调用次序与在初始化列表中出现的次序无关 只取决于在类中定义它们时的次序先调用成员对象的构造函数 然后执行外围类的构造函数的函数体 12 4对象的撤销 析构函数 对象的生命期结束时系统要撤销对象 除了回收对象本身占据的存储空间以外 还需做一些清理工作如撤销一个链表对象 除了释放链表对象本身占据的存储空间外 还需要释放链表上结点的存储空间C 中 类或对象的析构函数用来完成这个任务 析构函数析构函数是类的一个特殊成员函数 其函数名是类名前冠以 其一般形式为 类名 类名 13 例 自动记录本类对象数目的类 classCCountObj staticintcount intnum public CCountObj CCountObj constCCountObj intCCountObj count 0 CCountObj CCountObj count num count CCountObj CCountObj constCCountObj 14 例 链表类 LinkList hclassLinkList private structNODE charch structNODE next head public LinkList LinkList boolInsert int char boolDelete int boolDelete char voidDisplay LinkList cpp 此处省略其它函数定义LinkList LinkList NODE pWork while head NULL pWork head head head next deletepWork 15 说明 定义和声明析构函数时 不能说明析构函数的返回值类型 析构函数不返回任何值析构函数不带有任何参数 一个类只能有一个析构函数 析构函数不能被重载类中未显式提供析构函数时 编译器会自动添加一个析构函数撤销对象时系统自动调用析构函数撤销对象的两种情况 1 对象的生存期结束2 使用delete运算符释放new动态生成的对象两种情况下都会自动调用对象的析构函数析构函数不能由客户程序员显式调用 16 本章总结 各种对象的构造函数与析构函数的调用时机 全局对象程序流程进入main 函数之前按定义对象的顺序调用构造函数 程序运行结束时按相反的顺序调用析构函数 局部对象调用包含该局部对象的函数时按定义对象的顺序调用构造函数 生命期结束时调用析构函数 静态局部对象直到程序运行结束时调用析构函数 析构函数的调用顺序与构造函数的顺序正好相反 成员对象创建外围对象时使用初始化列表调用成员对象的构造函数 且先调用成员对象的构造函数 再执行外围对象的构造函数体 外围对象撤销时调用成员对象的析构函数 但先执行外围对象的析构函数体 再调用成员对象的析构函数 析构函数的调用顺序与构造函数的调用顺序完全相反 17
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 压缩资料 > 基础医学


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!