c 顯示型別轉換

2021-09-06 08:04:30 字數 2434 閱讀 8707

c++引入了4個新的強制型別轉換操作符,static_cast、dynamic_cast、const_cast、reinterpret_cast,用以支援更為精細的型別轉換。這些操作符取代了以往小圓括號所代表的舊式轉型,能夠清楚闡明轉型的目的。這些新式轉型操作符給了編譯器更多資訊,讓編譯器清楚知道轉型的理由,並在轉型失敗時發布乙份錯誤報告。

1. static_cast

static_cast在功能上基本上與c風格的型別轉換一樣強大,所以它是4個操作符中最常用的那個。但它也有功能上的限制,例如static_cast 不能從表示式中去除const屬性(這是const_cast的工作)。

int

firstnumber, secondnumber;

...double result = ((double)firstnumber)/secondnumber;

double result = static_cast(firstnumber)/secondnumber;

2. dynamic_cast

用於安全地沿著類的繼承關係向下進行型別轉換。這就是說,能用dynamic_cast把指向基類的指標或引用轉換成指向其派生類或其兄弟類的指標或引用,而且能知道轉換是否成功。失敗的轉換將返回空指標(當對指標進行型別轉換時)或者丟擲異常(當對引用進行型別轉換時)。

widget *pw;

...update(dynamic_cast

(pw));

void updateviaref(specialwidget&rsw);

updateviaref(dynamic_cast

(*pw));

3. const_cast

const_cast 用於設定或去除表示式的const或 volatileness屬性。

class

widget ;

class specialwidget: public

widget ;

void update(specialwidget *psw);

specialwidget sw;

//sw是乙個非const物件。

const specialwidget& csw = sw; //

csw是sw的乙個引用

//它是乙個const 物件

update(&csw); //

錯誤!不能傳遞乙個const specialwidget* 變數

//給乙個處理specialwidget*型別變數的函式

update(const_cast

(&csw));

//正確,csw的const被顯示地轉換掉

//(csw和sw兩個變數值在update函式中能被更新)

4. reinterpret_cast

使用這個操作符的型別轉換,其轉換結果幾乎都是執行期定義(implementation-defined)。可能重新解釋bits意義,也可能不是。因此,使用reinterpret_casts的**很難移植,慎用reinterpret_cast。

reinterpret_casts的最普通的用途就是在函式指標型別之間進行轉換。 例如,假設有乙個函式指標陣列:

typedef void (*funcptr)();  //

funcptr是乙個指向函式的指標,該函式沒有引數

//返回值型別為 void

funcptr funcptrarray[10]; //

funcptrarray 是乙個能容納 10 個funcptrs指標的陣列

假設希望(因為某些莫名其妙的原因)把乙個指向下面函式的指標存入funcptrarray陣列:

int dosomething();

不能不經過型別轉換而直接去做,因為 dosomething 函式對於funcptrarray 陣列來說是乙個錯誤的型別。在funcptrarray 陣列裡的函式返回值是void型別,而dosomething 函式返回值是int型別。

funcptrarray[0] = &dosomething;  //

錯誤!型別不匹配

reinterpret_cast可以迫使編譯器以你的方法去看待它們:

funcptrarray[

0] = //

this compiles

reinterpret_cast(&dosomething);

轉換函式指標的**是不可移植的(c++不保證所有的函式指標都被用一樣的方法表示),在一些情況下這樣的轉換會產生不正確的結果,所以應該避免轉換函式指標型別,除非你處於著背水一戰和尖刀架喉的危急時刻。

【學習資料】 《c++ primer》 《more effective c++》 《c++標準程式庫》

C 顯示型別轉換

首先說明,該內容主要摘自c stl 開發技術導引。在c語言中,我們一般採用隱式型別轉換,這樣導致的結果是可讀性不高。如下這段 這段 將double型別轉換成了int型別,問題是如果別人來看這段 的時候,別人可能就不知道這種轉換是程式需要的還是編寫 的人不小心寫錯了呢。因此,在c 程式中應盡量使用顯示...

c 顯示型別轉換

dynamic cast,static cast,const cast,1.使用dynamic cast 操作符將基類型別物件的引用或者指標轉換為同一繼承層次中其他型別的引用或者指標 執行時型別檢查 2.const cast 操作符將變數的const性質轉換掉 example1 double d 8...

C 中顯示型別轉換

c 引入了 const cast,reinterpret cast 之類的新的顯式型別轉換方式,不僅大多數 c 程式設計師覺得不是很習慣,就連某些有經驗的c 程式設計師都會在一些細節上犯錯。誠然,既然我們可以簡單的寫出 int i int p p is a pointer 這樣的顯式轉換,為什麼還要...