C++中的4種顯示類型轉換

 C++中的4種顯示類型轉換

類型轉換在。我們編寫程序時是不可避免的,比如我們分配一個內存區域,它將要存儲的對象類型對編譯器是不可知的。最典型的例子就是void*指針,調用malloc時會返回一個void*,編譯器並不知道void*指向的對象類型。

由此可見,類型轉換時不可以或缺的!下面我們介紹C++提供的4種顯示類型轉換,及繼承自C的類型轉換方式(Type)expression。本文的主要內容如下:

  • static_cast(exp)顯示轉換

  • reinterpret_cast(exp)顯式轉換

  • dynamic_cast(exp)顯示轉換

  • const_cast(exp)顯示轉換

  • 總結

1、寫在前面

顯示類型轉換有時是必需的,如前面提到的void *指針。我們必須將malloc返回的void*指針顯示轉換爲特定的類型,eg.int * p=static_cast<int*>(malloc(100));還有如果我們想通過一個給定的十六進制數訪問內存。這大大方便了我們編程,但同時也帶來了風險,用得不好將成爲很多錯誤的根源!如你通過一個十六進數去訪問內存可能會導致程序崩潰;如你內存轉換時可能會截斷原有數據……

因此我們在類型轉換時必須得小心。

2static_cast(exp)顯示轉換

static_cast類型轉換用於相關類型之間的轉換,諸如:在同一個類的繼承層次關係中,向上或向下轉換;枚舉類型與整數類型之間的轉換;浮點類型與指數類型之間的轉換。

在這4中類型轉換中,static_cast是最接近C-style的了。

 

3reinterpret_cast(exp)顯式轉換

字面理解即re-interpret,重新解析(釋)的意思。故名思意,它主要用於不相關類型之間的轉換,好一個英文單詞在不同的上下文中,詞性和詞義可能完全不同。它爲不同類型之間轉換帶來的便利,但是也伴隨着風險的,如將一個十六進制整數轉換爲內存地址(由int-->指針類型,這兩種類型完全不關聯)。既然是用於不相關類型之間的轉換,也就意味着編譯器不會做太多的確認和承諾。

reinterpret_cast方式還有一個特點就是:目標和原始值之間至少有相同的位數,我們可以將轉換之後的值再轉換回去,而不像其它3種類型可能會導致精度丟失。

4dynamic_cast(exp)顯示轉換

一種運行時(run-time)檢測的類型轉換,因此轉換可能需要較大的運行時代價,這種類型也是用C-style是無法實現的。主要用於執行類型向下轉換和繼承之間的轉換。

 

5const_cast(exp)顯示轉換

用於消除變量的const限定,轉換之後的變量就不再具有“const”了,如果是一個const指針的話,轉換之後可以改變指向而指向其它對象。

6、總結

C-style(Type)expression的格式轉換,可以用我們上面介紹的4種方式來替代。雖然C++中可以使用C-style的形式仍可用,但更加建議使用上面的4中類型。因爲C-style的類型轉換更加危險:

  • 在一個大型程序中更難定位和識別

  • 哪種類型轉換並不明顯

而用上面的四種方式可以更加準確地定位哪種類型轉換髮生了錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章