C 四種型別轉換方式

2021-10-14 17:08:58 字數 2938 閱讀 4667

static_cast 靜態型別轉換。

reinterpreter_cast 重新解釋型別轉換。

dynamic_cast 子類和父類之間的多型型別轉換。

const_cast 去掉const屬性轉換

**

這應該四種中是最常見的。用法為 static_cast (expression)。

該運算子把 expression 轉換為 type-id 型別,但沒有執行時型別檢查來保證轉換的安全性。

主要用法如下:

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

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

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

(2)用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。

(3)把空指標轉換成目標型別的空指標。

(4)把任何型別的表示式轉換成void型別。

所謂的靜態,即在編譯期內即可決定其型別的轉換,用的也是最多的一種。

#include

using

namespace std;

intmain

(void

)

reinterpret_cast 主要有三種強制轉換用途:

1、改變指標或引用的型別

2、將指標或引用轉換為乙個足夠長度的整形

3、將整型轉換為指標或引用型別。

用法為 reinterpret_cast (expression)。

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

對資料的二進位制重新解釋,但是不改變其值。

class

animal};

class

book};

intmain()

用法為 dynamic_cast (expression)。

幾個特點如下:

(1)其他三種都是編譯時完成的,dynamic_cast 是執行時處理的,執行時要進行型別檢查。

(2)不能用於內建的基本資料型別的強制轉換

(3)dynamic_cast 要求 <> 內所描述的目標型別必須為指標或引用。dynamic_cast 轉換如果成功的話返回的是指向類的指標或引用,轉換失敗的話則會返回 nullptr

(4)在類的轉換時,在類層次間進行上行轉換(子類指標指向父類指標)時,dynamic_cast 和 static_cast 的效果是一樣的。在進行下行轉換(父類指標轉化為子類指標)時,dynamic_cast 具有型別檢查的功能,比 static_cast 更安全。 向下轉換的成功與否還與將要轉換的型別有關,即要轉換的指標指向的物件的實際型別與轉換以後的物件型別一定要相同,否則轉換失敗。在c++中,編譯期的型別轉換有可能會在執行時出現錯誤,特別是涉及到類物件的指標或引用操作時,更容易產生錯誤。dynamic_cast操作符則可以在執行期對可能產生問題的型別轉換進行測試。

(5)使用 dynamic_cast 進行轉換的,基類中一定要有虛函式,否則編譯不通過(類中存在虛函式,就說明它有想要讓基類指標或引用指向派生類物件的情況,此時轉換才有意義)。這是由於執行時型別檢查需要執行時型別資訊,而這個資訊儲存在類的虛函式表中,只有定義了虛函式的類才有虛函式表

class

productbase;}

;class

producta

:public productbase

;int

main()

const_cast《目標型別》(識別符號):目標型別只能是指標或者引用

const_cast與之前介紹的各種轉換都不同,它只是負責給變數增加或者刪除一些屬性,以保證編譯器可以編過;

class

test

;int

main()

;//test a1 = const_cast(a); //錯誤,const_cast 目標型別只能是引用或者指標

= 100;

test& a2 =

const_cast

>

(a);

a2.data =

100;

std::cout << a.data <<

' '<< a2.data << std::endl;

test* a3 =

const_cast

>

(&a)

; a3-

>data =

100;

std::cout << a.data <<

' '<< a3-

>data << std::endl;

const

int x =3;

int& x1 =

const_cast

<

int&

>

(x);

x1 =

200;

std::cout << x <<

' '<< x1 << std::endl;

int* x2 =

const_cast

<

int*

>

(&x)

;*x2 =

300;

std::cout << x <<

' '<<

*x2 << std::endl;

getchar()

;return0;

}

C 四種型別轉換方式

c風格的強制型別轉換 type case 很簡單,不管什麼型別的傳統轉換都是 type b type a,但是c風格的型別轉換有不少的缺點,有的時候用c風格的轉換是不合適的,因為它可以在任意型別之間進行轉換,比如你可以把乙個指向const型別的指標轉換成指向非const型別的指標,把乙個指向基類物件...

C 四種型別轉換方式

reinterpert cast意圖執行低階轉換,實際動作 及結果 可能取決於編譯器,這也就表示它不可移植。例如將乙個 pointer to int 轉型為乙個 int 這一型別在底層 以外很少見。示例 class a class b a a new a b b reinterpret a rein...

C 中四種型別轉換方式

型別轉換有c風格的,當然還有c 風格的。c風格的轉換的格式很簡單 type expression,但是c風格的型別轉換有不少的缺點,有的時候用c風格的轉換是不合適的,因為它可以在任意型別之間轉換,比如你可以把乙個指向const物件的指標轉換成指向非const物件的指標,把乙個指向基類物件的指標轉換成...