• 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

  • 相关阅读:
    #leetcode刷题之路32-最长有效括号
    #leetcode刷题之路31-下一个排列
    数据结构第一节 递归
    数据结构 第一节
    java基础 抽象类与接口
    Spring1
    java基础3。定义类
    java基础2。基本数据类型
    java基础1。面向对象
    丑数
  • 原文地址:https://www.cnblogs.com/yaozhaoyz/p/2689635.html
Copyright © 2020-2023  润新知