C 的強制型別轉換

2021-10-19 03:02:59 字數 3282 閱讀 3880

c++因為相容c的特性,對於c中的強制型別轉換也是可以利用的

先來敘述強制型別轉換的全過程

資料型別排名(從高到低):long double,double,float,unsigned long long int,long long int,unsigned long int,long int,unsigned int,int

有兩個規則要註明:

/*

規則 1:char、short 和 unsigned short 值自動公升級為 int 值。細心的讀者可能已經注意到,char、short 和 unsigned short 都未出現在表 1 中,這是因為無論何時在數學表示式中使用這些資料型別的值,它們都將自動公升級為 int 型別。

規則 2:當運算子使用不同資料型別的兩個值時,較低排名的值將被公升級為較高排名值的型別。

規則 3:當表示式的最終值分配給變數時,它將被轉換為該變數的資料型別。

規則 4:當變數值的資料型別更改時,它不會影響變數本身

*/

其次來說明一下c的強制型別轉換

說明:c的強制型別轉換是把變數從一種型別轉換為另一種資料型別

// (type_name) expression

// type_name (expression)

#include

main()

// output:value of mean : 3.400000

隱式轉換

#include

main()

// output:value of sum : 116

最後來說說c++的強制型別轉換

//靜態轉換

static_cast

(expression)

//動態轉換

dynamic_cast

(expression)

//常量轉換

const_cast

(expression)

//重新解釋轉換

reinterpret_cast

(expression)

static_cast 靜態轉換

static_cast靜態轉換相當於c語言中的強制轉換,但不能實現普通指標資料(空指標除外)的強制轉換,一般用於父類和子類指標、引用間的相互轉換。

①用於類層次結構中基類(父類)和派生類(子類)之間指標或引用的轉換。不管是否發生多型,父子之間互轉時,編譯器都不會報錯。

進行上行轉換(把派生類的指標或引用轉換成基類表示)是安全的;

進行下行轉換(把基類指標或引用轉換成派生類表示)時,由於沒有動態型別檢查,所以是不安全的,但是編譯器不會報錯。

②用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。

③把空指標轉換成目標型別的空指標。

④把任何指標型別轉換成空指標型別。

⑤可以對普通資料的const和non_const進行轉換,但不能對普通資料取位址後的指標進行const新增和消去。

⑥無繼承關係的自定義型別,不可轉換,不支援類間交叉轉換。

注意:static_cast不能轉換掉expression的const、volatile、或者__unaligned屬性

class

person

;class

son:

public person

;classmy;

void

test02()

dynamic_cast 動態轉換

動態轉換的型別和運算元必須是完整類型別或空指標、空引用,說人話就是說,只能用於類間轉換,支援類間交叉轉換,不能操作普通資料。

主要用於類層次結構中基類(父類)和派生類(子類)之間指標或引用的轉換,

①進行上行轉換(把派生類的指標或引用轉換成基類表示)是安全的,允許轉換;

②進行下行轉換(把基類指標或引用轉換成派生類表示)時,由於沒有動態型別檢查,所以是不安全的,不允許轉化,編譯器會報錯;

③發生多型時,允許互相轉換。

④無繼承關係的類之間也可以相互轉換,類之間的交叉轉換。

⑤如果dynamic_cast語句的轉換目標是指標型別並且失敗了,則結果為0。如果轉換目標是引用型別並且失敗了,則dynamic_cast運算子將丟擲乙個std::bad_cast異常

const_cast 常量轉換

const_cast,用於修改型別的const或volatile屬性,不能對非指標或非引用的變數新增或移除const。

const

int g =20;

//int h = const_cast(g); //不允許對普通資料進行操作

int*h =

const_cast

<

int*

>

(&g)

;//去掉const常量const屬性

const

int g0 =20;

const

int&g2 = g0;

int&h =

const_cast

<

int&

>

(g0)

;//去掉const引用const屬性

int&h2 =

const_cast

<

int&

>

(g2)

;//去掉const引用const屬性

const

char

*g1 =

"hello"

;char

*h =

const_cast

<

char

*>

(g1)

;//去掉const指標const屬性

reinterpret_cast 重新解釋轉換

最雞肋的轉換函式,可以將任意型別轉換為任意型別,因此非常不安全。只有將轉換後的型別值轉換回到其原始型別,這樣才是正確使用reinterpret_cast方式。

static_cast和reinterpret_cast的區別主要在於多重繼承

前兩個的輸出值是相同的,最後乙個則會在原基礎上偏移4個位元組(可檢視virtual虛函式部落格詳述),這是因為static_cast計算了父子類指標轉換的偏移量,並將之轉換到正確的位址(c裡面有m_a,m_b,轉換為b*指標後指到m_b處),而reinterpret_cast卻不會做這一層轉換

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