Loading... # 对象布局 ## 阅前理解: ### 析构函数 #### 什么是析构函数: 析构函数(destructor) 与[构造函数](https://www.runoob.com/cplusplus/cpp-constructor-destructor.html)相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作 #### 声明: 析构函数是具有与类相同的名称但前面是波形符 (`~`) 的函数 #### 要点: - 不接受参数 - 不要(或void)返回值 - 不可以声明为**`const`**、**`volatile`**或 **`static`**,但是,可以为声明为 **`const`**、**`volatile`** 或 **`static`** 的对象的析构调用它们。 - 可以声明为 **`virtual`**。 使用虚拟析构函数,可以在不知道对象类型的情况下销毁对象 - 使用虚拟函数机制调用对象的正确析构函数。 还可以将析构函数声明为抽象类的纯虚拟函数。 ### 虚函数 #### 什么是虚函数: 虚函数的主要目的是实现`多态(polymorphism)`,虚函数是一种由virtual关键字修饰的一种类内函数,可分为虚函数和纯虚函数。 #### 声明: 关键字:`virtual` #### 要点: 多态,可扩展性,代码重用 ### 静态成员变量 #### 什么是静态成员变量: 不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的对象共享。 #### 声明: `static`关键字来把类成员定义为静态 #### 要点: 静态变量,是在编译阶段就分配空间,对象还没有创建时,就已经分配空间。 静态成员变量必须在类中声明,在类外定义。 静态数据成员不属于某个对象,在为对象分配空间中不包括静态成员所占空间。 # 简单对象模型 第一个模型十分简单,尽可能减低C++编译器的设计复杂度而开发的,相对的赔上的则是空间和执行效率。在这个简单模型中,一个object是一系列的slots(插槽),每个slots指向一个members。Members按其声明顺序,各被指定一个slots。每一个data/function members都有一个slots。 在这个模型下,object存放的是“指向member的指针”,可以避免“members”有不同的类型导致需要不同的储存空间。Object中的members是以slot的索引值来寻址的。 计算class object的大小:指针大小 乘以 class中所声明的members的个数。 这个模型并没有被应用于实际产品上,不过关于索引或slot个数的观念被应用到C++的“指向成员的指针” # 表格驱动对象模型 这一种对象模型是把所有与members相关的信息抽出来,放在一个data member table和一个member function table之中,class object本身则包含指向这两个表格的指针。Members function table是一系列的slots,每一个slot指出一个member function;Data member table则直接持有data本身。 最后修改:2023 年 11 月 11 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏