強制類型轉換(const_cast)

【1】 const_cast的做用ios

1、常量指針 被強轉爲 很是量指針,且仍然指向原來的對象; spa

2、常量引用 被強轉爲 很是量引用,且仍然指向原來的對象; 指針

3、常量對象 被強轉爲 很是量對象。 code

【2】 實例代碼對象

代碼以下:blog

  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.io

順序 選擇 循環 總結ast

相關文章
相關標籤/搜索