目錄
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 可以將其看成乙個模板,在模板裡面提供轉換成的型別 注...