1、reinterpret_cast
reinterpret_cast
< type-id > ( expression )
reinterpret_cast轉換乙個指標為其它型別的指標。它也允許從乙個指標轉換為整數型別。反之亦然。
這個操作符能夠在非相關的型別之間轉換。操作結果只是簡單的從乙個指標到別的指標的值的二進位制拷貝。在型別之間指向的內容不做任何型別的檢查和轉換。
如果情況是從乙個指標到整型的拷貝,內容的解釋是系統相關的,所以任何的實現都不是方便的。乙個轉換到足夠大的整型能夠包含它的指標是能夠轉換回有效的指標的。
int main()
2、static_cast
static_cast
< type-id > ( expression )
static_cast允許執行任意的隱式轉換和相反轉換動作。(即使它是不允許隱式的)
應用到類的指標上,意思是說它允許子類型別的指標轉換為父類型別的指標(這是乙個有效的隱式轉換),同時,也能夠執行相反動作:轉換父類為它的子類。
在這最後例子裡,被轉換的父類沒有被檢查是否與目的型別相一致。
class a
{};class b
{};class base
{};class derive :public base
{};//...
derive* d = new derive;
base* b = static_cast
(d);
cout
<< typeid(b).name() << endl;
base* b1 = new base;
derive* d1 = static_cast
(b1);
cout
<< typeid(d1).name() << endl;
static_cast除了操作型別指標,也能用於執行型別定義的顯式的轉換,以及基礎型別之間的標準轉換:
double _a = 13.14;
int _b= static_cast
(_a);
3、dynamic_cast
dynamic_cast只用於物件的指標和引用。當用於多型型別時,它允許任意的隱式型別轉換以及相反過程。不過,與static_cast不同,在後一種情況裡(注:即隱式轉換的相反過程),dynamic_cast會檢查操作是否有效。也就是說,它會檢查轉換是否會返回乙個被請求的有效的完整物件。
檢測在執行時進行。如果被轉換的指標不是乙個被請求的有效完整的物件指標,返回值為null.
class _base
};class _derive :public _base
{};//...
_base* _b1 = new _base;
_base* _b2 = new _derive;
_derive* _d2 = dynamic_cast
<_derive>(_b2);
cout
<< typeid(_d2).name() << endl;
_derive* _d1 = dynamic_cast
<_derive>(_b1);//錯誤,會返回null
cout
<< typeid(_d1).name() << endl;
結果如下:
由上圖可見,_d1不是有效完整的指標(基類的指標不能被轉換為派生類),所以會為他將它的值賦為null,程式將會崩潰。
如果乙個引用型別執行了型別轉換並且這個轉換是不可能的,乙個bad_cast的異常型別被丟擲。
4、 const_cast
這個轉換型別操縱傳遞物件的const屬性,或者是設定或者是移除。
C 四種強制型別轉換關鍵字
c語言使用強制型別轉換 type cast 很簡單,不管什麼型別的轉換,形式都如下 type b type a c 提供了4種型別轉換操作符來應對不同場合的應用。const cast static cast dynamic cast reinterpreter cast 4種關鍵字的使用形式如下 t...
C 四種強制型別轉換關鍵字
型別轉換有c風格的,當然還有c 風格的。c風格的轉換的格式很簡單 type expression,但是c風格的型別轉換有不少的缺點,有的時候用c風格的轉換是不合適的,因為它可以在任意型別之間轉換,比如你可以把乙個指向const物件的指標轉換成指向非const物件的指標,把乙個指向基類物件的指標轉換成...
c 四種型別轉換的關鍵字
1 reinterpret cast expression type id 必須是乙個指標 引用 算術型別 函式指標或者成員指標。它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標 先把乙個指標轉換成乙個整數,再把該整數轉換成原型別的指標,還可以得到原先的指標值 static cast和...