C++11的类型转换

Type b = (Type)a

这个是 C 风格的强制类型转换,在现代 C++ 编程中,它已经是不被推荐,并且被视为不安全的操作。

C++11 中重新定义了四种新的类型转换操作符来替代旧的 C 风格的类型转换。

dynamic_cast

首先说这个,是因为某些需要使用它的场合下,如果你一时图个方便,使用了旧的 C 风格的类型转换来代替它,那么可能会导致程序直接崩溃。

当你把一个基类指针转换成派生类指针的时候,一但他们实际上并不存在继承关系。这个时候:

1、如果你使用了 C 风格的类型转换,那么你是无法直接通过转换后的指针的值来判断,转换是否成功的(比如指针的值是否为 NULL ,因为不管转换是否成功,指针都会被赋予一个非空的值)。所以直到你对这个指针进行其它操作时才发现,程序崩溃了,这个时候才意识到,转换没有成功。

2、如果你使用了 dynamic_cast ,那么结果就不一样了。一旦转换失败,dynamic_cast 会返回 NULL 。此时,你可以通过判断结果指针的值是否为 NULL ,再对其进行后续操作。

所以当涉及到,具有继承关系的类的指针之间的转换时,使用它是最稳妥的方式。

static_cast

这个通常的使用场景就是 C++ 基本类型之间的转换,没什么好说的。

const_cast

这个主要是用来移除变量的 const 或者 volatile 修饰符。

reinterpret_cast

重新解释 二进制的值

改变计算机对一个变量的解读方式

就像这一过程:

int a;

float b = (float)a;

二进制的值没有发生任何变化,但是计算机对其解读方式不一样了。