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

本文探讨了C++类对象模型的关键组成部分,如非静态成员变量、虚函数表指针等,并介绍了虚继承、虚函数、复制构造函数的概念及其应用场景。此外还分析了类大小的影响因素及内存布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值