网站大量收购独家精品文档,联系QQ:2885784924

在构造派生类时基类的不会被自动调用-Read.PPT

在构造派生类时基类的不会被自动调用-Read.PPT

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
在构造派生类时基类的不会被自动调用-Read

两阶段构造和对象销毁 引言 Symbian OS被设计成可以在具有有限内存的设备上很好工作 使用内存管理模型,例如清除栈确保内存不会泄漏,甚至出错和异常发生时,例如没有足够内存来完成一次分配 两阶段构造是一种在Symbian OS代码中广泛使用的模式,它提供了一种使基于堆的对能够象完全构造和初始化的方法,即使是初始化代码可能异常退出 两阶段构造和对象销毁 两阶段构造 了解为什么代码不应当在构造函数内部异常退出 明白两阶段构造用来避免意外创建未定义状态的对象 了解构造函数和第二阶段构造函数ConstructL()的访问说明符在使用两阶段构造的类中被设置为private或者protected,以防止无意中使用 理解如何实现两阶段构造,以及如何构造一个从使用了两阶段构造的基类派生的类 知道Symbian OS中使用两阶段构造的典型类型 (C classes) C++构造函数中的代码不应异常退出 考虑例子: 两阶段构造 两阶段构造将对象构造分成两个部分 不会异常退出的基本C++构造函数 该构造函数将被new操作符调用 它将隐式调用基类的构造函数 它也可以调用不会异常退出的函数,和/或以缺省值或传入构造函数的参数对成员变量进行初始化 两阶段构造 两阶段构造将对象构造分成两个部分 类方法 (典型地,调用 ConstructL()) 一旦分配及构造的对象被压入清除栈则调用该方法 完成对象的构造,并安全地执行可能异常退出的操作. 如果发生了异常退出,清除栈调用析构函数释放所有已经成功分配的资源,并将对象本身申请的内存回收 两阶段构造 将构造函数分开,提供一种更加原子化的异常退出处理方法 为foo分配内存,并安全地置于清除栈中 会异常退出的函数ConstructL 被单独调用 引入 NewL 和NewLC 前面的例子会引入编程错误 一些调用者可能在实例化对象后忘记调用ConstructL() 因为它不是标准C++ 的要求的构造方式 该模式 最好由对象自身调用第二阶段构造函数,还是由调用者调用呢? 显然简单的构造函数不能调用,因为它又回到了调用一个会异常退出函数的原始问题 引入 NewL 和NewLC Symbian OS 模式 将提供了包裹了两阶段构造的静态函数 提供一个简单且容易识别的方法在堆中实例化对象. 该函数典型的叫NewL() 经常也提供NewLC()函数,以使构造的对象遗留在清除栈上 (正如前面清除栈一节中所讨论) 引入 NewL 和 NewLC NewL()和 NewLC 函数是静态的 因此调用它们不需要先有一个类的实例 不会异常退出的构造函数和第二阶段构造函数 ConstructL()已被设置为 private 调用者只能通过NewL()/NewLC实例化类的对象 防止对象被完全构造后重复调用ConstructL() 实现实例 NewL()函数根据NewLC()函数实现,而不是用其他方法 (它们由于需要在清除栈上额外调用PushL(),效率上有些微降低) 注意Symbian OS使用重载操作符new(ELeave) ,它会在无法分配需要数量的内存空间时发生异常退出 意味着调用new(ELeave) 之后不需要检查空指针 从使用两阶段构造的类派生 如果某个类将被继承 其缺省构造函数应当设置为protected而不是private,这样编译器可以构造派生类 C++ 将确保基类中的第一部分构造被优先调用,之后再调用派生类构造函数 两阶段构造不是标准C++构造的一部分 在构造派生类时基类的第二部分不会被自动调用 第二部分构造函数ConstructL() 如果不被派生类调用则设置为private,而如果需要被派生类调用则设置为protected- 在你的代码中注释出来 从使用两阶段构造的类派生 一个类倾向于 保持继承过程中使用两阶段构造的扩展性,典型的模式提供一个保护 (protected) 函数 调用 BaseConstructL() 而不是 ConstructL() 派生类 在自己的ConstructL()函数中调用这个方法确保基类对象完全初始化 讨论点:在构造函数中使用PushL 类的两阶段构造也可以避免 通过在类的C++构造函数的开始位置包含CleanupStack::PushL(this) 这与使用ConstructL() 效果一样 (因为 PushL()总能为以后清除操作安全的存储该指针) 如果这个类将用作基类 任何从它派生的类的构造函数将引发继承体系中每层构造函数调用一个push和pop的负担 这样效率更低 相对于在自己的NewLC()中只进行一次pop和push 对C++最好自动初始化基类,而由开发者在最后派生的类的NewLC()中管理基类的资源分配 两阶段构造和 Symbian OS

文档评论(0)

xiaozu + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档