強制型別轉換

2021-10-07 04:00:05 字數 3046 閱讀 4855

二、舊式的強制型別轉換

命名的強制型別轉換具有如下形式:

cast-name

(expression)

;

type 是轉換的目標型別,expression 是需要轉換的值。cast-name 是static_cast 、 dynamic_cast 、 const_cast 、 reinterpret_cast中的一種。 cast-name 指定了執行的是那種轉換。

任何具有明確定義的型別轉換,只要不包含底層 const ,都可以使用static_cast。

double d_pi =

3.1415

;int i_pi =

static_cast

<

int>

(d_pi)

;//i_pi的值為3

void

* p =

&d_pi;

int* i_p =

static_cast

<

int*

>

(p);

//編譯通過, 但將double* 轉成了 int*, *i_p 是未定義行為

double

* d_p =

static_cast

<

double

*>

(p)//正確, *d_p = 3.1415

這裡需要注意,在指標操作時,將 double* 存放到 void* 的 p 中,在強制轉換到 int* 的 i_p 時,型別不符,但不會編譯報錯,執行時會發生未定義行為只有轉換回原來的型別時,才是正確的行為。但它並不會為你進行型別檢查。這存在安全隱患,還有基類和派生類的指標相互轉換,也存在隱患,都需要開發者來維護。

const_cast 只能改變運算物件的底層 cosnt ,常用於修改指標和指標的 const 性質。一旦去掉 const 性質,便可以獲取寫許可權。若物件本身不是常量,使用強制型別轉換獲取寫許可權是合法行為;但如果物件本身是個常量,再使用 const_cast 獲取寫許可權則會產生未定義行為

int i =10;

// i 本身不是常量

const

int* i_p =

&i,&i_c = i;

// const 指標 和 const 引用

int* a =

const_cast

<

int*

>

(i_p)

;// const 改變其常量屬性, 可通過 a 修改 i 的值

*a =5;

//正確

int& b =

const_cast

<

int&

>

(i_c)

;// const 改變其常量屬性, 可通過 a 修改 i 的值

b =10;

//正確

double c =

const_cast

<

double

>

(i)//錯誤, const_cast只改變常量屬性, 不會轉換型別

reinterpret_cast 通常為運算元的位模式提供較低層次的重新解釋。但是他僅僅是重新解釋了給出的物件的位元模型,並沒有進行二進位制的轉換!

int

*ip;

char

*pc =

reinterpret_cast

<

char

*>

(ip)

; string str

(pc)

;

因為 pc 所指的真實物件是 int 而非字元,若如同上面一樣,可能在執行時會發生錯誤!用 pc 初始化 str 沒有實際意義,甚至還會發生一些不可預知的錯誤。但在語法上,確實合法的,難以找到這乙個錯誤。

dynamic_cast 強制轉換,涉及到物件導向的多型性和程式執行時的狀態,也與編譯器的屬性設定有關。不能完全使用c語言的強制轉換替代,它也是最常有用的。

class

base

void

print()

virtual

~base()

};class

sub:

public base

void print ()~

sub()}

;int

main()

delete base;

cout <<

"\nsub -> base"

<< endl;

sub* sub1 =

newsub()

; sub1-

>

print()

; base* base1 =

dynamic_cast

>

(sub1);if

(base1 !=

nullptr

)delete sub1;

//輸出

//base -> sub

//i am base

//sub -> base

//i am sub

//i am base

}

從基類到派生類的轉換,雖然沒有報錯,但是輸出給 sub 是乙個 nullptr ,說明 dynami_cast 在程式執行時對型別轉換對「執行期型別資訊」進行了檢查。

派生類到基類的轉換,dynamic_cast 成功轉換,沒有什麼執行異常,且達到預期結果。

不管什麼型別的轉換,都只有以下的兩種形式:

type

(expr)

;//函式形式的強制型別轉換

(type)expr;

//c語言風格的強制型別轉換

這裡的強制型別轉換分別具有與 c++ 的強制型別轉換相似的行為,但從表現形式上卻難以區分,容易被看樓。一旦出現問題,也難以追蹤。最好使用 c++ 命名的強制型別轉換。

強制型別轉換

關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast dynamic cast reint...

強制型別轉換

顯式轉換也稱為強制型別轉換 cast 包括以下列名字命名的強制型別轉換操作符 static cast dynamic cast const cast 和 reinterpret cast。命名的強制型別轉換符號的一般形式如下 cast name expression 其中 cast name 為 s...

強制型別轉換

c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dynamic cast,命名上理解是動態型別轉換。如子類和父類之間的多型型別轉換。reinterprete...