ch01 关于对象

  • C++在布局以及存取时间上的主要额外负担由virtual引起的,包括:

    1. virtual function 机制, 引入 vptr(指向一个对象的虚拟表的指针) 以及vtbl(虚拟表),支持一个有效率的"执行器绑定";
    2. virtual base class,用以实现“多次出现在继承体系中的base class,有一个单一而被共享的实例
    3. 多重继承下,派生类跟 第二个以及后续基类 之间的转换
  • C++有三种方式 支持多态:

    • 经由一组 隐式的转化操作,比如将派生指针转化为指向其基类的指针, shape* ps = new circle()
    • 经由 virtual function机制 ps->rotate()
    • 经由 dynamic_cast 和 typeid运算符 if(circle *pc = *dynamic_cast<circle > (ps))
  • 一个类的对象内存大小包括

    • 所有非静态数据成员的大小;
    • 为支持virtual 有内部产生的额外负担;
    • 由 内存对齐而填补的内存大小。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    class ZooAnimal {  
    public:  
        ZooAnimal();  
        virtual ~ZooAnimal();  
        virtual void rotate();  
    protected:  
        int loc;  
        String name;  
    };
    // 在32位计算机上所占内存为16字节:int四字节,String8字节(一个表示长度的整形,一个指向字符串的指针),以及一个指向虚函数表的指针vptr。**对于继承类则为基类的内存大小加上本身数据成员的大小。**
    
  • “指针的类型” 会教导编译器如何解释某个特定地址中的内存内容以及其大小(void* 指针只能够持有一个地址,而不能通过它操作所指向的object)

  • C++通过class 的pointers 和 references 来支持多态,付出代价 是额外的间接性。 之所以支持多态是因为他们并不引发内存中任何 “与类型有关的内存委托操作(type-dependent commitment)",会受到改变的只有他们所指向的内存的"大小和内容的解释方式"而已

  • C++类包含两种数据成员:静态数据成员 和 非静态数据成员;同时 包含 成员函数,静态函数 和 虚函数 三种成员函数。

ch02 构造函数语义学

复制构造函数

ch03 Data语义学

ch04 Function语义学

ch05 构造、解构、拷贝 语义学

ch06 执行期语义学

ch07 站在对象模型的类段

参考资料