C++复习笔记

C++主要是参考《深度探索C++对象模型》这本书来复习的,这本书把C++对象模型讲解的非常透彻,之前也阅读过了《C++ Primer》《Effective C++》,后面两本书也讲的很好。 下面主要是《深度探索C++对象模型》中的笔记。

member functions虽然在class的声明之内,但却不会出现在object之中,每一个non-inline member function 只会诞生一个函数实例。至于每一个“拥有零个或一个定义”的inline function 则会在其每一个使用者身上产生一个函数实例。

C++在布局以及存取时间上的主要额外负担是由virtual引起的,包括:
1. virtual function机制 ,用于支持一个有效率的“执行期绑定(runtime binding)”
2. virtual base class ,用以实现“多次出现在继承体系中的base class,有一个单一而被共享的实例”

C++有两种class data members:static和非static。
三种class member functions:static,non-static,virtual。

对于object的多态操作,要求此object必须经由一个pointer 或者reference来存取。

需要多少内存才能够表现一个class object,一般而言主要有:
1. 其non-static data members的总和大小
2. 加上任由由于alignment 的需求而填补上去的空间,可能存于members之间,也可能存于集合体边界。
3. 加上为了支持virtual 而由内部产生的任何额外负担

有4种情况,会造成“编译器”必须为未声明construct的class合成一个default construct:
1. 类里面存在member object时
2. 类存在继承体系,base class的default construct
3. 类里面存在virtual function
4. 类继承体系中出现virtual base class

有3种情况会以一个object的内容作为另一个object的初值:
1. 以一个object显式地初始化操作
2. 当object当做参数传递给某一个函数
3. 函数返回object

一个class object可用两种方式复制得到,一种是被初始化(copy construct) ,另外一种是被指定(assignment)

什么时候一个class不会呈现出一种“bitwise copy semantics” 呢?有4种情况:
1. 当class内含一个member objct,而后者的class声明有一个copy constructor(不论是被class设计者显式地声明,或者是被编译器合成)。
2. 当class继承自一个base class ,而后者存在一个copy constructor
3. 当类声明一个或多个virtual functions
4. 当class 派生自一个继承串链,其中有一个或多个virtual base classes

编译器间的两个程序扩张操作(只要有一个类声明了一个或多个virtual functions就会如此)
1. 增加一个virtual function table (vtbl) ,内含每一个有用的virtual function 的地址
2. 一个指向virtual function table 的指针(vptr),安插在每一个class object内

当class object以“相同class的另一个object”作为初始,其内是以所谓的default memberwise initialization手法完成的,也就是把每一个内

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值