看了《深度搜索C++对象模型》,做了一些小实验,真正值得注意的,其实只有两个章节。其他的章节太过繁琐,要么就是个人觉得没有意义。
第二章:构造函数语义学
第四章:Function语义学
接下来会
(1)程序员应该如何理解多态、继承、Function语义学之间的关系。
(2)拷贝构造函数在编译器中的使用和转换特征。
(3)C++中move语义对我们的作用。
多态
- 多态:多种状态
- 主要用途:经由一个共同的接口来影响类型的封装,这个接口通常被定义在一个抽象的base class中
- C++支持多态的方法:
1.隐式的转换操作。
2.虚函数机制。
3.dynamic_cast和typeid运算符。
程序员视角
多态分两类,静态多态和动态多态。
- 静态多态:重载。
- 动态多态:①位于继承体系之下。②由虚函数机制支持。③使用引用或指针调用该特性。
我们确认了几个条件:虚函数离不开继承,使用多态离不开类的继承。
继承
- 继承:is-a
- 主要用途:略
- 继承的主要方式:
1.单一继承。
2.多重继承。
3.虚继承。
程序员视角
子类继承了父类的特性。
虚函数机制
C++对象模型:
- class:vtbl
- object:vptr
程序员视角
问题一、在C++对象模型中,一个类对象,是如何在内存中描述的?
- 1.数据成员:static、non-static
- 2.函数成员:static、non-static、virtual
问题二、经过单一继承以后,以上成员是如何描述的?
问题三、经过多重继承以后,以上成员是如何描述的?
核心:指针调整。
问题四、经过虚拟继承以后,以上成员是如何描述的?
拷贝构造函数语义学
- 使用场景
1.显式初始化操作。
2.作为参数传给某个函数。
3.传回一个object。
拷贝构造函数的定义 X::X(const X& x); - NRV优化
核心:
通过修改函数原型,传入引用,实现临时对象的使用。
C++11中move语义
Move语义:逻辑上是移动的,实现资源窃取。
1.与浅拷贝构造函数区别。
move是安全的。
2.如何使用move语义?
- 右值引用:右值是一个临时对象,令其存在-->右值引用。
- 使用:当表达式为右值,在C++11中,优先调用Move语义构造。