型別轉換在。我們編寫程式時是不可避免的,比如我們分配乙個記憶體區域,它將要儲存的物件型別對編譯器是不可知的。最典型的例子就是void*指標,呼叫malloc時會返回乙個void*,編譯器並不知道void*指向的物件型別。
由此可見,型別轉換時不可以或缺的!下面我們介紹c++提供的4種顯示型別轉換,及繼承自c的型別轉換方式(type)expression。本文的主要內容如下:
1、寫在前面
顯示型別轉換有時是必需的,如前面提到的void *指標。我們必須將malloc返回的void*指標顯示轉換為特定的型別,eg.:int * p=static_cast(malloc(100));還有如果我們想通過乙個給定的十六進製制數訪問記憶體。這大大方便了我們程式設計,但同時也帶來了風險,用得不好將成為很多錯誤的根源!如你通過乙個十六進數去訪問記憶體可能會導致程式崩潰;如你記憶體轉換時可能會截斷原有資料……
因此我們在型別轉換時必須得小心。
2、static_cast(exp)顯示轉換
static_cast型別轉換用於相關型別之間的轉換,諸如:在同乙個類的繼承層次關係中,向上或向下轉換;列舉型別與整數型別之間的轉換;浮點型別與指數型別之間的轉換。
。。。在這4中型別轉換中,static_cast是最接近c-style的了。
3、reinterpret_cast(exp)顯式轉換
字面理解即re-interpret,重新解析(釋)的意思。故名思意,它主要用於不相關型別之間的轉換,好乙個英文單詞在不同的上下文中,詞性和詞義可能完全不同。它為不同型別之間轉換帶來的便利,但是也伴隨著風險的,如將乙個十六進製制整數轉換為記憶體位址(由int-->指標型別,這兩種型別完全不關聯)。既然是用於不相關型別之間的轉換,也就意味著編譯器不會做太多的確認和承諾。
reinterpret_cast方式還有乙個特點就是:目標和原始值之間至少有相同的位數,我們可以將轉換之後的值再轉換回去,而不像其它3種型別可能會導致精度丟失。
。。。。。。。。。
4、dynamic_cast(exp)顯示轉換
一種執行時(run-time)檢測的型別轉換,因此轉換可能需要較大的執行時代價,這種型別也是用c-style是無法實現的。主要用於執行型別向下轉換和繼承之間的轉換。
。。。。
5、const_cast(exp)顯示轉換
用於消除變數的const限定,轉換之後的變數就不再具有「const」了,如果是乙個const指標的話,轉換之後可以改變指向而指向其它物件。
。。。。。
6、總結
用c-style的(type)expression的格式轉換,可以用我們上面介紹的4種方式來替代。雖然c++中可以使用c-style的形式仍可用,但更加建議使用上面的4中型別。因為c-style的型別轉換更加危險:
而用上面的四種方式可以更加準確地定位哪種型別轉換發生了錯誤。
c 中的4種型別轉換
1.c 中有哪4個和型別轉換相關的關鍵字?這些關鍵字都有什麼特點?應該在哪些場合下使用.c語言中的強制型別轉換可以隨意的轉換我們想要的型別了,格式如下 型別 變數名 為什麼c 還要引入新的4種型別轉換呢?這是因為新的型別轉換控制符可以很好的控制型別轉換的過程,允許控制各種型別不同的轉換.還有一點好處...
C 中的4種型別轉換
c語言中實現了基本型別的轉換機制,比如int轉double,char轉int等等。轉換的格式也很簡單 轉換型別 變數或者 轉換型別 變數 在c語言中這種方法很簡潔高效,可以對任意型別做強制轉換,但缺點也是不少,比如double轉int的時候會出現精度損失。當到了c 的時候,因為類型別及c 的多型等機...
C 中顯示型別轉換
c 引入了 const cast,reinterpret cast 之類的新的顯式型別轉換方式,不僅大多數 c 程式設計師覺得不是很習慣,就連某些有經驗的c 程式設計師都會在一些細節上犯錯。誠然,既然我們可以簡單的寫出 int i int p p is a pointer 這樣的顯式轉換,為什麼還要...