C 的四種型別轉換

2021-05-02 11:22:19 字數 1534 閱讀 6499

在c++中,提供了四種型別轉換,static_cast、dynamic_cast、 reinterp_cast、const_cast。當然,如果你要用()強轉也行,c++是相容c的。

static_cast< type-id > ( expression )

常常用於下面幾種情況:

一、用於類層次結構中基類和子類之間指標或引用的轉換。包括進行上行轉換(把子類的指標或引用轉換成基類表示)是安全的;進行下行轉換(把基類指標或引用轉換成子類指標或引用)時,由於沒有動態型別檢查,所以是不安全的。

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

三、 把void指標轉換成目標型別的指標(不安全!!) 把任何型別的表示式轉換成void型別。

dynamic_cast檢查型別的安全的轉換,   無法完成的轉換會返回null(轉換指標)或者丟擲異常(轉換引用).   效率較低。比如把父類物件指標轉換成子類指標就會返回null。有這樣的特性,有時候我們可以利用它來判斷某個指標指向的物件是哪個物件。

例子://crect是cshape的子類,cshape是基類

crect* p1 = new crect;

cshape* p2 = new cshape;

p1 = dynamic_cast_cast(p2);      //基類轉化為子類,為下行,不安全。結果會返回null

if(p1==null)

printf("空指標p1");//結果顯示:空指標null

如:p2 = dynamic_cast_cast(p1);      //子類轉化為基類,為上行,安全。結果不會返回null

if(p1==null)

printf("空指標p1");//無顯示

reinterp_cast簡單的轉換,萬能的轉換。也是危險的,程式設計師得自己保證它的安全。

const_cast用來修改型別的const或volatile屬性。

用法:const_cast(expression)

該運算子用來修改型別的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的型別是一樣的。

常量指標被轉化成非常量指標,並且仍然指向原來的物件;

常量引用被轉換成非常量引用,並且仍然指向原來的物件;常量物件被轉換成非常量物件。

class b{

public:

int m_inum;

void foo(){

const b b1;

b1.m_inum = 100; //comile error

b b2 = const_cast(b1);

b2. m_inum = 200; //fine

上面的**編譯時會報錯,因為b1是乙個常量物件,不能對它進行改變;

使用const_cast把它轉換成乙個非常量物件,就可以對它的資料成員任意改變。注意:b1和b2是兩個不同的物件。

c 四種型別轉換

c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a。c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...

C 四種型別轉換

include include includeusing namespace std static cast 用法 static cast type id expression 該運算子把expression轉換為type id型別,但沒有執行時型別檢查來保證轉換的安全性。它主要有如下幾種用法 用於...

C 四種型別轉換

1 static cast 1.上行轉換,把派生類的指標或引用轉換成基類,此時是安全的 2.下行轉換,把基類的指標或者引用轉換成派生類,因為沒有動態監測,所以是不安全的 3.顯示型別轉換,如int轉float等 4.任意型別空指標轉任意型別空指標 5.任意型別表示式轉為void型別 如下 int a...