我們先來看一看以前是怎麼定義資料型別轉換的:
這種轉換有乙個缺陷就是:強制轉換可視效果差,所有的轉換形式都是同一種形式書寫,如果出現錯誤,不容易跟蹤錯誤的轉換。
為了解決強制轉換帶來的視覺化效果差的問題引入了四種命名的強制型別轉換操作符:static_cast,reinterpret_cast,const_cast,dynamic_cast
四個操作符你見過幾個?哈哈哈,沒見過也沒關係,我也沒見過幾個。下面我仔細地解釋這四個操作符:
•static_cast
static_cast用於非多型型別的轉換(也叫靜態轉換),編譯器隱式執行的任何型別轉換都可以用static_cast,但它不能用於兩個不相關的型別進行轉換,乾說條條沒有用,我們看一看它是怎麼使用的吧:
怎麼理解不能用於兩個不相關的型別進行交換呢?
double和int都是同一型別,但是a是乙個int型別的變數,而我們卻把的強轉成(int*)型別當然是不可以了,乙個是整形,乙個是指標型別,這就叫不相關型別
•reinterpret_cast
reinterpret_cast操作符通常為運算元的位模式提供較低層次的重新解釋,用於一種型別轉換為另一種不同的型別。它不允許刪除const,但會執行一些令人生厭的操作,程式猿還不得不去依賴的操作,通過,這樣的型別轉換適用於依賴於實現底層程式設計技術。
typedef
void
(*func)()
;//定義乙個函式指標
reinterpret_cast可以讓編譯器一func的定義方式去看待dosomething函式,但是c++不能保證所有的函式指標都被一樣的使用,所以這使用有時會產生不確定的結果
•const_cast
const_cast最常用的就是刪除變數的const屬性,方便賦值
int
main()
為什麼要用指標而不是其他型別呢?
我們看看不用指標會出現什麼結果:
注意:const_cast不是萬能的,他可以修改乙個值的指向,但修改const值的結果是不確定的,看個例子:
void change(const int* pt, int n)
int main()
p1和p2都改變了嗎?
const_cast可以刪除const int * pt的const屬性,使得編譯器能夠接受change()中的語句。但由於p2被宣告為const,因此編譯器可能會禁止修改它。所以說,修改const值的結果是不確定的,但僅當指向的值不是const時才可行。
•dynamic_cast
dynamic_cast用於將乙個父類物件的指標轉換為子類物件的指標或者引用(動態轉換)
動態轉換又分為:
向上轉型:子類物件指標->父類物件指標/引用(不需要轉換,遵循賦值相容規則)
向下轉型:父類物件指標->子類物件指標/引用(用dynamic_cast轉型是安全的)
使用這個操作符時注意事項:
1、dynamic_cast只能用於檢查含有虛函式的類
2、dynamic_cast會先檢查能否轉換成功,能成功則轉換,不能成功則返回0
mysql型別轉換c 型別轉換 C 型別轉換
一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...
C 型別轉換
在程式中,進行型別轉換是常見的事。那麼在 c 中支援以前語言的型別轉換方法,即用型別名進行強行轉換,例如 object objtest new newtype newtype newvalue newtype objtest 但是這樣轉換,有個嚴重的問題,就是在把 objtest 強轉換成 newt...
C 型別轉換
型別轉換是將一種型別的值對映為另一種型別的值。型別轉換實際上包含有自動隱含和強制的兩種。型別的自動隱式轉換 c 語言編譯系統提供的內部資料型別的自動隱式轉換規則如下 1.程式在執行算術運算時,低型別可以轉換為高型別。2.在賦值表示式中,右邊表示式的值自動隱式轉換為左邊變數的型別,並賦值給它。3.當在...