程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ 四種類型轉換操作符

C++ 四種類型轉換操作符

編輯:C++入門知識

C++ 四種類型轉換操作符


一、C風格類型轉換操作符

 

(type) expression

 

例子:

 

int firstNumber, secondNumber;
double result = ((double)firstNumber)/secondNumber;


 

二、C++類型轉換操作符

1.static_cast 在功能上基本上與 C 風格的類型轉換一樣強大,含義也一樣。

double result = static_cast(firstNumber)/secondNumber;

它也有功能上限制。例如,你不能用 static_cast 象用 C 風格的類型轉換一樣把 struct 轉換成 int 類型或者把 double 類型轉換成指針類型,另外,static_cast 不能從表達式中去除 const 屬性,因為另一個新的類型轉換操作符 const_cast 有這樣的功能。

2.const_cast 用於類型轉換掉表達式的 const 或 volatileness 屬性。通過使用 const_cast,你向人們和編譯器強調你通過類型轉換想做的只是改變一些東西的 constness 或者 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
 //函數中能被更新)
update((SpecialWidget*)&csw);
 // 同上,但用了一個更難識別
 //的 C 風格的類型轉換
Widget *pw = new SpecialWidget;
update(pw); // 錯誤!pw 的類型是 Widget*,但是
 // update 函數處理的是 SpecialWidget*類型
update(const_cast(pw));
 // 錯誤!const_cast 僅能被用在影響
 // constness or volatileness 的地方上。,
 // 不能用在向繼承子類進行類型轉換。

 

顯然,const_cast 最常見的用途就是將某個對象的常量性去除掉。

3.dynamic_cast 用於安全地沿著類的繼承關系向下進行類型轉換。這就是說,你能用 dynamic_cast 把指向基類的指針或引用轉換成指向其派生類或其兄弟類的指針或引用,而且你能知道轉換是否成功。失敗的轉換將返回空指針(當對指針進行類型轉換時)或者拋出異常(當對引用進行類型轉換時)
Widget *pw;
...
update(dynamic_cast(pw));
 // 正確,傳遞給 update 函數一個指針
 // 是指向變量類型為 SpecialWidget 的 pw 的指針
 // 如果 pw 確實指向一個對象,
 // 否則傳遞過去的將使空指針。
void updateViaRef(SpecialWidget& rsw);
updateViaRef(dynamic_cast(*pw));
 //正確。 傳遞給 updateViaRef 函數
 // SpecialWidget pw 指針,如果 pw
 // 確實指向了某個對象
 // 否則將拋出異常
dynamic_casts 在幫助你浏覽繼承層次上是有限制的。它不能被用於缺乏虛函數的類型上(參見條款 M24),也不能用它來轉換掉 constness。
int firstNumber, secondNumber;
double result = dynamic_cast(firstNumber)/secondNumber;
 // 錯誤!沒有繼承關系

const SpecialWidget sw;
update(dynamic_cast(&sw));
 // 錯誤! dynamic_cast 不能轉換掉 const。
4.reinterpret_cast 的轉換結果幾乎都是執行期定義( implementation-defined 。 因 此 ,使用reinterpret_casts 的代碼很難移植。reinterpret_casts 的最普通的用途就是在函數指針類型之間進行轉換。

例如,假設你有一個函數指針數組:

typedef void (*FuncPtr)(); // FuncPtr is 一個指向函數的指針,該函數沒有參數,返回值類型為 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++不保證所有的函數指針都被用一樣的方法表示),在一些情況下這樣的轉換會產生不正確的結果(參見條款 M31),所以你應該避免轉換函數指針類型。

 

三、總結

總結一下就是:

static_cast 和 C 風格的強制類型轉換類似,除了不能把struct轉換為int、double轉化為指針類型這樣;

const_cast 用於改變const和volatileness屬性,常見的是去掉const屬性(把const對象轉為非const);

dynamic_cast 用於類繼承關系的向下轉換,但不能用於缺乏虛函數的類型;

reinterpret_cast 的轉換結果是執行期定義的。

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved