天天看點

C++中強制變換之const_cast

今天學習了一下C++中的強制轉換,看了const_cast,我發現了這個轉換關鍵字的奇怪之處,于是把它記錄一下,廢話不說,先看一個程式:

1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     const int val = 5;
 8     int test =5;
 9     //int *pval = &val;    //err: cannot convert from 'const int * to int *'
10     int *pval = const_cast<int *>(&val);
11     cout << "Before:" << endl;
12     cout << "  val:" << val << endl;
13     cout << "*pval:" << *pval << endl;
14     *pval = 10;
15     cout << "After:" << endl;
16     cout << "  val:" << val << endl;
17     cout << "*pval:" << *pval << endl;
18     return 0;
19 }      

以上程式列印的結果:

C++中強制變換之const_cast

一開始 *pval 和val的值都是5,因為他們指向同一位址。

C++中強制變換之const_cast

但是後來我通過給(*pval)指派,是的指針pval所指向的記憶體位址為10,然後列印去而發現val 還是等于 5 而*pval卻等于10,這是很沖突的啊,按理講他們是記憶體中同一塊位址中的内容,應該完全一樣啊,我很不解,于是我看了一下記憶體:

C++中強制變換之const_cast

以上圖中的位址就是val的記憶體位址,但是通過上面的圖可以看到,0012FF44位址處的值為 0000000A(16進制,4個位元組) = 10 (十進制)。

也就是說記憶體中的内容确實被改變了,隻是編譯器在輸出const int val時并不是讀取記憶體位址内容!為了搞懂這個問題我又彙編了一下:

C++中強制變換之const_cast

發現在輸出val值得過程中,編譯器直接将5指派給val,而不是工記憶體中讀取。這就解釋了為什麼指向記憶體中同一個位址,輸出的值卻不同!

轉載于:https://www.cnblogs.com/zhuwbox/p/3383188.html