C++提供四種類型轉換:const_cast、static_cast、dynamic_cast、reinterpret_cast
1.const_cast
const_cast的存在主要就是針對const字段,C++提供const_cast的目的就是爲了消除const字段的const屬性,讓const字段也可以修改。
const_cast的用法:
const_cast只能將常指針轉換爲非常指針,不能直接將常字段轉換爲非常字段,只能通過指針類間接的修改常字段所在的內存的內容。
例:
const int a = 1;
const int* n = &a;
int* m = const_cast<int*>(n) ;
*m = 2;
最終的輸出結果:
a = 1,*n = 2,*m = 2
&a=n=m
奇怪,指針n,m的確指向了地址&a,之中的內容的確也修改成了2,可爲什麼字段a的值依舊是1?
經過多方查閱資料和自己的試驗,原來對於常字段在預編譯的過程中編譯器就會給常字段預定義爲初始化的值,類似宏定義一般,儘管內存的內容被改變了,但是常字段的值依舊被預定義爲初始化的值。
但是,我就疑問了,既然const_cast就是用來修改const字段的,可是隻是改變了其內存的值,字段的值依舊沒變,那麼程序裏使用該字段的地方的值依舊沒有改變,如此const_cast似乎沒有達到想要的結果。
2.static_cast
static_cast類型轉換的用法幾乎和C中的基本類型轉換的用法一致,而C++的static_cast類型轉換增加的類型檢查,在安全性上較C要強。
static_cast支持所有類型之間的轉換包括類,對於類在繼承過程中的類型轉換有兩點是需要注意的,一、static_cast類型轉換在上行轉換是安全的,在下行轉換是不安全,(上行轉換:從子類轉換到父類,下行轉換:從父類轉換到子類),二、static_cast類型轉換在類的轉換中因該使用指針轉換,即通過指針間接的實現轉換,直接對類的對象進行轉換類型會被裁剪,並且在下行轉換中不使用指針會報錯。
3.dynamic_cast
dynamic_cast類型轉換用於類之間的上下行轉換,與static_cast不同的是,dynamic_cast類型轉換無論上下行都具有類型檢查,都可以進行安全的類型轉換。上行轉換dynamic_cast與static_cast完全一致,下行轉換dynamic_cast比static_cast更安全
4.reinterpret_cast
reinterpret_cast類型轉換隻能對指針進行操作,reinterpret_cast類型轉換提供的是一種更底層的轉換模式–比特位上的重新解釋,即對某一類型的內存地址的比特位以另一種類型來解釋,這可能不好理解,在這放一張圖來輔助理解。
p是指向字符串的char類型指針,i是指向整型的指針,i = reinterpret_cast<int*>§則將p所指向的內存裏的比特位以int類型來重新解釋並複製到i所指向的內存地址上,於是在輸出 *i 時,輸出的是一個整型的數值。
至於爲什麼cout<<p時不是輸出的p所指向的地址而是地址裏的內容,我始終沒有弄明白,不過不影響對reinterpret_cast類型轉換的理解。