书中解决的疑问总结:
问题1:各种类的占用空间大小(P84)
问题2:类的各种成员存放的形式(P9)
问题3:加了继承之后的类成员存放方式(博文)
问题4:对象模型为我们悄悄的添加了什么其他的代码(P13)
问题5:三种编程模型的区别(程序模型,ADT模型,OO模型(运行时多态)):封装-》继承》多态(P24)
问题6:指针的大小(32位则为4字节)和指针的类型(地址范围)
p33例子:对象和对象的指针的内存分布
(类中包含另外一个类的对象,并且后者有默认构造函数,
继承于带有默认构造函数的基类,
带有一个Virtual Function的类(构造vptr和vtbl),
带有一个Virtual Base Class的类)
(对一个object做明确的初始化操作,object直接当作参数交给某个函数,函数返回一个class object时
复制构造有两种方式:调用默认复制构造函数以及位逐次复制
合成的复制构造函数(条件跟产生默认构造函数的条件一致):成员数据进行复制,对象成员则递归调用复制构造函数
不需要合成复制构造函数的时候直接使用位逐次复制)
NRV是当函数返回一个对象的时候,编译器将函数的返回值优化为一个对象引用参数
构造函数初始化列表在初始化对象成员的时候特别有用,避免产生临时对象,但是应该注意其初始化顺序
class A{
private:
//int i; //不同的结果
//short i;
//double i;
char c;
};
class B : public A{
private:
char c;
//int i;
};
class C : public B{
private:
char c;
//int i;
};
问题11:添加多态对成员数据存取的负担(多态,多继承,虚继承)
多继承:多继承和虚继承都破坏的自然多态的继承,基类型和子类型的转换需要额外的工作。(自然多态下,基类和子类的地址是同一个位置开始的)
虚继承:虚继承的基类内存布局是在后面的,所以需要解决如果访问虚基类的问题。cfront是在每个派生类中添加基类的指针,优化的办法是在子类虚表中添加offset访问