ansi-c++
新標準定義的四個轉換符,即
static_cast
、dynamic_cast
、reinterpret_cast
和const_cast
。同時在
c++環境中,原先的
c-style
的型別轉換仍舊可以使用。
1) static_cast
用法:static_cast (expression)
說明:該運算子把
expression
轉換為typeid
型別,但沒有執行時型別檢查來確保轉換的安全性。
用途: a)
用於類層次結構中基類和派生類之間指標或者引用的轉換。
up-casting (
把派生類的指標或引用轉換成基類的指標或者引用表示
)是安全的;
down-casting(
把基類指標或引用轉換成子類的指標或者引用
)是不安全的。 b)
用於基本資料型別之間的轉換,如把
int轉換成
char
,這種轉換的安全性也要由開發人員來保證。 c)
可以把空指標轉換成目標型別的空指標
(null pointer)。
d)把任何型別的表示式轉換成
void
型別。
注意:static_cast
不能轉換掉
expression
的const
、volitale
或者__unaligned
屬性。
2) dynamic_cast
用法:dynamic_cast (expression)
說明:該運算子把
expression
轉換成typeid
型別的物件。
typeid
必須是類的指標、類的引用或者
void*
。如果typeid
是類的指
針型別,那麼
expression
也必須是指標,如果
typeid
是乙個引用,那麼
expression
也必須是乙個引用。一般情況下,
dynamic_cast
用於具有多型性的類
(即有虛函式的類
)的型別轉換。
dynamic_cast
依賴於rtti
資訊,其次,在轉換時,
dynamic_cast
會檢查轉換的
source
物件是否真的可以轉換成
target
型別,這種檢查不是語法上的,而是真實情況的檢查。先看
rtti
相關部分,通常,許多編譯器都是通過
vtable
找到物件的
rtti
資訊的,這也就意味著,如果基類沒有虛方法,也就無法判斷乙個基類指標變數所指物件的真實型別,這時候,
dynamic_cast
只能用來做安全的轉換
,例如從派生類指標轉換成基類指標
.而這種轉換其實並不需要
dynamic_cast
參與。也就是說
,dynamic_cast
是根據rtti
記載的資訊來判斷型別轉換是否合法的。
用途:主要用於類層次之間的
up-casting
和down-casting
,還可以用於類之間的交叉轉換。在進行
down-casting時,
dynamic_cast
具有型別檢查的功能,比
static_cast
更安全。檢測在執行時進行。如果被轉換的指標不是乙個被請求的有效完整的物件指標,返回值為
null
。當用於多型型別時,它允許任意的隱式型別轉換以及相反過程。不過,與
static_cast
不同,在後一種情況裡(注:即隱式轉
換的相反過程),
dynamic_cast
會檢查操作是否有效。
也就是說,它會檢查轉換是否會返回乙個被請求的有效的完整物件。
注意:dynamic_cast
不能轉換掉
expression
的const
、volitale
或者__unaligned
屬性。
3) reinterpret_cast
用法:reinterpret_cast (expression)
說明:轉換乙個指標為其他型別的指標,也允許將乙個指標轉換為整數型別,反之亦然。這個操作符能夠在非相關的型別之間
進行轉換。操作結果只是簡單的從乙個指標到別的指標的值的二進位制拷貝,在型別之間指向的內容不做任何型別的檢查和轉換。這是乙個強制轉換。使用時有很大的風險,慎用之。
注意:reinterpret _cast
不能轉換掉
expression
的const
、volitale
或者__unaligned
屬性。
4) const_cast
用法:const_cast(expression)
說明:這個型別操縱傳遞物件的
const
屬性,或者是設定或者是移除。如:
class c
const c* a = new c;
c* b = const_cast(a);
如果將上面的
const_cast
轉換成其他任何其他的轉換,編譯都不能通過,出錯的信心大致如下: 「
…cannot convert from 'const class c *' to 'class c *'」。
下面的**是4中
casting
方法的典型用法示例:
#include
using namespace std;
class base
}; class derived : public base
}; int main(void)
標準C 強制型別轉換
1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 算術型別或列舉型別。表示式static cast t a a的值轉換為模板中指定的型別t。在執行時轉換過程中,不進行型別檢查來確保轉換的安全性。2 dynamic cast a 完成類層次結構中的提公升。t必須是乙個指標 ...
標準C 中的強制型別轉換符
const cast,reinterpret cast,static cast,dynamic cast等等。1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 算術型別或列舉型別。表示式static cast a a的值轉換為模板中指定的型別t。在執行時轉換過程中,不進行...
C 中型別強制轉換
c 中有4種強制轉換 const cast,static cast,dynamic cast,reinterpret cast,以下將分別介紹 1.const cast 形式const cast expression 用來修改型別的const或volatile屬性,除了const或volatile修...