读完C++对象模型书后,做一个笔记整理
第一章-关于对象
第二章-构造函数语义学
第三章-Data语义学
第四章-Function语义学
第五章-构造拷贝解析语义学
第六章-执行期语义学
第七章-在对象模型的尖端
template
- 编译器看到template class声明时什么也不会做。必须经过具现后才能使用其中变量。
- 若声明一个template class具现类型的指针后,也是什么也没有。因为指针不需要触发对象的具现。
- 如果一个virtual function 被具现出一其具现点紧跟在其class具现点之后
异常处理
-
throw语句会抛出内建类型或自定义类型的异常
-
catch子句用于处理某种类型的异常,在大括号中提供处理程序
-
try子句包含着可能抛异常的代码
-
异常触发后,控制权会从函数调用中被释放,此时堆栈中每个调用函数都将推离unwinding the stack,推离前局部对象变量会析构。随后进行到程序栈的下一个函数中去继续运行。
-
在异常触发后,若之前有资源的加锁操作,并不会自动释放。需手动处理,或利用局部对象的析构来自动完成资源锁的释放。
Runtime Type Identification RTTI
- RTTI对那些展现多态的类型有效,一般是在虚函数表中第一个位置放置指向RTTI的指针
- 对于指针可以 xx* ptr= dynamic_cast<xx*>(tmp);返回0则代表转换失败,非0为成功。
- 对于引用fct& rf=dynamic_cast<fct&>(rt);若失败会抛出bad_cast_exception的异常
- 对于内建类型和非多态类型type_info是静态取得,而非执行期获得。且是在需要时才产生。
在DLL变化后,二进制不兼容会要求必须重新编译使用者代码
如果DLL中含有虚函数,则除非每次DLL都被加载到相同内存位置(实际位置由runtime linker决定),否则虚函数将引发各种问题。因为在调用者代码中vtb中的虚函数地址是固定的。
下一篇 第一章-关于对象