c++ 四種強制型別轉換:static_cast、reinterpret_cast、const_cast 和 dynamic_cast。
和c語言的()型別轉換相比優勢:
1、明確型別轉換,便於定位哪些地方進行了型別轉換
2、基類指標指向之類指標。
四種轉換形式:*_cast《轉換目標型別》(表示式)
一、statci_cast:
1、整型和浮點型、字元型之間的互相轉換。
2、如果物件所屬的類過載了強制型別轉換運算子 t(如 t 是 int、int* 或其他型別名),則 static_cast 也能用來進行物件到 t 型別的轉換。
3、用於比較「自然」低風險轉換靜態型別轉換,編譯期進行轉換。
不能用於:
1、不同型別指標、不同型別引用之間轉換。
2、不能用於int和指標之間轉換。
範例:
class a
//t可以使int、char、double型別
operator char *()
};int test()
二、reinterpret_cast
1、用於不同型別的指標、不同型別引用、指標和int之間轉換。
2、轉換過程是逐個bit複製,所以不會轉換失敗。
3、reinterpret_cast體現了 c++ 語言的設計思想:使用者可以做任何操作,但要為自己的行為負責。
ass a
};int main()
程式的輸出結果是:
200, 100
4005678abed
第 19 行的**不安全,因為在編譯器看來,pa->j 的存放位置就是 n 後面的 4 個位元組。 本條語句會向這 4 個位元組中寫入 500。但這 4 個位元組不知道是用來存放什麼的,貿然向其中寫入可能會導致程式錯誤甚至崩潰。
三、const_cast
它用來去掉表示式的 const 修飾或 volatile 修飾。換句話說,const_cast 就是用來將 const/volatile 型別轉換為非 const/volatile 型別。
const string s = "inception";
string& p = const_cast (s);
string* ps = const_cast (&s); // &s 的型別是 const string*
四、dynamic_cast
1、用於將多型基類的指標(引用)強制轉換為派生類的指標(引用),而且能夠檢查轉換的安全性。對於不安全的指標轉換,轉換失敗返回 null 指標。
2、是通過「執行時型別檢查」來保證安全性的。
3、不能用於將非多型基類的指標或引用強制轉換為派生類的指標或引用——這種轉換沒法保證安全性,只好用 reinterpret_cast 來完成。
clude #include using namespace std;
class base
};class derived : public base ;
int main()
程式的輸出結果是:
unsafe dynamic_cast1
第 20 行,通過判斷 pd 的值是否為 null,就能知道第 19 行進行的轉換是否是安全的。第 23 行同理。
總結:dynamic_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...