標準C 中的幾種強制型別轉換方式比較說明

2021-06-18 12:51:32 字數 3056 閱讀 8248

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修...