四、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