目錄:
c風格型別轉換
c++型別轉換
1. static_cast 型別轉換
2. const_cast 修改const屬性
— 例:
3. dynamic_cast 基類和派生類間的轉換
4. reinterpret_cast 任意指標/引用型別轉換 (不安全)
型別轉換有c風格的,當然還有c++風格的。c風格的轉換的格式很簡單
type a = (type)expression;
但是c風格的型別轉換有不少的缺點,有的時候用c風格的轉換是不合適的,因為它可以在任意型別之間轉換,比如你可以把乙個指向const物件的指標轉換成指向非 const物件的指標,把乙個指向基類物件的指標轉換成指向乙個派生類物件的指針, 這兩種轉換之間的差別是巨大的,但是傳統的c語言風格的型別轉換沒有區分這些。
另乙個缺點就是,c風格的轉換不容易查詢,它由乙個括號加上乙個識別符號組成,而這樣的東西在c++程式裡一大堆。
c++為了克服這些缺點,引進了4個新的型別轉換操作符,他們是:static_cast, const_cast,dynamic_cast,reinterpret_cast
常用的型別轉換符,在正常狀況下的型別轉換,用於將一種資料型別轉換成另一種資料型別,如把int轉換為float
int inumber =
100;
float fnumber =
0; fnumber =
(float
) inumber;//c風格
fnumber =
static_cast
<
float
>
(inumber)
;
也可以完成指標之間的轉換,例如可以將void*指標轉換成其他型別的指標
void
* pvoid =
malloc
(sizeof
(int))
;int
* pint =
static_cast
<
int*
>
(pvoid)
;*pint =
1;
但不能完成任意兩個指標型別間的轉換
int inumber =1;
int* pint =
&inumber;
float
* pfloat =
static_cast
<
float
*>
(pint)
;//error
總的來說,static_cast 的用法主要有以下幾種:
該運算子用來修改型別的const屬性(c++primer 稱作「去掉const性質」)。常量指標被轉化成非常量指標,並且仍然指向 原來的物件;常量引用被轉換成非常量引用,並且仍然指向原來的物件;常量物件 被轉換成非常量物件。
const
int number =
100;
int* pint =
&number;
//error
int* pint2 =
const_cast
<
int*
>
(&number)
;
例:
#include
#include
#include
using std::cout;
using std::endl;
// c 風格型別轉換
void
func1()
// c++ static_cast基本資料型別轉換
void
func2()
void
func3()
void
func4()
intmain()
func4 中 pint 和 &val 為同一位址,但是對 *pint 的改變無法改變 val 的值(const 誠不欺我?),兩個值不一樣了,具體參見【c++標準轉換運算子const_cast】
const_cast 只能用於改變表示式的常量屬性,不能用於改變型別
該運算子主要用於基類和派生類間的轉換,尤其是向下轉型的用法中。
該運算子可以用來處理無關型別之間的轉換,即用在任意指標(或引用)型別之間 的轉換,以及指標與足夠大的整數型別之間的轉換。由此可以看出, reinterpret_cast 的效果很強大,但錯誤的使用reinterpret_cast 很容易導致程式的不安全,只有將轉換後的型別
C 強制轉換之static cast
static cast 用法 static cast expression 簡介 該運算子把expression轉換為type id型別,但沒有執行時型別檢查來保證轉換的安全性。主要有以下幾種用法 1.用於類層次結構中基類和派生類之間指標或引用的轉換 進行上行轉換是安全的,進行下行轉換時是不安全的 ...
C 強制轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...
c 強制轉換
隱式轉換 char int 顯示轉換 c風格轉換 base b new test test t test b c 風格 static cast 編譯時檢查,如果不是派生關係,則編譯錯誤 dynamic cast 執行時檢查,如果不是派生關係,則返回null rtti reinterpret cast...