转自:http://blog.csdn.net/leehong2005/article/details/8602030
在C++中,经常会涉及到类型转换,虽说一般情况下不建议类型转换,但有时候还是避免不了。转换的时候,可能一般都直接使用C语言风格的转换(直接强制转换),但这样做可能很不安全,容易造成数据丢失(如int -> char),内存访问违规。
1、static_cast
2、dynamic_cast
dynamic_cast必须用于有继承关系的类之间,如果两个类指针之间没有任何关系,则会报编译错误。
- // dynamic_cast_1.cpp
- // compile with: /c
- class B { };
- class C : public B { };
- class D : public C { };
- void f(D* pd) {
- C* pc = dynamic_cast<C*>(pd); // ok: C is a direct base class
- // pc points to C subobject of pd
- B* pb = dynamic_cast<B*>(pd); // ok: B is an indirect base class
- // pb points to B subobject of pd
- }
- void func(B *pb){
- D *pd1 = static_cast<D *>(pb);
- D *pd2 = dynamic_cast<D *>(pb);
- }
- class A
- {
- public:
- int m_iNum;
- virtual void f(){}
- };
- class B:public A{};
- class D:public A{};
- void foo()
- {
- B *pb = new B;
- pb->m_iNum = 100;
- D *pd1 = static_cast<D *>(pb); //copile error
- D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL
- delete pb;
- }
3、const_cast
- class B
- {
- public:
- int m_iNum;
- }
- void foo()
- {
- const B b1;
- b1.m_iNum = 100; //comile error
- B b2 = const_cast<B>(b1);
- b2. m_iNum = 200; //fine
- }
4、reinterpret_cast
- // expre_reinterpret_cast_Operator.cpp
- // compile with: /EHsc
- #include <iostream>
- // Returns a hash code based on an address
- unsigned short Hash( void *p ) {
- unsigned int val = reinterpret_cast<unsigned int>( p );
- return ( unsigned short )( val ^ (val >> 16));
- }
- using namespace std;
- int main() {
- int a[20];
- for ( int i = 0; i < 20; i++ )
- cout << Hash( a + i ) << endl;
- }