C++标准转换运算符(4)

四、reinterpret_cast  

(参考文献2中的作者总结了一下三个用法:)
1. 任意指针(或引用)类型之间的转换;
2. 以及指针与足够大的整数类型之间的转换;
3. 从整数类型(包括枚举类型)到指针类型,无视大小。

reinterpret_cast  虽然很强大,但是使用时要特别小心。这个操作符一般用在内存池管理中。下面给个例子:

 1 struct node
 2 {
 3     int na;
 4     char nb;
 5     char * nc;    
 6     node * pNextNode;
 7     explicit node()
 8     {
 9         na = 0;
10         nb = '0';
11         nc = "hello";
12         pNextNode = NULL;
13     }
14 };
15 
16 int main()
17 {
18     char membuf[10000];// 预先申请的内存池
19     memset(membuf,0,sizeof(membuf));
20     
21     // 第1个节点
22     char * p = membuf;    
23     node * pNode = reinterpret_cast<node*>(p);
24     pNode->na = 9;
25     pNode->nb = '9';
26     pNode->nc = "world";
27     
28     // 第2个节点
29     p = p+sizeof(node);
30     node * p2Node = reinterpret_cast<node *>(p);
31     pNode->pNextNode = p2Node;//第1个节点的指针指向第2个节点的开始
32     p2Node->na = 10;
33     p2Node->nb = '10';
34     p2Node->nc = "c++";
35     
36     cout<<endl;
37     return 1;
38 }

gdb可以看到membuf内存池里面的情况。

 总结:

dynamic_cast用在: 派生类指针 转化为 基类指针时;

static_cast用在: 1)基类指针 转化为 派生指针时(但程序员需要保证 转化后的指针指向的是完整的派生类对象); 

            2) 基本数据类型相互转化; 

reinterpret_cast 用在: 1) 各种指针 和 void *之间的相互转化;

           2)任意类型之间的转化,但是程序员需要仔细确认是否有意义、是否正确。

dynamic_cast -> static_cast -> reinterpret_cast:
1. 编译器的检查越来越少;
2. 类型转化的使用范围越来越大;
3. 程序员需要更细心的保证程序的正确性。

参考:

http://www.cplusplus.com/doc/tutorial/typecasting/

http://www.cnblogs.com/ider/archive/2011/07/22/cpp_cast_operator_part2.html

原文地址:https://www.cnblogs.com/yaozhaoyz/p/2689635.html