看起來,使用c風格的強制轉換可以把想要的任何東西轉換成合乎心意的型別。那為什麼還需要乙個新的c++型別的強制轉換呢?新型別的強制轉換可以提供更好的控制強制轉換過程,允許控制各種不同種類的強制轉換。
c++裡有4種不同型別的強制轉換操作,取決於要強制轉換的東西:static_cast、const_cast、reinterpret_cast和dynamic_cast。
c++強制轉換操作與傳統的強制轉換相比,有一點語法上的細微差別。稍微有點冗長,而且在**裡有點突出。但是不要因為多敲幾下鍵盤就煩了,它也比c風格的cast更能體現強制轉換,新風格的cast是下面的格式:
static_cast(expression)
下面的**使用了c++風格的cast:
//c++ -style cast
float f2 = static_cast(n) / 100; //cast to a float
c++風格的強制轉換其他的好處是,它們能更清晰的表明它們要幹什麼。程式設計師只要掃一眼這樣的**,就能立即知道乙個強制轉換的目的。是的,需要多敲幾下鍵盤,但是確實值得。
1.static_cast
static_cast操作是比c風格的轉換的更嚴格版本。它會通知編譯器,嘗試著在兩種資料型別之間進行轉換。和c風格的轉換一樣,它能在內建的資料型別間互相轉換,甚至在有可能有精度損失的情況下也能轉換。然而和c風格的轉換不一樣的是,static_cast只能在有聯絡的指標型別間進行轉換。可以在繼承體系中把指標轉換來、轉換去,但是不能轉換成繼承體系外的一種型別。
class a
;class b : public a
;//unrelated to a and b
class c
;a * a = new a;
// ok, b is a child of a
b *b = static_cast(a);
// compile error. c is unrelated to a
c * c = static_cast(a);
// the old c cast would work just fine (but what would
// the program do?)
c * c = (c*)(a);
其餘的不同在於,static_cast不能實行對常量的改變。和c風格的強制轉換一樣,如果不能把乙個型別強制轉換成另外乙個,那轉換就會失敗。
2.const_cast
const_cast操作不能在不同的種類間轉換。相反,它僅僅把乙個它作用的表示式轉換成常量。它可以使乙個本來不是const型別的資料轉換成const型別的,或者把const屬性去掉。通常,沒有必要把乙個非const型別的資料轉換成const型別的。這種轉換會自動進行,因為這是乙個不太嚴格的轉換。換句話說,從const到非const,只能通過強制轉換來進行。被迫使用const_cast表明有東西沒有正確地符合程式的設計。大多數使用const_cast的情況是由於呼叫老式的用const修飾的函式。如果發現呼叫自己的函式,竟然使用了const_cast,那就趕緊打住,重新考慮一下設計吧。
3.reinterpret_cast
reinterpret_cast操作符有著和c風格的強制轉換同樣的能力。它可以轉化任何內建的資料型別為其他任何的資料型別,也可以轉化任何指標型別為其他的型別。它甚至可以轉化內建的資料型別為指標,無須考慮型別安全或者常量的情形。reinterpret_cast的結果就是實現的依賴性,它依靠每乙個要轉換物件的特定記憶體分布。使用reinterpret_cast 的場合不多,僅在非常必要的情形下,其他型別的強制轉換不能滿足要求時才使用。
4.dynamic_cast
在第2章裡討論了多繼承的問題,曾簡單地提到dynamic_cast。所有其他的強制轉換操作都是編譯器在編譯期處理的。至於轉換的結果要麼正常實現,要麼導致乙個編譯錯誤。無論哪種情況,都不涉及到執行期開銷。但是dynamic_cast有著顯著的不同。dynamic_cast 僅能應用於指標或者引用,不支援內建資料型別。然而關鍵的不同在於,在執行期,會檢查這個轉換是否可能。它不僅僅像static_cast那樣,檢查轉換前後的兩個指標是否屬於同乙個繼承樹,它還要檢查被指標引用的物件的實際型別,確定轉換是否可行。如果可以,它返回乙個新指標,甚至計算出為處理多繼承的需要的必要的偏移量。如果這兩個指標間不能轉換,轉換就會失敗,此時返回空指標(null)。很明顯,為了讓dynamic_cast能正常工作,必須讓編譯器支援執行期型別資訊(rtti)。如果不希望編譯器支援rtti,則必須找到dynamic_cast的替代方法。
C 風格的強制性型別轉換
顯示型別轉換 被稱為強制型別轉換 cast c風格 type id c 風格 static cast,dynamic cast,reinterpret cast,const cast 在 c 的設計和演化 中告訴我們,解決強制性型別轉換的最好的解決方法是使用標準的c 的型別轉換,也就是上面提到的四個...
C的強制轉換和C 的強制轉換
c的強制轉換 type 其中,type為型別描述符,如int,float等。為表示式。經強制型別轉換運算子運算後,返回乙個具有type型別的數值,這種強制型別轉換操作並不改變運算元本身,運算後運算元本身未改變,例如 int nvar 0xab65 char cchar char nvar 上述強制型...
C 強制轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...