第1章读书笔记——深度探索c++对象模型


第1章 关于对象
1.1 c++对象模式

c++中有两种class data members: static和nonstatic,三种class member functions: static,nonstatic和virtual

对下面代码class point声明:

class Point{
public:
    Point(float xval);
    virtual ~Point();
    
    float x() const;
    static int PointCount();
    
protected:
    virtual ostream& print(ostream &os) const;
    
    float x;
    static int _point_count;
    
};

简单对象模型

简单模型中,一个object是一系列的slots,每一个slot指向一个members。Members按其声明顺序,指被指定一个slot。每一个data member或function member都有自己的一个slot。模型如图1.1所示
在这里插入图片描述

简单模型中,member本身并不放在object中。只有指向member的指针才放在object内。原因是可以避免‘members有不同的类型,因而需要不同的存储空间’所带来的问题。Object中的member是通过slot的索引来寻址的。一个class的大小是‘指针大小乘以class中声明的members个数’

表格驱动对象模型

为了对所有classes的所有objects都有一致的表达方式,引入表格驱动对象模型。它把所有与members相关的信息放在data member table(存放数据本身)和member function table(存放指向member function的slot指针)中,class object本身内含指向这两个table的指针。如图1.2所示

在这里插入图片描述

c++对象模型

member class object外
Non static data members class object内
static data members class object外
static和non static function members class object外
virtual function 两个步骤1.每个class产生一堆指向virtual function的指针,放在表格中,这个表格被称为virtual table(vtbl) 2.每个class object有一个指向virtual table的指针,被称为vptr。

在这里插入图片描述

如上图所示,这个模型的主要优点是空间和存取效率。主要缺点是如果应用程序代码本身未曾改变,但所用到的class objects的non static data members有所修改,应用程序需要重新编译。

继承

c++支持单一继承

class Library_materials{......};
class Book:public Library_materials{......};
class Rental_book:public Book{......}

c++也支持多重继承

class iostream: public istream, public ostream{......};

继承关系也可以指定为虚拟

class istream:virtual public ios{...};
class ostream:virtual public ios{...};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值