C 轉換符(類之間的型別轉換 持續更新

2021-09-11 22:54:03 字數 3180 閱讀 3413

在c++中,下列哪乙個可以做為物件繼承之間的轉換: (答案是ab /b?)

a.static_cast
b.dynamic_cast
c.const_cast
d.reinterpret_cast
c++標準定義了四個新的轉換符:reinterpret_caststatic_castdynamic_castconst_cast

目的在於控制類(class)之間的型別轉換。

對於選項a,static_cast可以用於類層次結構中基類和子類之間指標或引用的轉換。

把子類的指標或引用轉換成基類表示是安全的,但把基類指標或引用轉換成子類指標或引用時,

由於沒有動態型別檢查,所以,它是不安全的。基類和子類之間的動態型別轉換一般建議使用dynamic_cast

static_cast可以用作物件繼承之間轉換,只不過有安全隱患。因此,選項a正確。

對於選項b,dynamic_cast用於物件的指標和引用,當用於多型型別轉換時,

允許隱式轉換及相反的轉換操作,與static_cast的不同之處在於,在相反的轉換過程中,

dynamic_cast會檢測操作的有效性,如果返回的不是被請求的有效完整物件,則返回null,

反之返回這個有效的物件,如果是引用返回無效時,則會丟擲bad_cast異常。所以,選項b正確。

對於選項c,const_cast用來修改型別的constvolatile屬性,具體而言,

const_cast會操縱傳遞物件的const屬性,設定或者移除該屬性。所以,選項c錯誤。

對於選項d,reinterpret_cast用來處理無關型別之間的轉換,可以轉換任意乙個32位整數,

包括所有的指標和整數。可以把任何整數轉成指標,也可以把任何指標轉成整數,

以及把指標轉化為任意型別的指標,但不能將非32位的例項轉成指標。所以,選項d錯誤。

所以,本題的答案為a、b。

簡單總結

dynamic_cast : 

繼承體系安全向下轉型或跨系轉型;找出某物件占用記憶體的起始點

static_cast:

同舊式c轉型,如int 到double

const_cast:

常用於去除某個物件的常量性

reinterpret_cast

不具備移植性,常見用途是轉化函式指標型別

轉換運算子

轉換(cast)這個詞通常意為「澆鑄成乙個模型」。如果編譯器能夠明白的話,它會自動把一種資料型別轉換為另一種型別。例如,如果賦乙個整型值給乙個浮點變數,編譯器會暗地裡呼叫乙個函式(或更可能插入**)來把整型值轉換為浮點型。轉換允許使用這種顯式型別轉換,或在轉換沒有正常情況下發生時強制它實現。

為了實現轉換,要用括號把所想轉換的資料型別(包括所有的修飾符)括起來放在值得左邊。這個值可以是乙個變數、乙個常量、由乙個表示式產生的值或是乙個函式的返回值。

c++有乙個另外的轉換語法,他遵從函式呼叫的語法。這個語法給引數加上括號而不是給資料型別加上括號,類似於函式呼叫:

int main(){

float a=float(200);//和下面相等

float b=(float)200;

c++的顯式轉換

應該小心使用轉換,因為轉換實際上要做的就是對編譯器說「忘記型別檢查,把它看成是其他型別。」這也就是說,在c++型別系統中引入了乙個漏洞,並阻止編譯器報告在型別方面出錯了。更為糟糕的是,編譯器會相信他,而不執行任何其他的檢查來捕獲錯誤。一旦開始進行轉換,程式設計師必須自己面對各種問題。事實上,無論什麼原因,任何乙個程式如果使用很多轉換都值得懷疑。一般情況下很少使用轉換,他只是用於解決非常特殊的問題。

一旦理解了這一點,在遇到乙個出故障的程式時,第乙個反應應該是尋找作為嫌犯的轉換。但是怎麼確定c風格的轉換位置呢?他們只是在括號中的型別名字,如果開始查詢這些的話,我們會發現很難把他們和**的其他部分呢區分開。

標準c++包括乙個顯式的轉換語法,使用它來完全代替舊的c風格的轉換(當然,如果不破壞**,是不會認為c風格的轉換不合法,但是編譯器的編寫者很容易標出舊風格的轉換)。顯示型別轉化語法是我嗯很容易發現他們,因為通過他們的名字就能找到:

static_cast :用於「良性」和「適度良性」轉換,包括不用強制轉換(例如自動型別轉換)

const_cast:對「const」和/或「volatile」進行轉換。

reinterpret_cast:轉換為完全不同的意思。為了安全使用它,關鍵必須轉換回原來的型別。轉換成的型別一般只能用於位操作,否則就是為了其他隱秘的目的。這就是所有型別換中最危險的。

dynamic_cast:用於型別安全的向下轉換

靜態轉換(static_cast)

static_cast全部用於明確定義的變換,包括編譯器准許我們所做的不用強制轉換的「安全」變換和不太安全但清楚定義的變換。static_cast包含的轉換型別包括典型的非強制變換、窄化(有資訊丟失)變換,使用void* 的強制變換、隱式型別變換和類層次的靜態定位

C 型別轉換符

4個c 型別轉換運算子 使用static cast 用於指標,提供基本的編譯階段檢查,確保指標被轉換為相關型別。c風格型別轉換可將指向乙個物件的指標轉換為完全不相關的型別,而編譯器不會報錯。向上轉換 derived base 無需使用任何顯式型別轉換運算子 向下轉換 base derived 必須使...

C 型別轉換符

c 是一門強型別語言,一般不支援強制型別轉換,但本語言內部提供了型別轉換符用於不同型別間的轉換 1 const cast 去掉型別的const或volatile屬性 常用於 1 常量指標被轉換成非常量指標,仍指向原來的物件 2 常量引用被轉換成非常量引用,仍指向原來的物件 3 常量物件被轉換成非常量...

型別轉換 容器型別之間的轉換

強轉成字串,無非就是在原有的資料的基礎上兩邊套上引號 如果是字串,會把每乙個字元單獨的作為乙個元素放到列表中 如果是字典,只保留鍵,形成一套新的列表 如果是其他的容器,只是單純的在原有資料的基礎上換上 如果是字串,會把每乙個字元單獨的作為乙個元素放到元組中 如果是字典,只保留鍵,形成一套新的元組 如...