Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2618003
  • 博文数量: 315
  • 博客积分: 3901
  • 博客等级: 少校
  • 技术积分: 3640
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-08 15:32
个人简介

知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516

文章分类

全部博文(315)

文章存档

2019年(2)

2018年(1)

2016年(7)

2015年(32)

2014年(39)

2013年(109)

2012年(81)

2011年(44)

分类: C/C++

2012-11-06 20:15:11

点击(此处)折叠或打开

  1. #include <iostream>
  2.  
  3.  using namespace std;
  4.  
  5.  
  6.  #define FREE(p) {if (p) delete p; p = NULL;}
  7.  
  8.  
  9.  
  10.  //const_cast
  11.  class Cons
  12.  {
  13.  public:
  14.      int num;
  15.  };
  16.  
  17.  //reinterpret_cast
  18.  class ReptA
  19.  {
  20.  public:
  21.      int rept_a;
  22.  };
  23.  class ReptB
  24.  {
  25.  public:
  26.      int rept_b;
  27.  };
  28.  class ReptC : public ReptA, public ReptB{ };
  29.  
  30.  
  31.  /**并非我的原话---------------------------------------------------------------------------------------
  32.   *一共四种cast。1、static_cast,支持子类指针到父类指针的转换,并根据实际情况调整指针的值,反过来也支
  33.  持,但会给出编译警告,它作用最类似C风格的“强制转换”,一般来说可认为它是安全的;2、dynamic_cast,支
  34.  持父类指针到子类指针的转换,并根据实际情况调整指针的值,和static_cast不同,反过来它就不支持了,会导致
  35.  编译错误,这种转换是最安全的转换;3、reinterpret_cast,支持任何转换,但仅仅是如它的名字所描述的那
  36.  样“重解释”而已,不会对指针的值进行任何调整,用它完全可以做到“指鹿为马”,但很明显,它是最不安全的
  37.  转换,使用它的时候,你得头脑清醒,知道自己在干什么;4、const_cast,这个转换能剥离一个对象的const属
  38.  性,也就是说允许你对常量进行修改。
  39.   */
  40.  int main()
  41.  {
  42.      //--------const_cast------字符串----
  43.      const char a[] = "hell";
  44.  
  45.      cout << a << endl;
  46.  
  47.      //a[0] = 'b';
  48.  
  49.      char * b = const_cast<char *> (a);
  50.  
  51.      b[0] = 'a';
  52.  
  53.      cout << a << endl;
  54.  
  55.      //--------const_cast--------------
  56.      const Cons * pCons = new Cons;
  57.      //pCons->num = 2; //read-only
  58.      Cons * pCanWrite = const_cast<Cons *> (pCons);
  59.      pCanWrite->num = 2; //read-write
  60.      cout << pCanWrite->num << endl;
  61.      FREE(pCons);
  62.      //FREE(pCanWrite); //【不释放】
  63.  
  64.  
  65.  
  66.      //--------reinterpret_cast------数据类型----
  67.      int *n = new int(2);
  68.      *n = 1;
  69.      double *d = reinterpret_cast<double*> (n);
  70.      cout << *d << endl; //不是1.000000之类的,而是很奇怪的数字
  71.  
  72.      //--------reinterpret_cast----------
  73.      ReptC ptc;
  74.      ReptB * pReptBR = reinterpret_cast<ReptB *> (&ptc);
  75.      ReptB * pReptBS = static_cast <ReptB *> (&ptc);
  76.      /*
  77.       *0x22ff24 指针从rept_a变量开始,因此我们试着去给该地址赋值?
  78.       *虽然不能直接用对象指针指向变量rept_a,但是我们可以读取该对象地址,然后去修改相应各个变量的值;
  79.       *这是很不安全的,因此reinterpret_cast需要慎用!
  80.       */
  81.      cout << pReptBR << endl; //0x22ff24
  82.      int * cool = (int *)pReptBR;
  83.      *cool = 2; //0x22ff24,给rept_a赋值
  84.      cool += 1; //跳到0x22ff28,给rept_b赋值
  85.      *cool = 5;
  86.  
  87.      cout << pReptBS << endl; //0x22ff28 跳过了四个字节,直接指向rept_b变量
  88.      cout << pReptBS->rept_b << endl; //打印看看是否被修改,答案是5,yes。
  89.  
  90.  
  91.  
  92.      //---------dynamic_cast--------------来自bk
  93.      /**
  94.      struct B1{
  95.          virtual ~B1(){}
  96.      };
  97.      struct B2{
  98.          virtual ~B2(){}
  99.      };
  100.      struct D1 : B1, B2{};
  101.  
  102.  
  103.      D1 d;
  104.      B1 * pb1 = &d;
  105.      B2 * pb2 = dynamic_cast<B2 *>( pb1); //L1
  106.      B2 * pb22 = static_cast<B2 *> (pb1); //L2
  107.      上述定义中可以看到,B1和B2是不相关的类,
  108.      从L1可以看到,dynamic_cast允许这种转换:只要B1存在多态方法.
  109.      L2将编译失败,static_cast并不允许两个完全不相干的类互相转换.
  110.       */
  111.  
  112.  
  113.      return 0;
  114.  }

阅读(2293) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~