C++对象模型-笔记二

书中解决的疑问总结:


问题1:各种类的占用空间大小(P84)


问题2:类的各种成员存放的形式(P9)


问题3:加了继承之后的类成员存放方式(博文)


问题4:对象模型为我们悄悄的添加了什么其他的代码(P13)


问题5:三种编程模型的区别(程序模型,ADT模型,OO模型(运行时多态)):封装-》继承》多态(P24)


问题6:指针的大小(32位则为4字节)和指针的类型(地址范围)


p31的例子:对象指针,超出地址范围时候的处理

p33例子:对象和对象的指针的内存分布


问题7:默认构造函数什么时候会被产生
(类中包含另外一个类的对象,并且后者有默认构造函数,
继承于带有默认构造函数的基类,
带有一个Virtual Function的类(构造vptr和vtbl),

带有一个Virtual Base Class的类)


问题8:何时需要复制构造以及默认复制构造函数所做的事情
(对一个object做明确的初始化操作,object直接当作参数交给某个函数,函数返回一个class object时
复制构造有两种方式:调用默认复制构造函数以及位逐次复制
合成的复制构造函数(条件跟产生默认构造函数的条件一致):成员数据进行复制,对象成员则递归调用复制构造函数

不需要合成复制构造函数的时候直接使用位逐次复制)


问题9:什么是NRV和构造函数初始化参数列表(p75)
NRV是当函数返回一个对象的时候,编译器将函数的返回值优化为一个对象引用参数

构造函数初始化列表在初始化对象成员的时候特别有用,避免产生临时对象,但是应该注意其初始化顺序


问题10:类继承中子类总保持数据的原样性-类复制的时候,避免将一些需要保留的数据覆盖(P103例子,类继承的内存补全,单class的内存补全)
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访问


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值