深度探索C++对象模型___小张大肝第七章 11月9号 结束!!!

7.1 Template

模板的实例化行为

  • 成员函数(至少对于那些未被使用过)不应该被实例化,只有在成员函数被使用的时候,C++ Standard 才要求它们被实例化。

    • 空间和时间效率的考虑
    • 尚未实现的功能
  • 函数什么时候实例化:在编译的时候,在链接的时候。

  • 声明一个指针指向某个模板类,这件事情并未被强制定义,编译器可以自己决定要不要将模板实例化。

  • 若是引用则模板会被实例化,因为引用并不是无物的代名词。

模板的错误报告

  • 所有与类型有关的检验,如果牵涉到类型参数,都必须延迟到真正的实例化操作发生,才得为之。
  • 模板的声明被收集成一系列的词法标记,而parsing操作延迟直到有实例化操作发生时才开始。每当看到一个instantiation发生,这组token就被推往parser,然后调用类型检验。
  • cfront对模板的处理是完全解析但不做类型检验,只有在一个实例化操作发生时才做类型检验。所以在一个parsing策略下,所有词汇错误和解析错误都会在模板声明的过程中被标示出来。

模板中的名称决议法

  • 模板之中,对于一个nonmember name的决议结果,是根据这个name使用是否与用以实例化该模板的参数类型有关而决定的。如果其使用互不相关,那么就以scope of the template declaration 来决定name。如果其使用互有关联,那么就以scope of the template instantiation 来决定name的。

7.2 异常处理

  • C++的异常处理由三个主要的词汇组件组成

    • 一个throw子句:它在程序的某处发出一个异常,被抛出的异常可以是内建类型,也可以是使用者自定类型。
    • 一个或多个catch子句:每一个catch子句都是一个exception handler。它用来表示,这个子句准备要处理某种类型的异常,并且在封闭的大括号区段中提供实际的处理程序。
    • 一个try区段:它被围绕以一系列的叙述句,这些叙述句可能引发catch字句起作用。
  • 当一个异常被抛出之后,控制全会从函数调用中被释放出来,并寻找一个吻合的catch子句。如果都没有吻和者,那么默认的处理例程terminate()会被调用,当控制权被放弃之后,堆栈中的每一个函数调用也就被推离。这个程序称为unwinding the stack 。在每一个函数被推离堆栈之前,函数的局部类对象会被调用。

  • 当一个异常发生时,编译器需要做以下事情:

    • 检验发生throw发生的函数
    • 决定throw操作是否发生在try区段中
    • 若是,编译系统必须把异常类型拿来和每一个catch子句进行比较
    • 如果比较后吻合,流程控制应该交到catch子句中
    • 如果throw的发生并不在try区段中,或没有一个catch子句吻合,那么系统
      • 摧毁所有的active local object 子对象
      • 从堆栈中将目前的函数unwind掉
      • 进行到程序堆栈的下一个函数中去,然后重复2~5

7.3 执行期类型识别

保证安全的向下转换操作

  • 欲支持安全的向下转型操作,在对象的空间和执行时间上都需要一些额外的负担

    • 需要额外的空间以存储类型相关信息,通常是一个指针,指向某个类型的信息节点。
    • 需要额外的时间以决定执行期的类型,因为正如其名所示,这需要在执行期才能决定。
  • C++的RTTI机制提供了一个安全的downcast设备,但只对那些表现多态的类型有效,一个具备多态性质的类,正是内含着继承而来的虚函数。把与类相关的RTTI对象的地址放进虚表的第一个节点。

保证安全的转换动作

  • dynamic_cast 运算符可以在执行期决定真正的类型,如果dynamic时安全的,这个运算符会传回被适当转换过的指针,如果downcast是不安全的,这个运算符回传会0。(dynamic_cast 运算符施行于指针身上)
  • dynamic_cast 运算符施行于引用时
    • 如果引用真正参考到派生类对象身上,downcast会被执行而程序可以继续进行
    • 如果引用并不真正是一种派生类对象,那么由于不能够传回0,因此抛出一个异常。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值