有的時候,我們可以使用顯式轉換(又稱強制型別轉換),明確地告知編譯器:這種轉換正是程式所期望的,請不要再出現囉嗦的警告,如下:
short s2 = (short)100000; //ok
顯示轉換的語法如下:
(型別)表示式;
型別(表示式);
(型別)(表示式);
也就是說,如下3種形式都可以:
s2 = (short)100000; //ok
s2 = short(100000); //ok
s2 = (short)(100000); //ok
一般來說,第1種的用法更常見一些。
以上的表達方式非常簡潔,但是c++並不推薦使用該方式,而推薦使用強制型別轉換操作符(包括static_cast、dynamic_cast、reinterpret_cast和const_cast)來完成顯式轉換,它們的含義如表4-2所示。
表4-2 強制型別轉換操作符
操作符
中文名稱 含義
dynamic_cast
動態型別轉換符
支援多型而存在,
它主要用於類之間的轉換
static_cast
靜態型別轉換符
僅僅完成編譯時期的轉換檢查
reinterpret_cast
再解釋型別轉換符
完成不同型別指標之間的相互轉換
const_cast
常型別轉換符
用來修改型別的const或volatile屬性
接下來我們將簡單回顧一下這些操作符,它們在visual c++**中經常出現。
1.動態型別轉換符dynamic_cast
dynamic_cast為支援多型而存在,它主要用於類之間的轉換,包括向下轉換(downcast)和向上轉換(upcast)。向下轉換即將乙個指向基類的指標或引用轉換成乙個指向派生類的指標或引用,如:
void cmymenu::updatemenu(cmenu *pmenu)
當使用dynamic_cast嘗試進行指標的非法轉換時,指標的值會被賦成0。當這個非法轉換是針對引用而進行時,c++會丟擲乙個bad_cast異常來通知這個錯誤。
2.靜態型別轉換符static_cast
靜態型別轉換僅僅完成編譯時期的轉換檢查,它一般用於如下場合。
用於類層次結構中基類和子類之間指標或引用的轉換。進行向上轉換(把子類的指標或引用轉換成基類表示)是安全的(向上轉換一般都是隱式轉換,這時候 實際上根本就沒有必要使用靜態型別轉換);進行向下轉換(把基類指標或引用轉換成子類表示)時,由於沒有動態型別檢查,所以是不安全的。
完成任何型別的指標與void之間的轉換。
將空指標(0)轉換成目標指標型別。
用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要由程式設計師來保證。
3.再解釋型別轉換符reinterpret_cast
再解釋型別轉換完成的都是一些不可思議的型別轉換。實際上,所有指標的值都是乙個表示位址的數值,值本身的轉換是沒有任何問題的。所謂"再解釋",是指對指標的型別(如:int *和double *)進行重新解釋。
再解釋型別轉換reinterpret_cast完成不同型別指標之間的相互轉換,同時也支援將指標與數字之間的轉換,如下**:
void cmylist::oncustomdraw(nmhdr *pnmhdr, lresult *presult)
該段**在mfc原始碼中比較常見,它將nmhdr指標重新解釋成nmlvcustomdraw指標。
4.常型別轉換符const_cast
常型別轉換const_cast用來修改型別的const或volatile屬性。除了const 或volatile修飾之外,其操作物件的型別和目標型別必須是一樣的。
C 顯式轉換
標準c 包含乙個顯式的轉換語法 static cast 用於 良性 和 適度良性 的轉換,包括不用強制轉換 const cast 用於 const 和 或 volatile 進行轉換 reinterpret cast 轉換為完全不同的意思。為了安全的使用它,關鍵必須轉換回原來的型別。轉換成的型別一般...
C 顯式轉換
任何具有明確定義的型別轉換,只要不包含底層const,都可以使用static cast c primer 更為簡單的解釋就是,使用這個型別轉換符,能夠進行比較自然的轉換,類別相近的轉換,而有一些型別差距明顯的轉換則不可以,例如 不能用於不同型別的指標之間轉換 void 除外 不能用於整型與指標之間的...
C 顯式型別轉換
對於型別轉換,我在查資料的時候看到了一種很有意思的解釋,我們可以這樣理解型別轉換 某塊記憶體中的資料是不變的,而型別就是我們戴上的眼鏡,當我們戴上一種眼鏡後,我們就會用對應的型別來解釋記憶體中的資料,這樣不同的解釋就得到了不同的資訊。所謂強制型別轉換實際上就是換上另一副眼鏡後再來看同樣的那塊記憶體資...