const_cast
修改类型的const或volatile属性,添加const/删除const。(好像大多是删除
int n = 5;
int *k1 = const_cast<int*>(&n); //指针
*k1 = 1;
int &k2 = const_cast<int&>(n); //引用
k2 = 2;
const int a = 10;
int* b = const_cast<int*>(&a);
*b = 11;//指针b的属性变成可读可写
但是,对声明为const的变量来说,常量就是常量,任你各种转化,常量的值就是不会变。
因此,const_cast 的主要作用为:
函数的形参不是const,且函数不会改动参数值,则使用const_cast
const int constant = 21;
InputInt(constant); // error: “InputInt”: 不能将参数 1 从“const int”转换为“int *”
InputInt(const_cast<int*>(&constant)); // 用来将const转化为非const
static_cast 将隐式转换明确表示出来
1. 用于内置数据类型的转化
2. 把void类型指针转为目标类型指针(不安全)
3. 子类与父类的转换(子类转父类安全,父类转子类不安全)
不可用于指针之间的转换
父转子不安全的原因:子类的成员/方法往往比父类多,假如原父指针指向父类对象,强制转换成子类指针时,调用子类的方法,但父对象中是没有这个方法的,会出问题。如果用dynamic_cast就直接阻止了这种转换。
dynamic_cast
1. 用于含虚函数的父类和子类的转换,主要用于父类转子类。子类转父类时作用与static_cast一样。主要是弥补static_cast父转子的不安全
// 父转子时,父类的指针必须指向子类对象 (这也是为什么必须有虚函数)
base *bs = new derive();
derive *de = dynamic_cast<derive*>(bs); // 成功
base *bs2 = new base();
derive *de2 = dynamic_cast<derive*>(bs2); // 不成功,阻止该操作
reinterpret_cast
reinterpret代替显示转换,用于转换各种高风险的转换
原理是,直接把数据类型A的地址解释成另一个数据类型B的地址,逐个比特复制