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