Chinaunix首页 | 论坛 | 博客
  • 博客访问: 295534
  • 博文数量: 148
  • 博客积分: 4365
  • 博客等级: 上校
  • 技术积分: 1566
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 21:38
文章分类
文章存档

2014年(2)

2013年(45)

2012年(18)

2011年(1)

2009年(54)

2008年(28)

我的朋友

分类: C/C++

2009-09-24 09:35:15

 一 C++对象模式
  C语言对于程序员的吸引就在于精瘦和简易(leanness and its relative simplicity.)毕竟C++中的封装概念和模板等对于新手有些苦难。
  C++中的类成员函数虽然声明在类(class)中,但却不在对象(object)中,每个非内联函数只会诞生一个函数实体,每个拥有0个或1个定义的内联函数会在其每一个使用者上产生一个函数实体。C++中的布局和存取时间上的额外开销(primary layout and access-time overheads )主要是由virtual引起的,包括(1)virtual funtion机制,支持动态绑定。(2)virtual base class,使多次出现在继承体系中的基类只有一个单一共享的实体。
  类成员有两种:static和nonstatic。成员函数有三种:static,nontatic和virtual。
  C++对象模型中nonstatic数据成员被置于每个object内,static数据成员则放在所有object之外;static和nontatic成员函数也放在素有object之外,virtual函数则以下面的虚函数表支持:
(1)所有指向虚函数的指针被放在一张表里,此表称为virtual table(vtbl)
(2)每一个含有虚函数的class object内添加一个指针,指向其vtbl,通常称此指针为vptr,它的 setting和resetting都由每个class的constructor,destructor和copy assignment运算符自动完成,每一个class所关联的type_info object(RTTI中需要用到),也经由virtual table指出,通常放在表的第一个slot处。

二 关键词的差异。(提到在第三章会有详细探索)
  C中,把一个数组放在结构体的尾端,该数组可通过动态申请内存拥有可变长度
  C++中,却有差异,首先含有多个access section,可能由基类派生而来,再或含有一个或多个虚函数。
处于一个access section 的数据成员可以保证其按照声明顺序出现在内存布局中,但多个access section中的成员排列顺序就不一定了。故上述C中的技巧或许可用或许不可以用。

三 对象的差异
  C++通过以下方法支持多态:
(1)隐式转换,把一个derived class指针转化为一个纸箱其public base type 的指针
    base *bp = new derived();
(2)virtual function机制
    bp->function();
(3)dynamic_cast和typeid运算符

  多态主要用于经由一个共同接口来影响类型的封装,此接口通常定义在抽象的 base class中。 
  一个class object 需要多少内存取决于:1. nonstatic数据成员总和的大小。 2.边界补齐所填充的空间。 3.支持virtual机制带来额外负担。


阅读(536) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~