您的位置:首页 > 编程语言 > C语言/C++

《深度探索C++对象模型》读书笔记第七章:站在对象模型的尖端

2016-12-31 13:35 260 查看
模板:

对于类来说,只有成员函数在被使用的时候,才会被具现出来。之所以如此,主要有两个原因:
空间和事件的考虑。可能只使用少数成员函数,不需要具现全部。
尚未实现的机能。并不是一个 template 具现出来的所有类型一定能够完整支持一组成员函数所需要的运算符。如果只具现真正用到的成员函数,编译器就能够支持哪些对于其他成员函数可能造成编译错误的类型。(比如T t = 1024,t 或许不是整型)。

template 的命名决议方式,如果类调用内部的函数与类模板的参数类型有关,那么就根据类模板参数类型调用函数,如果无关,就在全局找适配函数。

异常(EH):
        欲支持异常处理,编译器的主要工作就是找出 catch 字句,以处理被丢出来的 exception,这多少需要追踪程序堆栈中的每一个函数的当前作用域(包括追踪函数中的 local class objects 当时的情况)。同时,编译器必须提供某种查询 exception objects 的方法,以知道其实际类型(这政治界导致某种形式的执行期类型识别,也就是 RTTI)。最后,还需要某种机制管理被丢出的 object,包括它的产生、储存、可能的析构(如果有的话)、清理(clean up)以及一般存取,也可能有一个以上
object 同时起作用。一般而言, exception handling 机制需要编译器产生的数据结构以及执行器的一个 exception library 紧密合作。在程序大小和执行速度之间,编译器必须有所抉择:

为了维持执行速度,编译器可以在编译期建立起用于支持的数据结构,这会使程序膨胀的大小,但编译期几乎可以忽略这些结构,直到有个 exception 被丢出来。
为了维护程序大小,编译器可以在执行期建立用于支持的数据结构。这会影响程序的执行速度,但意味着编译器只有在必要的时候才建立哪些数据结构(并可以抛弃之)。

为什么 catch 子句的异常声明通常被声明为引用?
可以避免由异常对象到 catch 子句中的对象的拷贝,特别是对象比较大时。
能确保catch子句对异常对象的修改能再次抛出。3
确保能正确地调用与异常类型相关联的虚拟函数,避免对象切割。

异常对象的生命周期?
产生:throw className()时产生。
销毁:该异常的最后一个catch 子句退出时销毁
注意:因为异常可能在catch子句中被重新抛出,所以在到达最后一个处理该异常的catch 子句之前,异常对象是不能被销毁的。

RTTI:

RTTI 只支持多态类,也就是说没有定义虚函数是的类是不能进行 RTTI的。
对指针进行dynamic_cast失败会返回NULL ,而对引用的话,识别会抛出bad_cast exception。
typeid 可以返回const type_info&,用以获取类型信息。

推荐博客:《深度探索C++对象模型》笔记汇总

后记:这本书看了两遍,终于看完了。现在再回头,我是从 23 号开始读这本书,基本上天天都在看,今天 31 号,竟然花了 8 天,恐怖。不过这本书给我带来的收获很大,让我对面向对象认识更加清晰了,以后写面向对象编程肯定不会因为编译不通过经常百度了吧,哈哈 :)

不过,最近一直考试,我都没复习,一直在看这本书,所以,唉,祝我好运吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息