C++類型轉換關鍵字 *_cast (expression)

 在C/C++語言中用(type)value(在C++中還可以採用type(value))來進行顯示類型轉換(explicit type conversion),常常又被稱爲強制轉換。這種轉換的正確性完全掌握在程序員手中,傳統上強制轉換往往被過度使用,成爲C++程序犯錯的一個主要根源。
     爲了減少強制轉換的副作用,並且在查錯時使程序員能夠快速定位強制轉換,在標準C++中新增加了4個關鍵字*_cast,用來提倡一種全新的C++顯示轉換語法:
     *_cast<type> (exotrssion)
1. static_cast(靜態轉換):用於明確定義良性和適度良性的轉換,包括原來不需要採用強制轉換的自動類型轉換(包括無損的提升轉換和可能丟失信息的窄化轉換narrowing conversion),對後者編譯器一般會提出告警。標準C++提倡對任何數據的類型轉換(不論是自動的還是強制的),都採用新的*_cast顯式類型轉換方法。例如:
     int i = 0x7fff;
     long l;
     float f;
     char c;
     // 典型的非強制轉換(自動轉換
     //傳統方式
     l = i;
     f = i;
     l = static_cast<long>(i);
     f = static_cast<float>(i);
     
     //窄化轉換,截斷,強制轉換
     i = l;
     i = f;
     c = i;
     //不顯示警告,傳統強制轉換
     i = (int)l;
     i = (int)f;
     c = (char)i;
     i = static_cast<int>(i);
     i = static_cast<int>(f);
     c = static_cast<char>(i);

2. const_cast(常量轉換),可將(同數據類型的)常量型const轉換爲非常型、將易變(volatile)型轉換爲非易變性。如果用於其他類型的轉換,一般會產生一個編譯錯誤。例如:
     const int i = 0l
     int *pi;
     //錯誤
     //pi = &i; 
     //被反對
     pi = (int *)&i;
     //完美做法,同類型常型和非常型轉換
     pi = const_cast<int *>(&i);
     //錯誤,不同類型的常型和非常型轉換
     long *pl = const_cast<long *>(&i);
     //完美做法,同類易變型和非易變型轉換
     volatile int k = 0;
     int *pk = const_cast<int *>(&k);
3. dynamic_cast(動態轉換),一種安全的向下類型轉換操作沒用於在一個類繼承層次上向下移動。因爲每個派生類的基類都只有一個,而且派生類本身又包含了基類幾乎所有的信息(private除外),所以向上的類型轉換總是唯一的和安全的。而一個基類往往有多個派生類,而且派生類中一般會在基類的基礎上添加了一些特有的數據和操作,所以向下的類型轉換總是多態的和不安全的。
dynamic_cast提供了一種安全的向下類型轉換操作,只有當類型轉換是正確地並且轉換取得成功,返回值纔是所需要的指針,否則將返回0(空指針NULL),表示不正確的類型。
dynamic_cast雖然安全,但是運行時需要一定的開銷,因此不提倡大量使用。如果已經能夠確認轉換的正確性,可以採用static_cast轉換,無運行時開銷。只有當你實在無法確定轉換是否正確時,才需要dynamic_cast轉換。

4. reinterpret_cast(重解釋轉換),轉換一個指針爲其他類型的指針,能夠在非相關的類型之間轉換。一種最有可能出問題的最不安全的類型轉換。只是在下面的情形才需要使用這種類型轉換:當需要使用時,所得到的東西已經不同了,爲了使它能夠用於原來的目的,必須再次把它轉換回來。
     const int sz = 100;
     struct X {int a[sz];}
     X x;
     int *px = reinterpret_cast<int *>(&x); //爲了初始化,先把結構轉化爲Int數組
     for (int *i = px; i < px + sz; i ++)
     {
          *i = 0;
     }
     print(reinterpret_cast<X *>(px)); //重新轉換成結構指針。

四種強制轉換中,static_cast最常用,dynamic_cast最重要,const_cast也有用,reinterpret_cast很少用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章