C 強制型別轉換

2021-06-28 08:44:13 字數 1725 閱讀 7809

在c++語言裡為了讓強制型別轉換更明顯,更安全,所以把不同情況下的強制型別轉換分為四種,分別為:

static_cast              靜態型別轉換,屬於最安全的強制型別轉換。

const_cast              在可變與不可變型別之間轉換

dynamic_cast        在多型的情況下,父子類之間的轉換

reinterpret_cast        所有型別間的轉換,最不安全的轉換

1.c++中的

static_cast

執行非多型的轉換,用於代替c中通常的轉換操作。因此,被做為隱式型別轉換使用。比如:

inti;

float

f = 

166.7

f;i = 

static_cast

<

int>(f);

此時結果,i的值為

166。

2.c++中的reinterpret_cast主要是將資料從一種型別的轉換為另一種型別。所謂「通常為運算元的位模式提供較低層的重新解釋」也就是說將資料以二進位制存在形式的重新解釋。比如:

inti;

char

*p = 

"this is a example."

;i = reinterpret_cast<

int>(p);

此時結果,i與p的值是完全相同的。reinterpret_cast的作用是說將指標p的值以二進位制(位模式)的方式被解釋為整型,並賦給i,

//i 也是指標,整型指標;乙個明顯的現象是在轉換前後沒有數字損失。

故該轉化也可以稱為是「重新翻譯」

3.dynamic_cast

主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。

在類層次間進行上行轉換時,

dynamic_cast

和static_cast

的效果是一樣的;

在進行下行轉換時,

dynamic_cast

具有型別檢查的功能,比

static_cast

更安全。

class

b;class

d:public

b;void

func(b *pb)

在上面的**段中,如果pb指向乙個d型別的物件,pd1和pd2是一樣的,並且對這兩個指標執行d型別的任何操作都是安全的;

但是,如果pb指向的是乙個b型別的物件,那麼pd1將是乙個指向該物件的指標,對它進行d型別的操作將是不安全的(如訪問m_szname),而pd2將是乙個空指標。

4.const_cast 該運算子用來修改型別的

const

或volatile

屬性。除了

const

或volatile

修飾之外, type_id和expression的型別是一樣的。

一、常量指標被轉化成非常量指標,並且仍然指向原來的物件;

二、常量引用被轉換成非常量引用,並且仍然指向原來的物件;

三、常量物件被轉換成非常量物件。

voiatile和

const

classb};

void

foo()

intmain()

上面的**編譯時會報錯,因為b1是乙個常量物件,不能對它進行改變;

使用const_cast

把它轉換成乙個非常量物件,就可以對它的資料成員任意改變。注意:b1和b2是兩個不同的物件。

C 強制型別轉換

四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型別轉化最終還是被c 接受了。1.stat...

C 強制型別轉換

標準c 中主要有四種強制轉換型別運算子 const cast,reinterpret cast,static cast,dynamic cast等等。1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 算術型別或列舉型別。表示式static cast a a的值轉換為模板中...

C 強制型別轉換

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