C++的四种类型转换例子
C++有四种类型转换方法,分别是 reinterpret_cast、static_cast、dynamic_cast、const_cast。下面是四种类型转换使用的具体代码,在调试代码的时候可以尝试着把某些注释去掉后再编译运行,查看结果。经过自己动手和思考后,才会有更深刻的记忆。
代码:
1 #include <iostream> 2 using namespace std; 3 4 unsigned short 5 Hash(void* p) 6 { 7 unsigned int val = reinterpret_cast<unsigned int>(p); 8 cout << "Hash unsigned int " << val << " ## "; 9 cout << "Hash unsigned short " << (unsigned short) (val ^ (val >> 16)) << endl; 10 return (unsigned short) (val ^ (val >> 16)); 11 } 12 13 void show_in_short(void* a, int len) 14 { 15 if (NULL == a) 16 return; 17 18 unsigned short* p = reinterpret_cast<unsigned short*>(a); 19 cout << "######### show in short ##################" << endl; 20 for (int i=0; i<len/sizeof(short); i++) 21 { 22 cout << "[" << i << "] = " << *p++ << endl; 23 24 } 25 26 } 27 28 class A 29 { 30 public: 31 virtual void xxx(){ cout << "this is A" << endl; }; 32 }; 33 34 class B : public A 35 { 36 public: 37 virtual void xxx(){ cout << "this is B" << endl; }; 38 }; 39 40 class C 41 { 42 }; 43 44 int 45 main(int argc, char* argv[]) 46 { 47 int array[2]; 48 for (int i=0; i<20; i++) 49 { 50 array[i] = i + 10; 51 Hash(array + i); 52 } 53 54 show_in_short(array, sizeof(array)); 55 56 A a; 57 B b; 58 C c; 59 A* pa = NULL; 60 B* pb = NULL; 61 C* pc = NULL; 62 63 pa = reinterpret_cast<A*>(&a); 64 pa = reinterpret_cast<A*>(&b); 65 pa = reinterpret_cast<A*>(&c); 66 67 pa = static_cast<A*>(&a); 68 pa = static_cast<A*>(&b); 69 //static_cast是不安全的,static_cast只适用于 70 //1.基类和子类之间的转换 71 //2.基础数据类型转换 72 //3.空指针转换成目标类型指针EG: CHAR* P = NULL 73 //4.任何类型的表达式转换成void类型 74 //static_cast的表达式不能去掉类型的const, volitale 75 //so 下面这行代码会在编译时报错 76 //pa = static_cast<A*>(&c); 77 78 pa = dynamic_cast<A*>(&a); 79 pa = dynamic_cast<A*>(&b); 80 //dynamic_cast是安全的,它和static_cast相似,但是比static_cast更严格 81 //dynamic_cast仅仅对指针和引用有效,一般用于基类和子类之间的转换。 82 //如果是父类转为子类,会返回NULL。类中需要有虚函数,否则会在编译时报错 83 //so 下面这行代码会在编译时报错 84 //pa = dynamic_cast<A*>(&c); 85 86 pb = dynamic_cast<B*>(&a); // pb = NULL; 87 cout << "excute pb = dynamic_cast<B*>(&a) " << endl; 88 cout << "pb = " << pb << endl; 89 90 const A *const_pa = &a; 91 //const_pa->xxx(); //fail because xxx() is not const function 92 pa = const_cast<A*>(const_pa); 93 pa->xxx(); 94 }
执行结果
xiaol-luo@CentOS:~/link/net_codes/c++/cast$ g++ -g -o cast cast.cpp && ./cast cast.cpp: In function ‘int main(int, char**)’: cast.cpp:86: 警告:从‘A a’到‘class B*’的动态转换永远不会成功 Hash unsigned int 3216571380 ## Hash unsigned short 17484 Hash unsigned int 3216571384 ## Hash unsigned short 17472 Hash unsigned int 3216571388 ## Hash unsigned short 17476 Hash unsigned int 3216571392 ## Hash unsigned short 17336 Hash unsigned int 3216571396 ## Hash unsigned short 17340 Hash unsigned int 3216571400 ## Hash unsigned short 17328 Hash unsigned int 3216571444 ## Hash unsigned short 17292 Hash unsigned int 3216571448 ## Hash unsigned short 17280 Hash unsigned int 3216571452 ## Hash unsigned short 17284 Hash unsigned int 3216571456 ## Hash unsigned short 17400 ######### show in short ################## [0] = 10 [1] = 0 [2] = 11 [3] = 0 excute pb = dynamic_cast<B*>(&a) pb = 0 this is A

浙公网安备 33010602011771号