第十九章 特殊工具与技术
19.1 控制内存分配
1. 重载new和delete
执行new表达式的三步操作:
调用operator new的标准库函数,分配一块内存空间
在内存空间上使用构造函数构造对象,初始化
返回指向该对象的指针
new和delete接口
malloc函数与free函数
当定义自己的new和delete函数时,需要用到malloc函数和free函数
2. 定位new表达式
向new中传入指定内存地址,允许我们在一个特定的、预先分配的内存地址上构造对象
19.2 运行时类型识别
1. dynamic_cast运算符
将基类指针或引用安全的转换成派生类指针或引用。
转换成功的前提是该基类指针原来就指向一个派生类对象
基类含有虚函数
指针类型的转换
将基类指针转换为派生类指针
将转换放在if判断条件的好处:同时完成类型转换和条件检查两项任务
引用类型的转换
2. typeid运算符
返回表达式的动态类型
使用typeid运算符
typeid应该作用于对象,而非指针
3. type_info类
typeid返回值为type_info类
name函数的返回值结果依据编译器而异
19.3 枚举类型(enum)
限定作用域的枚举类型需要使用域访问符才可以访问里面的内容
不限定作用域的枚举类型可以直接访问
enum可以分开定义
枚举成员
枚举成员是const,在初始化枚举成员时提供的初始值必须是常量表达式
枚举定义新的类型
在定义并初始化时,只能使用枚举成员或另一个同类型的枚举对象来初始化。不能直接使用int。
在使用时自动转换成整型
指定enum的大小类型
默认情况下enum的成员类型为int
19.4 类成员指针
成员指针既包括了类的信息,也包括了成员信息。
在力扣刷题的环境中,自定义的比较函数处于solution类中,在使用谓词时如果调用了自定义的比较函数指针,会引发错误。
1. 数据成员指针
成员指针需要指定相应的类
pdate是该指针的名字,该指针是一个const string类型的指针,并且是一个Screen类里面的成员。
初始化该成员指针,令它指向某个Screen对象里面的contents成员
使用数据成员指针
当为成员指针赋值时,该指针并没有指向任何数据(只说明了指向某个对象的特定成员)
只有当解引用时我们才提供真正的对象(给出特定的对象)
既可以通过对象也可以通过指针
返回数据成员指针的函数
2. 成员函数指针
指向类的成员函数的指针
使用成员函数指针
和成员指针一样,不过需要加括号确定优先级
使用成员指针的类型别名
3. 将成员函数用作可调用对象
成员指针不是一个可调用对象
在谓词中使用将会报错
使用function生成一个可调用对象
将成员函数指针封装到一个function里面,使用谓词时传入该function
使用mem_fn生成一个可调用对象
将成员函数指针传入mem_fn中,让其生成一个可调用对象
使用bind生成一个可调用对象
使用bind重新映射
19.5 嵌套类
一个类定义在另一个类的内部
声明一个嵌套类
在外层类之外定义一个嵌套类
需要加上外层类和内层类两层的名字
嵌套类和外层类是相互独立的
外层类对象中不会有任何嵌套类成员
19.6 union:一种节省空间的类
union在任意时刻只有一个数据成员有值,其他成员处于未定义状态。
union定义了一种新类型
定义union
默认情况下成员是公有的
使用union类型
初始值被用于初始化第一个成员
匿名union
可以直接访问它的成员
含有类成员的union
19.7 局部类
定义在函数内部的类
局部类不能使用函数作用域中的变量
常规的访问保护规则对局部类同样使用
局部类中的名字查找
19.8 固有的不可移植的特性
程序因机器不同而造成的执行结果的不同
1. 位域
使用位域
volatile限定符
额外修饰,说明该变量值由程序直接控制之外的过程控制
const和volatile可同时对类型进行额外修饰
合成的拷贝对volatile对象无效
2. 链接指示:extern"C"
调用其他语言写的程序
声明一个非C++的函数
链接指示与头文件
一次性建立多个链接