C C 20 C 的型別轉換

2021-09-28 19:09:36 字數 1710 閱讀 2654

我為我喜愛的都東西大費周章, 所以我才能快樂如斯. --海明威《太陽照常公升起》

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在一定程度上相當於強制型別轉換,但是可以制定拷貝的位元組大小,因此...