C C 幾種型別轉換

2021-10-05 08:28:09 字數 2624 閱讀 9575

目錄

c語言型別轉換

為什麼c++需要四種型別轉換

c++型別轉換

static_cast

reinterpret_cast

const_cast

dynamic_cast

explicit

c++中的rtti機制 小結

//c語言型別轉換

void testcast()

缺陷: 轉換的可視性比較差,所有的轉換形式都是以一種相同形式書寫,難以跟蹤錯誤的轉換因為從上面可以看出c風格的轉換格式很簡單,但是有不少缺點的:

隱式型別轉化有些情況下可能會出問題

顯式型別轉換將所有情況混合在一起,**不夠清晰

標準c++為了加強型別轉換的可視性,引入了四種命名的強制型別轉換操作符:static_cast、reinterpret_cast、const_cast、dynamic_cast。

static_cast用於非多型型別的轉換(靜態轉換),編譯器隱式執行的任何型別轉換都可用static_cast,但它不能用於兩個不相關的型別進行轉換。

reinterpret_cast操作符通常為運算元的位模式提供較低層次的重新解釋用於將一種型別轉換為另一種不同的型別

dynamic_cast 用於將乙個父類物件的指標轉換為子類物件的指標或引用(動態轉換)

向上轉型:子類物件指標->父類指標/引用(不需要轉換,賦值相容規則)

向下轉型:父類物件指標->子類指標/引用(用dynamic_cast轉型是安全的)

注意: 1. dynamic_cast只能用於含有虛函式的類 2. dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回0。

dynamic_cast 測試非多型

//非多型不可用

explicit關鍵字阻止經過轉換建構函式進行的隱式轉換的發生

//單參構造的隱式型別轉換舉例

class e

private:

int _a;

};int main()

實際上面的**在執行時:它會用10呼叫建構函式建立乙個匿名的e型別的物件,再把這個匿名物件賦給e。型別一致,賦值當然沒錯。

//多參構造的隱式型別轉換舉例

rtti:run-time type identification的簡稱,即:執行時型別識別。rtti提供了以下兩個非常有用的操作符:

typeid操作符,返回指標和引用所指的實際型別。

dynamic_cast操作符,將基類型別的指標或引用安全地轉換為派生型別的指標或引用。

因此使用強制轉換方法的選擇 如下

強制型別轉換實際上關閉或掛起了正常的型別檢查,每次使用強制型別轉換前,程式設計師應該仔細考慮是否還有其他不同的方法達到同一目的,如果非強制型別轉換不可,則應限制強制轉換值的作用域,以減少發生錯誤的機會。

強烈建議:避免使用強制型別轉換

c 幾種型別轉換方式

1 初始化和賦值進行的轉換 1 float one 1 整型轉浮點型23 int guess 2.333 double轉int45 int debt 7.2e12 flot轉int 但是無法儲存過大資料 2 以 方式初始化時進行轉換 1 條件 不允許轉換最大範圍還大大的資料,比如float就不能轉換...

C 幾種型別轉換的例子

1.int,float,byte,char型別數值強制相互轉換 方法 byte dat1 int dat2 1000 dat1 byte dat2 數值取整模256,最後值為0xe8 dat2 int dat1 最後值為0xe8 byte dat1 float dat2 123.44 dat1 by...

c c 的四種型別轉換

他的主要作用就是去掉 指標或者引用 常量屬性的型別轉換。例如,當我們想將乙個常量a的指標轉成乙個int 在c語言中可以用如下的方式強制轉換。int main 但是在c 中,我們就有了const cast,就可以使用如下的方式轉換 int main 可以將其看成乙個模板,在模板裡面提供轉換成的型別 注...