我為我喜愛的都東西大費周章, 所以我才能快樂如斯. --海明威《太陽照常公升起》20.1 c語言中的型別轉換
void test (
)
缺陷: 轉換的可視性比較差,所有的轉換形式都是以一種相同形式書寫,難以跟蹤錯誤的轉換.
20.2 c++強制型別轉換
標準c++為了加強型別轉換的可視性,引入了四種命名的強制型別轉換操作符:
static_cast、reinterpret_cast、const_cast、dynamic_cast
20.2.1 static_cast
static_cast用於非多型型別的轉換(靜態轉換),編譯器隱式執行的任何型別轉換都可用static_cast,但它不能用於兩個不相關的型別進行轉換.
int
main()
20.2.2 reinterpret_cast
reinterpret_cast操作符通常為運算元的位模式提供較低層次的重新解釋,用於將一種型別轉換為另一種不同的型別.
typedef
void
(* func)()
;int dosomething (
int i)
void test (
)
20.2.3 const_cast
const_cast最常用的用途就是刪除變數的const屬性,方便賦值.
void test (
)
20.2.4 dynamic_cast
dynamic_cast用於將乙個父類物件的指標轉換為子類物件的指標或引用(動態轉換)
向上轉型:子類物件指標->父類指標/引用(不需要轉換,賦值相容規則) 向下轉型:父類物件指標->子類指標/引用(用dynamic_cast轉型是安全的)
注意: 1. dynamic_cast只能用於含有虛函式的類 2. dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回0.
classa}
;classb:
public a
;void fun (a* pa)
int main (
)
注意 強制型別轉換關閉或掛起了正常的型別檢查,每次使用強制型別轉換前,程式設計師應該仔細考慮是否還有其他不同的方法達到同一目的,如果非強制型別轉換不可,則應限制強制轉換值的作用域,以減少發生錯誤的機會。強烈建議:避免使用強制型別轉換.
20.2.5 explicit
explicit關鍵字阻止經過轉換建構函式進行的隱式轉換的發生.
classaa
(const a& a)
private
:int _a ;};
int main (
)
20.3 為什麼c++需要四種型別轉換
c風格的轉換格式很簡單,但是有不少缺點的:
隱式型別轉化有些情況下可能會出問題
顯式型別轉換將所有情況混合在一起,**不夠清晰
20.4 rtti
rtti:run-time type identification的簡稱,即:執行時型別識別。
c++通過以下方式來支援rtti:
typeid運算子
dynamic_cast運算子
C C 的型別轉換
c語言的型別轉換分為隱式型別的轉換和強制型別的轉換。隱式型別轉換 適用於相近型別的轉換 int main return 0 int main 因為c語言的隱式型別轉換坑很大,標準c 為了加強型別轉換的可視性,引入了四種命名的強制型別轉換操作符 static cast 相近型別的轉換 static c...
C C 型別轉換
include include using namespace std int main 程式的執行結果如下 註解 int a 相當於將浮點數a的位址的前sizeof int 個位元組當成int型的資料輸出。float a 1.0f在記憶體中的表示是0x3f800000,當 int a強制轉換時,會...
C C 型別轉換
如果乙個int型的變數值為5,則若使用強制型別轉換或者使用memcpy,則相當於直接copy記憶體中的值,若列印,則會列印5對應的ascii值 而若使用函式轉換,則函式會操作記憶體轉為ascii值的5,若列印,則直接為5。memcpy在一定程度上相當於強制型別轉換,但是可以制定拷貝的位元組大小,因此...