转自http://blog.csdn.net/jacklam200/archive/2008/12/07/3469058.aspx
因为虽然很多有经验的C++程序员认为他们知道,但是他们还是不知道全部。(我也没有知道全部 )
1.const_cast。
你知道,一个int*是可以直接赋给一个const int*的,但是一个const int*是不可以直接赋给一个int*的。这就需要:
int* pi=const_cast<int*>pci;
EG:
const A *pa = new A;//const对象
A *pb;//非const对象
//pb = pa; // 这里将出错,不能将const对象指针赋值给非const对象
pb = const_cast<A*>(pa);// 现在OK了
他还可以把volatile和对齐特性(alignment)去掉。
2.reinterpret_cast
就是:把整型(广义的)转换为指针,把指针转换为整型(广义的),把指针转换为另一个类型的指针。
A* pa = new A;
void* pv = reinterpret_cast<A*>(pa);
3.static_cast
可以做任何显式的自动转换(implicit cast),也可以做那些自动转换的逆转换,但是不能消除const,volatile和对齐。
表达式static_cast<T*>(a), a的值转换为模板中指定的类型T。在运行时转换过程中,不进行类型检查来确保转换的安全性。
class B { ... };
class D : public B { ... };
void f(B* pb, D* pd)
{
D* pd2 = static_cast<D*>(pb); // 不安全, pb可能只是B的指针
B* pb2 = static_cast<B*>(pd); // 安全的
}
4.dynamic_cast
就是根据类型信息来cast。理解起来很简单,实际做起来代价不小。
表达式dynamic_cast<T*>(a) 将a值转换为类型为T的对象指针。如果类型T不是a的某个基类型,该操作将返回一个空指针。
A* pa = new A;
B* pb = new B;
void* pv = dynamic_cast<A*>(pa);
// pv 现在指向了一个类型为A的对象
...
pv = dynamic_cast<B*>(pb);
// pv 现在指向了一个类型为B的对象