深度探索C++对象模型第七章 站在对象模型的尖端

原创 2002年07月01日 14:18:00

7.1 Template

Template的“具现“行为 (template instantiation)
编译器看到template的声明,并不做任何的事情,只有等到template instantiation的时候, 定义出一个template class object 或者 template class refrence(引用必须初始化),才会相应的准备template class 内部的数据排放等等,此时在template class 内部声明的static data member 也才会有内存。而仅仅声明一个template class pointer 并不会有template instantion 。
注意: 在template class instantiation的时候,其内部的member functions 并不同时跟着被“实体“化。只有在member functions 被使用的时候, C++ Standard才要求他们被具现出来。原因有二:可能某个程序只使用其中的几个member functions,没有必要为所有的member function 都具现,消耗大量的空间和时间;另外,由于template classs 是generic programming ,所以某些member function 并不是对任何带入的class都是可用的。所以如果我们同时具现所有的member function,往往可能会造成“编译时期的错误“,而恰恰程序中根本就不会使用到该“不合法”的member function。 那么,这些member function何时具现呢?有两种策略:1、在编译的时候 ;2、在链接的时候

Template的错误报告
根据刚才所说,member function 由于在程序中被使用的时候才会局限,所以在template class definition的时候不会检查和类型相关的错误,而只是检查语法词汇错误等与类型无关的错误。
Template中的名称决议方式
在C++ Standard中, "scope of the template definition "--- “定义出template"的程序 ; "scopte of the template instantiation"--- "具现出template"的程序
在template之中, 对于一个nonmember name的决议结果是根据这个name的使用是否与“用以具现该template的参数类型“有关而决定的。如果其使用互不相关,那么使用“scopte of the template declaration"决定其name;如果使用互有关联马么就使用“scope of the template instantiation"来决定name

7.2  异常处理
支持EH,会使那些拥有member class objects 或者base class sunjects的classes的constructor更复杂。一个class 如果被部分构造,则其destructor必须被是性欲哪些已经被构造的subject 或者 member objects身上。  这一段话并不和More Eff上面的第十款相违背。因为这里的member class objects 是在堆栈中创建的,而More Eff条款十讲的是在堆里面为member class pointer分配内存,如何防止"member class pointer"的未及时删除引起的memory leak 。

对Exception Handling的支持
当一个exception 发生的时候,编译器将会完成一下事情:
1、检查发生throw操作的函数;
2、决定throw操作是否发生在try 区段中;
3、若是,则编译系统必须把exception type 拿来和每一个catch子句比较
4、如果比较温和,则程序会交到catch这一区段
5、如果throw 不再try段,或者在try 段,但是没有吻合的catch子句,就会释放active local object,然后移动堆栈指针,到调用者的函数去! 重复2--5

Exception匹配过程中发生的事情可以参考More Eff

7.3  执行期类型识别(RTTI)
千万尽量不要在程序中使用RTTI,参看More EFf
为了支持type_Sage downcast,需要安排一定的空间和时间用于存放和查询某个class object的数据类型。恰好可以和VTable相结合起来。
dynamic_casrt运算符可以在执行期间决定真真的类型,如果downcast指针是安全的,那么这个运算符会传回被适当转型过的指针;如果不安全,则传回0 。而dynamic_cast相当于((type_infor*)(pt->vptr[0]))->_type_descriptor
dynamic_cast运算符也适用于reference,但是dynamic_cast失败,不是返回0,而是抛出异常

另外,还可以利用Typeid运算符,typeid运算符传会一个const reference,类型为type_info。而type_info是一个class,可以在VC的typeinfo.h头文件中找到。
程序:
# include <iostream.h>
#include<typeinfo.h>

class B
{
};

void main()
{
 B *pb= new B;

 cout<<typeid(pb).name()<<endl;
}

深度探索c++对象模型

所谓知己知彼,百战不殆。只有深入了解了c++对象的内存布局,我们才能更熟练运用c++这门语言。 运行环境vs2013一单继承和多继承的结合class C { public: C() :c(1...
  • db199410
  • db199410
  • 2016年06月16日 17:40
  • 372

[读书笔记] 深入探索C++对象模型-第一章《关于对象》

最新在看深入探索C++对象模型(Inside C++ object model),看的同时针对一些之前没有留意或者理解不深的内容整理一下读书笔记,方便之后复习,也希望可以帮助到有同样疑惑的人。 下面是...
  • beyongwang
  • beyongwang
  • 2016年08月21日 21:14
  • 585

深度探索c++对象模型(一)_关于对象

原博客地址:http://www.roading.org//develop/cpp/c对象面面观.html 学习C++应该看过不少关于C与C++的口水贴,以及关于各种对比C与C++效率比较的...
  • A_IIIIIIIII_A
  • A_IIIIIIIII_A
  • 2016年01月04日 11:31
  • 512

《深度探索C++对象模型》读书笔记——关于对象【for_wind】

//整理之,分享之,欢迎指正。for_wind 1、C与C++的区别:       概括来说,C程序中程序性地使用全局数据[注1]。而C++采用ADT(abstract data tpye)或...
  • for_wind
  • for_wind
  • 2014年03月28日 14:08
  • 1383

深入探索C++对象模型 第七章 站在对象模型的尖端

主要探讨的有三个问题:template、异常处理、执行期类型识别 A.       Template 定义一个template(模板定义域) Template Class point{   ...
  • shashafbqc
  • shashafbqc
  • 2014年05月09日 20:24
  • 381

《深度探索c++对象模型》读书笔记(一)

本文以下内容为深度探索c++对象模型的笔记 深度探索c++对象模型是Stanley B Lippman的著作,对c++进行了较深层次的探讨。于我而言,这本书解答了我多年(半年)的疑惑: 虚函数是怎...
  • cover_s
  • cover_s
  • 2016年08月30日 15:51
  • 560

[温故而知新] 《深度探索c++对象模型》——站在对象模型的尖端

前言终于到最后一章啦,准备迎接新的篇章,刚好“霹雳布袋戏”要出新的剧集了,期待ing。这章也是一些零散的知识点。1. 模版的名称决议直接上代码://scope of the template defi...
  • hackooo
  • hackooo
  • 2016年04月13日 22:55
  • 322

深度探索C++对象模型(七)站在对象模型的尖端

如果我们定义一个指针,指向特定的实例,像这样:Point *ptr=0;程序中什么也没有发生。为什么呢?因为一个指向class object的指针,本身并不是一个class object,编译器不需要...
  • Sandeldeng
  • Sandeldeng
  • 2016年10月31日 12:57
  • 175

《深度探索C++对象模型》读书笔记(一)

Lippman早期在贝尔实验室,和C++发明者Bjarne Stroustrup设计了全世界第一套C++编译器cfront,还著有经典的C++入门书[Ensential C++](https://bo...
  • Draco_mystack
  • Draco_mystack
  • 2017年04月18日 22:43
  • 157

《深度探索C++对象模型》:Data语意学

《深度探索C++对象模型》:Data语意学
  • hujingshuang
  • hujingshuang
  • 2016年10月21日 11:34
  • 878
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度探索C++对象模型第七章 站在对象模型的尖端
举报原因:
原因补充:

(最多只允许输入30个字)