C++共有四种类型转换,其中reinterpret_cast是四种类型中,最不安全的转换,建议尽量少使用,故本文不详细赘述。
1. 静态类型转换( static_cast<目标类型>(原变量) )
常用于类层次结构间,父类和派生类之间指针和引用的互相转换
1.1允许内置数据类型转换
char a='a'
double b =static_cast<double>(a);
1.2允许父子(自定义类)之间指针或者引用的转换
class base
{}; //父类
class son:public base
{};//子类
void test()
{
base *b1=null;
son * s1=null;
//父类转子类 向下类型转换,不安全!
son *s2=static_cast<son*>(b1);
//子类转父类,向上类型转换,安全!
base *b2=static_cast<base*>(s1);
}
ps:不允许不同类之间类型转换。必须是同一类的父类以及它的派生类之间才可以进行类型转换
2. 动态类型转换( dynamic_cast<目标类型>(原变量) )
在类层次之间进行向上或向下类型转换
在进行向上类型转换的时候 跟static_cast一样
在进行向下类型转换的时候,相比static_cast多了类型检查,更加安全
## 2.1不允许进行内置数据类型转换
## 2.2允许父子(自定义类)之间指针或者引用的转换
2.2.1 父转子 失败 不安全
2.2.2 子转父 成功 安全 跟static_cast一样
2.2.3 如果发生了多态 可以进行父转子
3. 常量 转换 ( const_cast <目标类型>(原变量) )
常用来修改类型的const属性
## 3.1常量指针转换为非常量指针
const int *p1=null;//常量指针转换为非常量指针 移除const
int *p2 =const_cast<int *>(p1);
int*pp1=null; // 非常量指针转换为常量指针 增加const
const int *pp2=const_cast<const int*>(pp1);
## 3.2常量引用转换为非常量引用
int p=10;
int &pp=p;
const int &p3=const_cast<const int&>(pp);
ps:不能直接对非引用或者非指针类型的变量使用const_cast去移除他的const属性