《深入理解C++对象模型》读书笔记(一)

来源:互联网 发布:海军上将拉托雷 知乎 编辑:程序博客网 时间:2024/05/16 14:02

1、           C++类对象模型的中包括非静态成员变量和虚函数表指针,其他静态成员变量和成员函数均放在对象模型之外,所有的对象示例均可以共同使用。如此可以节省访问的时间和空间效率。


      

2、           虚继承是为了解决多重继承中出现公共的基类出现二义性。

  class A;

  classB1:public virtual A;

  classB2:public virtual A;

  classD:public B1,public B2;

3、           虚函数实现多态性,即通过基类指针来访问其他派生类中的同名函数。实现动态运行时绑定。

4、           转型cast不能改变指针所含的真正地址,它只影响被指出地址的内存的大小和其内容。例如将空指针转型成其他指针。

5、           对于一个类,若其中没有用户定义的构造函数,则编译器会暗中生成一个默认的构造函数,主要有四种情况:A:有默认构造函数的成员类对象;B:含有默认构造函数的基类;C:带有虚函数的类,主要是为了正确初始化虚函数表的值;D:含有虚基类,处理操作虚基类的指针。

有几个原则:1、若类显示定义了任何构造函数,则编译器不会生成默认构造函数;2、编译器合成的默认构造函数,并不会明确给类中每一个数据成员一个默认的值。

6、           复制构造函数常用于将一个对象的值赋给另外一个对象,有三种情形:1、对一个对象用另一个对象做初始化;2、把对象作为参数传递给一个函数;3、把对象作为函数的返回值。

四种情况下,需要编译器产生复制构造函数:


 后两种情况主要是因为存在虚函数表指针需要考虑。

7、           初始化列表:初始化顺序仅与声明顺序有关。充分利用初始化列表可以提高程序的运行效率。

8、           函数的重载(overload)、覆盖(override)、隐藏:重载出现在同一个类中的不同成员函数之间,一般函数名相同,参数类型或个数不同;覆盖也叫重写,值得是基类和派生类之间,基类的虚函数被派生类同名且参数相同的函数重写,覆盖掉;隐藏也是指基类和派生类之间,同名但参数不同的函数之间,若同名且参数相同,且基类无virtual关键词,则基类的函数都会被子类隐藏。

9、         空类的大小为1字节,编译器需要在类中插入一个char字节,使得类在内存中具有独一无二的地址。

10、         类的大小与以下几个因素有关:非静态成员变量、虚继承、基类的非静态成员变量。

11、         同一个访问级别(public/private/protect)中的元素在内存中排列顺序与声明顺序一样,

12、         对静态成员变量的访问,通过指针和对象访问效果均一样,但针对非静态成员变量,需要通过获得起始位置的偏移量来访问。虚拟继承会导致对成员变量的访问增加间接性,效率降低。


0 0
原创粉丝点击