C++中的4种类型转换方式
===========================================================
作者: goodfunman(http://goodfunman.)
发表于:2006.07.02 17:42 分类: C/C++ 出处:http://goodfunman./post/15807/129658 --------------------------------------------------------------- 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 的强制转换了. 它更进一步的, 实现一些看起来没关系的两种类型转换. 比如我习惯干的, 把一个 void * 转成 unsigned ;) 当然它比 static_cast 危险. 但是有 reinterpret_cast 干不了的, 比如你在一个 const 成员函数里企图修改一个非 mutable 的成员变量. 编译器会对你咆哮, "不许动, 那玩意是我 const 住的, 把你的爪子 收回去" 这个时候就要利用 const_cast 了, 呵呵. const_cast 就是可以解除 const 限制的"神"的武器 但我认为, 这在很多情况下比 reinterpret_cast 更危险, 我还是老实做 人的好. 让编译器来捍卫我的代码的安全 |
|