c++ 提供四種新式轉型(常常被稱為new-style 或c++-style casts) :
const_cast( e}(expression )
dynamic_cast( expression)
reinterpret_cast( expression)
static_cast(ωψression )
各有不同的目的:
• const_cast通常被用來將物件的常量性轉除(cast away the constness) 。它也是唯一有此能力的c++-style 轉型操作符.
• dynamic_cast 主要用來執行"安全向下轉型" ( safe downcasting) ,也就是用來決定某物件是否歸屬繼承體系中的某個型別。它是唯-無法由舊式語法執行的動作,也是唯一可能耗費重大執行成本的轉型動作.有條件轉換,動態型別轉換,執行時型別安全檢查(轉換失敗返回null):
1. 安全的基類和子類之間轉換。
2. 必須要有虛函式。
3. 相同基類不同子類之間的交叉轉換。但結果是null。
•reinterpret_cast 意固執行低階轉型,實際動作(及結果)可能取決於編譯器,這也就表示它不可移植。例如將乙個pointer to int 轉型為乙個int。這一類轉型在低階**以外很少見。僅僅重新解釋型別,但沒有進行二進位制的轉換:
1. 轉換的型別必須是乙個指標、引用、算術型別、函式指標或者成員指標。
2. 在位元位級別上進行轉換。它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標(先把乙個指標轉換成乙個整數,在把該整數轉換成原型別的指標,還可以得到原先的指標值)。但不能將非32bit的例項轉成指標。
3. 最普通的用途就是在函式指標型別之間進行轉換。
4. 很難保證移植性。
• static cast 用來強迫隱式轉換(implicit conversions) ,例如將非const轉化問const,int轉換為double等,也可以執行反向轉換。但無法將const轉換為非const
static cast似於c風格的強制轉換。無條件轉換,靜態型別轉換。用於:
1. 基類和子類之間轉換:其中子類指標轉換成父類指標是安全的;但父類指標轉換成子類指標是不安全的。(基類和子類之間的動態型別轉換建議用dynamic_cast)
2. 基本資料型別轉換。enum, struct, int, char, float等。static_cast不能進行無關型別(如非基類和子類)指標之間的轉換。
3. 把空指標轉換成目標型別的空指標。
4. 把任何型別的表示式轉換成void型別。
5. static_cast不能去掉型別的const、volitale屬性(用const_cast)。
總結
去const屬性用const_cast。
基本型別轉換用static_cast。
多型類之間的型別轉換用daynamic_cast。
不同型別的指標型別轉換用reinterpreter_cast。
通常你想在乙個你認定為derived class 物件身上執行derived class 操作函式,但你的手上卻只有-個"指向base" 的pointer 或reference ,你只能靠它們來處理物件。有兩個一般性做法可以避免這個問題。
1 使用容器並在其中儲存直接指向derived class 物件的指標(通常是智慧型指標),然後,通過stl迭代器,處理該物件。但這種做法,無法在容器中,儲存指標指向所有基類的派生類。若需要處理多個派生類,則需要多個容器。
2 基類提供虛函式,使用容器,儲存基類物件指標,然後用迭代器呼叫。
絕對必須避免的一件事是所謂的"連串(cascading) dynamic_casts"
C 特有型別轉換整理
通用的型別轉換格式 型別說明符 表示式 int a b a 1.4 b 1 其實通用的型別轉換可以細分為三種型別轉換,分別是static cast,const cast,reinterpret cast.static cast 不具備去除const功能 const cast 適用於將常指標轉換為普通...
C 筆記整理(型別轉換)
string mygoddess mygoddess char mywife mygoddess 兄弟,編譯器報錯計算機裡無論什麼型別,最根本都是一些0和1組成的。變數的含義是通過翻譯這些0和1來告訴你們。byte s 10 int i s 型別 可以安全的轉換為 byte short,ushort...
mysql型別轉換c 型別轉換 C 型別轉換
一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...