const_cast
const_cast用于添加或者刪除指針或者引用的const屬性,但是對于刪除const屬性的功能有一些bug:
可以構造結構體或者類的非const指針或者引用給新變量,但是原變量的const屬性不變化,新變量可以修改對應的內容;但是如果是一個基本類型的const變量,譬如cosnt char *,const int等等,不會修改其內容。
所以,還是應該遵從這樣的原則:使用const_cast去除const限定的目的絕對不是為了修改它的內容(來自:http://www.cnblogs.com/ider/archive/2011/07/22/cpp_cast_operator_part2.html)其中有些觀點很有概括性,譬如:C++對于指針的轉換是任意的,它不會檢查類型,任何指針之間都可以進行互相轉換。int * 可以強制轉換為float*,const int *可以強制轉換為int *,int *可以轉換為char *
以下轉自:http://blog.csdn.net/lwbeyond/article/details/6213382
1. 常量指針被轉化成非常量指針,轉換后指針指向原來的變量(即轉換后的指針地址不變)。
[c-sharp]?view plaincopy
第一個工作正常,但后一個程序不能正常工作!!我繼續嘗試了不同的類型,比如char,short ,float,double等,發現了規律,凡是對結構體或類進行這個轉換,都是成功的,但對char, short等基本類型的轉換都沒有成功。這是為什么呢?反匯編如下:
反匯編發現,雖然我沒有使用優化,但系統還是對ica這個const進行了預編譯般的替換,將它替換成“64h”(十六進制的64就是十進制的100)。其實ica地址上的值已經變了,這點從ia的輸出可以看出,但由于系統對這個ica進行了預編譯替換,從而導致輸出ica的值沒有變。這算是個C++的bug吧。
?
2. 常量引用被轉換成非常量引用。
[c-sharp]?view plaincopy
同樣有上面那個問題,原因也是一樣的。
?
3. 常量對象(或基本類型)不可以被轉換成非常量對象(或基本類型)。
[c-sharp]?view plaincopy
記住這種轉換只是開了一個接口,并不是實質上的轉換。(其實也算是實質上的轉換了,只不過表達上不允許這樣寫)
?
4. 添加const屬性
[c-sharp]?view plaincopy
三. 總結:
1. 使用const_cast去掉const屬性,其實并不是真的改變原類類型(或基本類型)的const屬性,它只是又提供了一個接口(指針或引用),使你可以通過這個接口來改變類型的值。也許這也是const_case只能轉換指針或引用的一個原因吧。
?
2. 使用const_case添加const屬性,也是提供了一個接口,來不讓修改其值,不過這個添加const的操作沒有什么實際的用途(也許是我認識太淺了)。
?
3. 從對基本類型(int,char)的輸出來看,使用const_case轉換后的輸出有點像鬧劇!也許const_case只是給編譯器用的。
?
4. 唉,使用const_case可能就是不讓你用const_case?!
總結
以上是生活随笔為你收集整理的const_cast的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用canal同步MySQL数据到Ela
- 下一篇: static_const和reinter