C 基礎之強制轉換

2021-10-05 00:23:20 字數 2723 閱讀 4221

目錄:

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