C++中的4种类型转换方式
static_cast 静态的_cast
dynamic_cast 动态的_cast
reinterpret_cast 重新解释的 _cast
const_cast 常量的_cast
C++ 里最好杜绝使用 C 方式的强制转换, 换用以上 4 个.
我们通常用的是 static_cast
在一类东西都可以转, 但不是一类的就不能转.
即, 语义上说不通的, 两个完全不同的数据类型 static_cast
是拒绝工作的.
比如你想把一个指针转成浮点数,
或者想把 class A * 转成 class B * , 但是 class A 和 class B
又没有任何关系. 等等....
static_cast 在通过编译后, 空间和时间效率实际等价于 C 方式强制转换.
都是编译时决定的.
dynamic_cast 类似 static_cast, 但是在一颗类继承树上转换时,
将利用 RTTI 在运行时检查. 我们一般用于 downcast
比如,
class A {};
class B : public A {};
A* a=new B();
这个时候, 可以用 dynamic_cast 做 downcast, 把 a 转成 B*.
和 static_cast 不同, dynamic_cast 会检查一下 a 到底是不是指向一个
B, (利用了 RTTI) 如果转不了, 将返回一个 NULL.
reinterpret_cast 就比 static_cast 更接近 C 的强制转换了.
static_cast 静态的_cast
dynamic_cast 动态的_cast
reinterpret_cast 重新解释的 _cast
const_cast 常量的_cast
C++ 里最好杜绝使用 C 方式的强制转换, 换用以上 4 个.
我们通常用的是 static_cast
在一类东西都可以转, 但不是一类的就不能转.
即, 语义上说不通的, 两个完全不同的数据类型 static_cast
是拒绝工作的.
比如你想把一个指针转成浮点数,
或者想把 class A * 转成 class B * , 但是 class A 和 class B
又没有任何关系. 等等....
static_cast 在通过编译后, 空间和时间效率实际等价于 C 方式强制转换.
都是编译时决定的.
dynamic_cast 类似 static_cast, 但是在一颗类继承树上转换时,
将利用 RTTI 在运行时检查. 我们一般用于 downcast
比如,
class A {};
class B : public A {};
A* a=new B();
这个时候, 可以用 dynamic_cast 做 downcast, 把 a 转成 B*.
和 static_cast 不同, dynamic_cast 会检查一下 a 到底是不是指向一个
B, (利用了 RTTI) 如果转不了, 将返回一个 NULL.
reinterpret_cast 就比 static_cast 更接近 C 的强制转换了.
它更进一步的, 实现一些看起来没关系的两种类型转换.
比如我习惯干的, 把一个 void * 转成 unsigned ;)
当然它比 static_cast 危险.
但是有 reinterpret_cast 干不了的,
比如你在一个 const 成员函数里企图修改一个非 mutable 的成员变量.
编译器会对你咆哮, "不许动, 那玩意是我 const 住的, 把你的爪子
收回去" 这个时候就要利用 const_cast 了, 呵呵.
const_cast 就是可以解除 const 限制的"神"的武器
但我认为, 这在很多情况下比 reinterpret_cast 更危险, 我还是老实做
人的好. 不能让编译器来捍卫我的代码的安全.