旧式类型转换
C/C++通用类型转换:
(int)0.1;
char a;
(float) a;
(type)value,(type)expression为旧式类型转换的基本形式。
新型类型转换
注意,一下介绍的都是运算符,非函数api。
static_cast< type > ( epression )
class father
{};
class son
{};
int main()
{
father *p = new son;
static_cast<son *> p;
return 0;
}
注意,仅仅在原类型与转换类型之间可以隐式转换的时候可以使用,例如int 和 float之间是不能用static_cast进行转换,这可以保证指针类型转换的安全性。注意,在继承机制中将基类指针转化为派生类指针也是危险的。 此时推荐使用dynamic_cast进行下行转换。
const_cast< type > ( expression )
用于去掉指针的const和volatile属性,用于相同类型指针转换。
int *p1;
int *p2 = const_cast<int *>(p1);
dynamic_cast< type > ( expression )
该运算符用于expression与type存在继承关系或者相同的情形,简单地说,要求v和e之间是基类,子类或者该类本身。注意,如果t为子类,e为子类,则父类必须含有虚函数(多态)。
father *p;
dynamic_cast<son *>(p); //仅当father有虚函数(多态)时,编译才会通过。
reinterpret_cast< type > ( expression )
天生就用于情况复杂的类型转换,通过不同的指针类型重新读取内存。但有几个注意事项:
- 针对不同内存规则,如32位和64位,大端小端,代码的可移植性很差。
- 对内存的理解一定要到位
- 函数与数据类型指针不能互相转换。