c 強制型別轉換(總結)

2021-09-06 09:06:27 字數 2005 閱讀 1571

什麼是型別轉換?

型別轉換的含義是通過改變乙個變數的型別為別的型別從而改變該變數的表示方式。為了型別轉換乙個簡單物件為另乙個物件你會使用傳統的型別轉換操作符。

c與c++的型別轉換

c中:

(t)element 或者 t(element)

c++中:

reinterpret_cast(expression)

dynamic_cast

(expression)

static_cast

(expression)

const_cast

(expression)

c++的四種強制轉型形式

每一種適用於特定的目的:

·dynamic_cast 主要用於執行「安全的向下轉型(safe downcasting)」,也就是說,要確定乙個物件是否是乙個繼承體系中的乙個特定型別。它是唯一不能用舊風格語法執行的強制轉型,也是唯一可能有重大執行時代價的強制轉型。

·static_cast 可以被用於強制隱型轉換(例如,non-const 物件轉型為 const 物件,int 轉型為 double,等等),它還可以用於很多這樣的轉換的反向轉換(例如,void* 指標轉型為有型別指標,基類指標轉型為派生類指標),但是它不能將乙個 const 物件轉型為 non-const 物件(只有 const_cast 能做到),它最接近於c-style的轉換。

·const_cast 一般用於強制消除物件的常量性。它是唯一能做到這一點的 c++ 風格的強制轉型。 

·reinterpret_cast 是特意用於底層的強制轉型,導致實現依賴(implementation-dependent)(就是說,不可移植)的結果,例如,將乙個指標轉型為乙個整數。這樣的強制轉型在底層**以外應該極為罕見。

通俗的解釋:

dynamic_cast

通常在基類和派生類之間轉換時使用

static_cast

一般的轉換,如果你不知道該用哪個,就用這

const_cast

主要針對const和volatile的轉換

reinterpret_cast

用於進行沒有任何關聯之間的轉換,比如乙個字元指標轉換為乙個整形數

具體分析:

1)static_cast(a) 編譯器在編譯期處理

class

a ;class

b ;class d : public

b ;void f(b* pb, d*pd)

2)dynamic_cast(a) 在執行期,會檢查這個轉換是否可能

class base  };

class derived : public

base {};

base* b1 = new

derived;

base* b2 = new

base;

derived* d1 = dynamic_cast(b1); //

succeeds

derived* d2 = dynamic_cast(b2); //

fails: returns 'null'

3)const_cast(a)編譯器在編譯期處理

class

a ;void

f()const

char* p = "

123"

; char* c = const_cast(p);

c[0] = 1; //

表面上通過編譯去掉了const性,但是操作其位址時系統依然不允許這麼做。

4)reinterpret_cast(a)編譯器在編譯期處理

class

a ;class

b ;void

f()

本文就是從大神部落格刪刪減減總結一下~~給自己做個記錄

參考:

C強制型別轉換總結

一 強制型別轉換目的 基本格式 二 c中變數的本質含義 三 普通變數強制型別轉換 四 指標變數型別轉換 一 強制型別轉換目的 基本格式 1.1 強轉目的 c語言是強型別語言,如果乙個運算子兩遍的運算資料型別不同,先要將其轉換為相同的型別,強制型別轉換可以消除程式中的警告,即確保寫 的程式設計師自己清...

c 強制型別轉換(總結)

什麼是型別轉換?型別轉換的含義是通過改變乙個變數的型別為別的型別從而改變該變數的表示方式。為了型別轉換乙個簡單物件為另乙個物件你會使用傳統的型別轉換操作符。c與c 的型別轉換 c中 t element 或者 t element c 中 reinterpret cast expression dyna...

C 強制型別轉換

四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型別轉化最終還是被c 接受了。1.stat...