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
View Code

 

posted @ 2013-05-15 13:18  秀逗小虫虫  阅读(178)  评论(0)    收藏  举报