深入探索C++对象模型笔记一 —— 关于对象(上)
2011-05-19 21:46
381 查看
开篇就面向过程的C语言的体系进行了讲解,在C语言中,“数据”和“操作(函数)”是分开声明的。语言本身没有支持“数据和函数”之间的关联性。
在C++中,使用的是“抽象数据类型(ADT)”或“类层次的数据封装”。从软件工程的角度来看,C++威力更大。
C++加上封装后的布局成本:
c++在布局以及存取时间上主要的额外负担是由virtual引起的。包括:
Virtual function 机制 。用以支持一个有效率的“执行期绑定”(runtime binding)。
Virtual base class。用以实现“多次出现在继承体系中的base class,有一个单一而共享的实体”。
此外,还有一些多重继承下的额外负担。发生在“一个derived class和其第二或后继之base class的转换”之间。
C++对象模式:
在C++中,有两种class data members : static 和 nonstatic
有三种class member functions: static 、nonstatic 和 virtual
提出了几种模型原型:简单对象模型,表格驱动对象模型。
C++对象模型:
nonstatic data members 被配置与每一个 class object 之内,static data members 则被存放在所有的 class object之外
static 和 nonstatic function members 也被放在所有的 class object 之外
virtual function 则以两个步骤支持:
(1)每一个 class 产生出一堆指向 virtual functions 的指针,放在表格之中,这个表格被称为 virtual table(vtbl)
(2)每一个 class object 被添加了一个指针,指向相关的 virtual table,通常这个指针被称为 vptr。(vptr的设定和重置都由每一个 class 的 constructor、destructor 和 copy assignment 运算符自动完成。)
模型主要优点:空间和存取时间的效率
模型主要缺点:如果应用程序代码本身未曾改变,但所用到的class objects的nonstatic data members有所修改(可能是增加,移除或更改),那么那些应用程序代码同样得重新编译。(相对双表格模型来说,双表格模型提供了较大的弹性,因为它多提供了一层间接性,但是它因此也付出空间和执行效率两方面的代价)
在C++中,使用的是“抽象数据类型(ADT)”或“类层次的数据封装”。从软件工程的角度来看,C++威力更大。
C++加上封装后的布局成本:
c++在布局以及存取时间上主要的额外负担是由virtual引起的。包括:
Virtual function 机制 。用以支持一个有效率的“执行期绑定”(runtime binding)。
Virtual base class。用以实现“多次出现在继承体系中的base class,有一个单一而共享的实体”。
此外,还有一些多重继承下的额外负担。发生在“一个derived class和其第二或后继之base class的转换”之间。
C++对象模式:
在C++中,有两种class data members : static 和 nonstatic
有三种class member functions: static 、nonstatic 和 virtual
提出了几种模型原型:简单对象模型,表格驱动对象模型。
C++对象模型:
nonstatic data members 被配置与每一个 class object 之内,static data members 则被存放在所有的 class object之外
static 和 nonstatic function members 也被放在所有的 class object 之外
virtual function 则以两个步骤支持:
(1)每一个 class 产生出一堆指向 virtual functions 的指针,放在表格之中,这个表格被称为 virtual table(vtbl)
(2)每一个 class object 被添加了一个指针,指向相关的 virtual table,通常这个指针被称为 vptr。(vptr的设定和重置都由每一个 class 的 constructor、destructor 和 copy assignment 运算符自动完成。)
模型主要优点:空间和存取时间的效率
模型主要缺点:如果应用程序代码本身未曾改变,但所用到的class objects的nonstatic data members有所修改(可能是增加,移除或更改),那么那些应用程序代码同样得重新编译。(相对双表格模型来说,双表格模型提供了较大的弹性,因为它多提供了一层间接性,但是它因此也付出空间和执行效率两方面的代价)
相关文章推荐
- 深入探索C++对象模型笔记之二 —— 关于对象(下)
- 《深入探索C++对象模型》笔记之第一章关于对象
- 深入探索C++对象模型 第一章 关于对象
- 深入探索C++对象模型笔记之三 —— 构造函数语意学 (Default Constructor的建构操作)
- 深度探索C++对象模型 关于对象的笔记
- 《深入探索C++对象模型》第一章:关于对象
- 深入探索C++对象模型笔记之四 —— 构造函数语意学 (Copy Constructor的建构操作)
- 深入探索C++对象模型笔记之六 —— Data语意学
- 深入探索C++对象模型笔记
- 深入探索C++对象模型笔记1
- 深入探索C++对象模型笔记之五 —— 构造函数语意学 (成员们的初始化队伍 Member Initialization List)
- 深入探索C++对象模型(1) 关于对象(思维导图)
- 深入探索C++对象模型->2.1 Default Constructor的构造操作
- 深入探索C++对象模型--C++构造函数
- [读书笔记] 深入探索C++对象模型-第四章-Function语义学(中)
- [读书笔记] 深入探索C++对象模型-第六章-执行期语义学(中)
- 深入探索C++对象模型:第四章 Function语意学
- [读书笔记] 深入探索C++对象模型-第六章-执行期语义学(上)
- 《深入探索C++对象模型》第二章:构造函数语意学(下)
- [读书笔记] 深入探索C++对象模型-第五章-构造、析构、拷贝语义学(上)