標準C 的型別轉換

2021-09-30 07:09:33 字數 2924 閱讀 5485

c++通過引進四個新的型別轉換操作符克服了c風格型別轉換的缺點,這四個操作符是:

const_cast( expression )

dynamic_cast( expression )

static_cast( expression )

reinterpret_cast( expression )

在大多數情況下,對於這些操作符你只需要知道原來你習慣於這樣寫:

(type) expression

而現在你總應該這樣寫:

static_cast (expression)

例如,假設你想把乙個int轉換成double,以便讓包含int型別變數的表示式產生出浮點數值的結果。如果用c風格的型別轉換,你能這樣寫:

int firstnumber, secondnumber;

double result = ((double)firstnumber)/secondnumber;

如果用上述新的型別轉換方法,你應該這樣寫:

double result = static_cast(firstnumber)/secondnumber;

這種形式十分容易被辨識出來,不論是對人類還是對工具程式而言。

這四個轉型操作符各司其職:

1 static_cast

基本上擁有與c舊式轉型相同的威力與意義,以及相同的限制。

用法:static_cast < type-id > ( expression )

該運算子把expression轉換為type-id型別,但沒有執行時型別檢查來保證轉換的安全性。它主要有如下幾種用法:

①用於類層次結構中基類(父類)和派生類(子類)之間指標或引用的轉換。

進行上行轉換(把派生類的指標或引用轉換成基類表示)是安全的;

進行下行轉換(把基類指標或引用轉換成派生類表示)時,由於沒有動態型別檢查,所以是不安全的。

②用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。

③把空指標轉換成目標型別的空指標。

④把任何型別的表示式轉換成void型別。

注意:static_cast不能轉換掉expression的const、volitale、或者__unaligned屬性。

例如將int轉換為 double。

int testnum;

static_casttestnum;

static_cast可以將乙個非 const 的物件轉換為 const 物件,但是他無法將const轉為non-const,這個只有const-cast才能夠辦到。也不能將int或者struct轉換成pointer,這個轉換在c裡面也是不允許的。

如果是乙個類,就呼叫型別轉換函式,比如:

2  const_cast

通常用來將物件的常量性轉除(cast away the constness)。它是唯一有此能力的c++-style轉型操作符。

const int a =314;

a=2;//錯誤的

int *p = &a;

*p=3;//錯誤的

c++會報錯,因為&a是const int *,不能將乙個const指標或引用賦給指標或初始化引用。換成這樣就行了:

int *p=const_cast(&a);

編譯器放給了你這樣的權力,如果你這樣寫,表明你能為它的後果負責。

現在我只需要記住。const_cast最重要的作用就是去除常量性。

3 dynamic_cast

用來執行繼承體系中安全的向下轉型或跨系轉型動作。也就是說你可以利用它將指向基類物件的指標或者引用轉型為指向派生類物件的指標或引用,並得知轉型是否成功。不同於static_cast,dynamic_cast轉換乙個基類指標到子類指標的轉型,會做動態型別檢查,所以是安全的。如果轉型失敗,會以乙個null指標(當轉型物件是指標)或乙個exception(當轉型物件是引用)表現出來。dynamic_cast是唯一無法由舊式語法執行的轉型動作,也是唯一可能消耗重大執行成本的轉型動作。

上面的操作用dynamic_cast是可以支援的

a* pa = new ab;

update(dynamic_castpa);

注意的是關於此操作符的返回值

如果表示式是pointer ,轉換失敗的話會得到乙個null

如果............是ref,........................會丟擲乙個異常

dynamic_cast只能做這一型別的轉換,請不要嘗試去用dynamic_cast改變表示式的常量性,也無法在缺乏虛函式的型別上使用(比如int to double,這樣的轉換得使用static_cast)

執行結果:

d2.foo

d2.foo3

4 reinterpret_cast

意圖執行低階轉型,實際動作及結果可能取決於編譯器,這也就表示它不可移植。例如將乙個pointer to int 轉型為int。這一類轉型在低階**以外很少見。

他最常用途是轉換(函式指標)的型別

有乙個儲存函式指標的陣列,裡面指標指向函式的return 都是void

但是你現在有個函式return為int,這個時候如果你想把這個函式放進funcptrarray

如果沒有轉型是可能實現的

typedefine void  (*funcptr())

int func();

funcptrarray[0] = &func;//錯誤,型別不對

funcptrarray[0]  = reinterpret_cast(funcptr)(&func);//正確  

對於位元組數相同的型別,例如整形和指標型,可以實現完全的按位轉換。這意味著你可以把乙個整數賦給乙個指標,也可以把乙個指標轉換成整數,也可以實現各種不相容指標的轉換。 

對於位元組數不同的型別,這個操作符不能使用。例如 

int   x   =   reinterpret_cast (3.14) 

就是錯誤的

標準C 強制型別轉換

1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 算術型別或列舉型別。表示式static cast t a a的值轉換為模板中指定的型別t。在執行時轉換過程中,不進行型別檢查來確保轉換的安全性。2 dynamic cast a 完成類層次結構中的提公升。t必須是乙個指標 ...

使用標準C 的型別轉換符

使用標準c 的型別轉換符 static cast dynamic cast reinterpret cast 和const cast。3.1 static cast 用法 static cast type id expression 該運算子把expression轉換為type id型別,但沒有執行...

標準C 中的強制型別轉換符

const cast,reinterpret cast,static cast,dynamic cast等等。1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 算術型別或列舉型別。表示式static cast a a的值轉換為模板中指定的型別t。在執行時轉換過程中,不進行...