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