日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++有哪四个类型转换相关的关键字

發布時間:2025/6/15 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++有哪四个类型转换相关的关键字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【面試題】c++有哪四個類型轉換相關的關鍵字?

在C/C++語言中用 (type) value(在C++還可以采用type(value))來進行顯式類型轉換(explicit type conversion),常常又被稱為強制轉換(cast投射/鑄模)。這種轉換的正確性完全掌握在程序員手中,傳統上強制轉換往往被過度使用,成為C++程序犯錯的一個主要根源。
為了減少強制轉換的副作用,并且在查錯時使程序員能夠快速定位(總是最值得懷疑的)強制轉換,在標準C++中新增加了4個關鍵字*_cast,用來提倡一種全新的C++顯式轉換語法:
*_cast <type-id> (expression)

[cpp]?view plain?copy
  • const?int?sz?=?100;?//?定義數組大小,標準C++提倡用常型變量(而不是常數或??
  • //?符號常量宏)??
  • struct?X?{int?a[sz];};?//?只包含一個整數數組的結構??
  • X?x;?//?定義結構變量,此時結構中的數組元素的值無意義(需要初始化)??
  • int?*px?=?reinterpret_cast<int?*>?(&x);?//?為了初始化,先把結構轉化為int數組??
  • for?(int?*i?=?px;?i?<?px?+?sz;?i++)?*i?=?0;?//?將每個數組元素的值初始化為0??
  • print(reinterpret_cast<X?*>?(px));?//?重新轉換成結構指針,以便使用??
  • //?也可以直接使用原來的標識符x??
  • //?此語句相當于print(&x);

  • 1、reinterpret_cast<type-id> (expression)

    type-id 必須是一個指針、引用、算術類型、函數指針或者成員指針。它可以把一個指針轉換成一個整數,也可以把一個整數轉換成一個指針(先把一個指針轉換成一個整數,再把該整數轉換成原類型的指針,還可以得到原先的指針值)。

    static_cast和reinterpret_cast的區別主要在于多重繼承reinterpret_cast(重解釋轉換):一種最有可能出問題的最不安全的類型轉換。只是在下面的情形,才需要使用這種類型轉換:當需要使用時,所得到的東西已經不同了,為了使它能夠用于原來的目的,必須再次把它轉換回來。例如:

    [cpp]?view plain?copy
  • const?int?sz?=?100;?//?定義數組大小,標準C++提倡用常型變量(而不是常數或??
  • //?符號常量宏)??
  • struct?X?{int?a[sz];};?//?只包含一個整數數組的結構??
  • X?x;?//?定義結構變量,此時結構中的數組元素的值無意義(需要初始化)??
  • int?*px?=?reinterpret_cast<int?*>?(&x);?//?為了初始化,先把結構轉化為int數組??
  • for?(int?*i?=?px;?i?<?px?+?sz;?i++)?*i?=?0;?//?將每個數組元素的值初始化為0??
  • print(reinterpret_cast<X?*>?(px));?//?重新轉換成結構指針,以便使用??
  • //?也可以直接使用原來的標識符x??
  • //?此語句相當于print(&x);??
  • 使用reinterpret_cast通常是一種不明智且不方便的編程方式。但是在必須使用時,它也是非常有用的。

    2、static_cast<T*>(content)靜態轉換

    主要用于c++中內置的基本數據類型之間的轉換,在編譯期間處理,但是沒有運行時類型的檢測來保證轉換的安全性

    該運算符把expression轉換為type-id類型,但沒有運行時類型檢查來保證轉換的安全性。它主要有如下幾種用法:

    用于類層次結構中基類(父類)和派生類(子類)之間指針或引用的轉換。

    進行上行轉換(把派生類的指針或引用轉換成基類表示)是安全的;

    進行下行轉換(把基類指針或引用轉換成派生類表示)時,由于沒有動態類型檢查,所以是不安全的

    ②用于基本數據類型之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。

    ③把空指針轉換成目標類型的空指針。

    ④把任何類型的表達式轉換成void類型。

    注意:static_cast不能轉換掉expression的const、volatile、或者__unaligned屬性。

    C++中static_cast和reinterpret_cast的區別

    C++primer第五章里寫了編譯器隱式執行任何類型轉換都可由static_cast顯示完成; reinterpret_cast通常為操作數的位模式提供較低層的重新解釋

    static_cast(靜態轉換):用于明確定義良性和適度良性的轉換,包括原來不需要采用強制轉換的自動類型轉換(包括無損的提升轉換和可能丟失信息的窄化轉換[narrowing conversion],對后者編譯器一般會提出警告)。即將編譯器隱式執行的轉型弄成顯示的。標準C++提倡對任何數據的類型轉換(不論是自動的還是強制的),都采用新的*_cast顯式類型轉換方法。例如:

    [html]?view plain?copy
  • int?i?=?0x7fff;??
  • long?l;??
  • float?f;??
  • char?c;??
  • //?(1)典型的非強制轉換(自動轉換)??
  • //?傳統方式:??
  • l?=?i;??
  • f?=?i;??
  • //?提倡的新方式:??
  • l?=?static_cast<long>(i);??
  • f?=?static_cast<float>(i);??
  • //?(2)窄化轉換??
  • //?傳統方式:??
  • //?會顯示警告信息:??
  • i?=?l;?//?可能丟失數字??
  • i?=?f;?//?可能丟失信息??
  • c?=?i;?//?可能丟失數字??
  • //?不顯示警告信息(但仍然難定位):??
  • i?=?(int)l;??
  • i?=?(int)f;??
  • c?=?(char)i;??
  • //?提倡的新方式(不會顯示警告信息,且易定位):??
  • i?=?static_cast<int>(l);??
  • i?=?static_cast<int>(f);??
  • c?=?static_cast<char>(i);??
  • 3、dynamic_cast <type-id> (expression)

    將一個基類對象指針(或引用)cast到繼承類指針,dynamic_cast會根據基類指針是否真正指向繼承類指針來做相應處理.

    該運算符把expression轉換成type-id類型的對象。Type-id 必須是類的指針、類的引用或者void*; 如果 type-id 是類指針類型,那么expression也必須是一個指針,如果 type-id 是一個引用,那么 expression 也必須是一個引用。 dynamic_cast運算符可以在執行期決定真正的類型。如果 downcast 是安全的(也就說,如果基類指針或者引用確實指向一個派生類對象)這個運算符會傳回適當轉型過的指針。如果 downcast 不安全,這個運算符會傳回空指針(也就是說,基類指針或者引用沒有指向一個派生類對象)。 dynamic_cast主要用于類層次間的上行轉換和下行轉換,還可以用于類之間的交叉轉換。

    dynamic_cast(動態轉換):一種安全的向下類型轉換(downcast)操作,用于在一個類繼承層次上向下移動。

    因為每個派生類的基類都只有一個,而且派生類本身又包含了幾乎所有的基類信息(private型的除外),所以向上的類型轉換(upcast)總是唯一的和比較安全的
    而一個基類往往有多個派生類,而且派生類中一般會在基類的基礎上添加了一些特有的數據和操作,所以向下的類型轉換總是多態的和不太安全的
    dynamic_cast提供了一種安全的向下類型轉換操作,只有當類型轉換是正確的并且轉換取的成功,返回值才是所需要的指針;否則它將返回0(空指針NULL),表示不是正確的類型。
    例如:
    [cpp]?view plain?copy
  • class?Pet?{……};??
  • class?Dog?:?public?Pet?{……};??
  • class?Cat?:?public?Pet?{……};??
  • ……??
  • Pet?*pPet?=?new?Cat;?//?向上的類型轉換??
  • Dog?*pDog?=?dynamic_cast<Dog?*>(pPet);?//?類型錯誤,返回0(NULL)??
  • Cat?*pCat?=?dynamic_cast<Cat?*>(pPet);?//?類型正確,返回指針??
  • Cat?*pCat?=?static_cast<Cat?*>(pPet);?//?正確,減少運行時的開銷??
  • 注意:dynamic_cast雖然安全,但是運行時需要一定開銷,因此不提倡大量使用這種轉換。如果你已經能夠確認轉換的正確性,則可以采用前面介紹過的(無運行時開銷的)static_cast轉換。只有當你實在無法確定轉換是否正確時,才需要采用dynamic_cast轉換

    在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;

    4、const_cast

    const_cast,用于修改類型的const或volatile屬性。

    const_cast<type_id> (expression) 該運算符用來修改類型的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的類型是一樣的。 一、常量指針被轉化成非常量的指針,并且仍然指向原來的對象; 二、常量引用被轉換成非常量的引用,并且仍然指向原來的對象

    三、const_cast一般用于修改底指針。如const char *p形式。

    const_cast(常量轉換):可將(同數據類型的)常型(const)轉換為非常型、將易變(volatile)型轉換為非易變型。如果用于其他類型的轉換,一般會產生一個編譯錯誤。例如:

    [cpp]?view plain?copy
  • <span?style="color:#333333;">const?int?i?=?0;??
  • int?*pi;??
  • pi?=?&i;?//?錯誤??
  • pi?=?(int?*)&i;?//?被反對??
  • pi?=?const_cast<int?*>(&i);?//?完美??
  • long?*pl?=?const_cast<long?*>(&i);?//?</span><span?style="color:#ff6666;">錯誤,要求是同數據類型</span><span?style="color:#333333;">??
  • volatile?int?k?=?0;??
  • int?*pk?=?const_cast<int?*>(&k);?//?正確</span>??
  • -----------------------------------------------------------------------------------------------------------------------------------------------------

    在這四種強制轉換中,static_cast最常用(目前還沒有流行起來,但是被標準C++著力提倡)、dynamic_cast最重要、const_cast也有用、而reinterpret_cast則很少被使用。?

    總結

    以上是生活随笔為你收集整理的c++有哪四个类型转换相关的关键字的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。