1、static_cast 用法:static_cast < type-id > ( expression ) 該運算子把expression轉換為type-id型別,但沒有執行時型別檢查來保證轉換的安全性。
它主要有如下幾種用法: 用於類層次結構中基類和子類之間指標或引用的轉換。進行上行轉換(把子類的指標或引用轉換成基類表示)是安全的;進行下行轉換(把基類指標或引用轉換成子類表示)時,由於沒有動態型別檢查,所以是不安全的。 用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。 把空指標轉換成目標型別的空指標。 把任何型別的表示式轉換成void型別。 注意:static_cast不能轉換掉expression的const、volitale、或者unaligned屬性。
2、dynamic_cast 用法:dynamic_cast < type-id > ( expression ) 該運算子把expression轉換成type-id型別的物件。type-id必須是類的指標、類的引用或者void *;如果type-id是類指標型別,那麼expression也必須是乙個指標,如果type-id是乙個引用,那麼expression也必須是乙個 引用。 dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。 在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全。
class b;
class d:public b;
void func(b *pb)
在上面的**段中,如果pb指向乙個d型別的物件,pd1和pd2是一樣的,並且對這兩個指標執行d型別的任何操作都是安全的;但是,如果pb指向的是乙個 b型別的物件,那麼pd1將是乙個指向該物件的指標,對它進行d型別的操作將是不安全的(如訪問m_szname),而pd2將是乙個空指標。
另外要注意:b要有虛函式,否則會編譯出錯;static_cast則沒有這個限制。這是由於執行時型別檢查需要執行時型別資訊,而這個資訊儲存在類的虛函式表 (關於虛函式表的概念,詳細可見)中,只有定義了虛函式的類才有虛函式表,沒有定義虛函式的類是沒有虛函式表的。 另外,dynamic_cast還支援交叉轉換(cross cast)。如下**所示。
class a
};class b:public a;
class d:public a;
void foo()
在函式foo中,使用static_cast進行轉換是不被允許的,將在編譯時出錯;而使用 dynamic_cast的轉換則是允許的,結果是空指標。
3、reinpreter_cast 用法:reinpreter_cast(expression) type-id必須是乙個指標、引用、算術型別、函式指標或者成員指標。它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標(先把乙個指標轉換成乙個整數,再把該整數轉換成原型別的指標,還可以得到原先的指標值)。 該運算子的用法比較多。
4、const_cast 用法:const_cast(expression) 該運算子用來去除型別的const或volatile屬性。除了const或volatile修飾之外,type_id和expression的型別是一樣的,且type_id必須為指標或引用型別。常量指標被轉化成非常量指標,並且仍然指向原來的物件;常量引用被轉換成非常量引用,並且仍然指向原來的物件;常量物件被轉換成非常量物件。voiatile和const類似。舉如下一例:
class b
;~b(){};
public:
int m_inum;
};void foo()
上面的**編譯時會報錯,因為b1是乙個指向常量物件的指標,其所指物件不能被修改,b3是乙個常量物件,不能對它進行改變;使用const_cast把它所指或所引用的常量物件的常量屬性去掉後,就可以對它的資料成員任意改變。注意:b3和b4是兩個不同的物件。
C 四種強制型別轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...
c 四種型別轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a。c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...
C 四種強制型別轉換
1 概述 去const屬性用const cast。基本型別轉換用static cast。多型類之間的型別轉換用daynamic cast。不同型別的指標型別轉換用reinterpreter cast。2 詳解加示例 a const cast 用法 const cast 型別 表示式 用途 刪除con...