zoukankan      html  css  js  c++  java
  • 强制类型转换(const_cast)

    【1】 const_cast的作用

    一、常量指针 被强转为 非常量指针,且仍然指向原来的对象;

    二、常量引用 被强转为 非常量引用,且仍然指向原来的对象;

    三、常量对象 被强转为 非常量对象。 

    【2】 实例代码

    代码如下:

      1 #include <iostream>
      2 using  namespace std;
      3 
      4 const int xx = 50;
      5 
      6 class A
      7 {
      8 public:
      9     int m_nNum;
     10 
     11 public:
     12     A(int nValue = 100);
     13 };
     14 
     15 A::A(int nValue) : m_nNum(nValue)
     16 {
     17 }
     18 
     19 void TestFun()
     20 {
     21     // 第一种情况: const修饰指针指向对象
     22     const A *pA = new A(200);
     23 //  pA->m_nNum = 100;            // compile error ! pA指针指向的对象为常对象,其成员变量值为只读的。
     24     A* pAA = const_cast<A*>(pA); // 去掉pA指针的const属性
     25     pAA->m_nNum = 199;           // pAA指针指向的对象为一般对象,其成员变量值可读写。
     26     cout << pA->m_nNum << endl;  // 199
     27 
     28     // 第二种情况: const修饰指针
     29     A *pB = new A();
     30     pA = pB;  // 思考这个原因。为什么这样子可以呢?且再看下面的这种情况:
     31     A* const pC = new A(1);
     32     cout << pC->m_nNum << endl;  // 1
     33     A *pD = new A(2);
     34 //  pC = pD;                     // compile error ! pC指针变量被const修饰,其值是只读的。
     35 
     36     A*& pE = const_cast<A*>(pC); // 去掉pC指针变量的const属性。再赋给指针引用变量
     37     pE = pD;
     38     cout << pC->m_nNum << endl;  // 2
     39 
     40     A* pAS = const_cast<A*>(pC); // 去掉pC指针变量的const属性。再赋给一般指针变量
     41     pAS->m_nNum = 3;             // 通过去掉const属性的指针变量修改其成员变量值
     42     cout << pC->m_nNum << endl;  // 3
     43 
     44     // 第三种情况:const修饰指针和指针对象
     45     const A* const pCC = new A(110);
     46     const A* pCC2 = const_cast<A*>(pCC);
     47 //  pCC2->m_nNum = 119; //  error C3490: 由于正在通过常量对象访问“m_nNum”,因此无法对其进行修改
     48     pCC2 = NULL;
     49     A* const pCC3 = const_cast<A*>(pCC);
     50     pCC3->m_nNum = 119;
     51 //  pCC3 = NULL; error C3892: “pCC3”: 不能给常量赋值
     52     A* pCC4 = const_cast<A*>(pCC);
     53     pCC4->m_nNum = 120;
     54     pCC4 = NULL;
     55 
     56     // 第四种情况:const修饰对象,去const属性后赋给一般对象
     57     const A a;
     58 //  a.m_nNum = 101; // compile error ! 常对象具有只读属性。
     59     A b = const_cast<A&>(a);
     60     b.m_nNum = 101;
     61     cout << a.m_nNum << endl; // 100
     62     cout << b.m_nNum << endl; // 101
     63 
     64     // 第五种情况:const修饰对象,去const属性后赋给引用对象
     65     const A c;
     66 //  c.m_nNum = 101; // compile error ! 常对象具有只读属性。
     67     A& d = const_cast<A&>(c);
     68     d.m_nNum = 102;
     69     cout << c.m_nNum << endl; // 102
     70     cout << d.m_nNum << endl; // 102
     71 
     72     // 第六种情况:const修饰对象,对象指针去const属性后赋给指针
     73     const A e;
     74 //  e.m_nNum = 103; // compile error ! 常对象具有只读属性。
     75     A* pe = const_cast<A*>(&e);
     76     pe->m_nNum = 103;
     77     cout << e.m_nNum << endl; // 103
     78     cout << pe->m_nNum << endl; // 103
     79 
     80     // 第七种情况:const修饰局部变量
     81     const int xx = 50;
     82     int* yy = const_cast<int *>(&xx);
     83     *yy = 200;
     84     cout << xx << endl; // 50
     85     cout << *yy << endl; // 200
     86     int aa = xx;
     87     cout << aa << endl; // 50
     88 
     89     // 第八种情况:const修饰局部变量。去const属性后赋给一般变量
     90     const int xxx = 50;
     91     int yyy = const_cast<int&>(xxx);
     92     yyy = 51;
     93     cout << xxx << endl; // 50
     94     cout << yyy << endl; // 51
     95 
     96     // 第九种情况:const修饰局部变量。去const属性后赋给引用变量
     97     const int xxx2 = 50;
     98     int& yyy2 = const_cast<int&>(xxx2);
     99     yyy2 = 52;
    100     cout << xxx2 << endl; // 50
    101     cout << yyy2 << endl; // 52
    102 }
    103 
    104 void main()
    105 {
    106     TestFun();
    107     system("pause");
    108 }
    109 
    110 // run out:
    111 /*
    112 199
    113 1
    114 2
    115 3
    116 100
    117 101
    118 102
    119 102
    120 103
    121 103
    122 50
    123 200
    124 50
    125 50
    126 51
    127 50
    128 52
    129 请按任意键继续. . .
    130 */

    Good Good Study, Day Day Up.

    顺序 选择 循环 总结

  • 相关阅读:
    Linux的iptables和netfilter
    adb安装电视apk
    令牌桶实现服务器限流
    观察者模式代码实现
    Windows系统安装Oracle 11g 数据库
    Gitlab安装后 启动之后报错502
    Git两库合并历史记录
    Maven打包时指定对应环境的配置文件
    HierarchicalDataTemplateGridControl
    自定义CommandHandler
  • 原文地址:https://www.cnblogs.com/Braveliu/p/3616953.html
Copyright © 2011-2022 走看看