教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

C++培訓之如何使用c++中的類型轉換

更新時間:2016年08月26日16時14分 來源:傳智播客C++培訓學院 瀏覽次數:

    關于C風格的強制類型轉換是程序猿用的最多的一種轉換方式, 不管什么類型的轉換統(tǒng)統(tǒng)都是TYTE b = (TYPE)a。但是眾所周知C++程序中對類型的檢測非常嚴格,如果類型轉換過程中使用C風格的類型轉換就容易出現一些問題。所以今天傳智播客C/C++專家在這里給大家介紹一下C++風格的類型轉換的幾種轉換操作符以及使用場合。
C++風格的類型轉換提供了4種類型轉換操作符:
const_cast,static_cast,dynamic_cast,reinterpret_cast
4種類型轉換的格式,如:TYPE B = static_cast(TYPE)(a)。
  • const_cast
    • 去掉類型的const或volatile屬性。
struct SA
{
int i;
};
const SA ra;
//ra.i = 10; //直接修改const類型,編譯錯誤
SA &rb = const_cast<SA&>(ra);
rb.i =10;
  • static_cast
類似于C風格的強制轉換。主要應用場景:
  • 基類和子類之間轉換:其中子類指針轉換成父類指針是安全的;但父類指針轉換成子類指針是不安全的。(基類和子類之間的動態(tài)類型轉換建議用dynamic_cast)
  • 基本數據類型轉換。
enum, struct, int, char, float等。static_cast不能進行無關類型(如非基類和子類)指針之間的轉換。
  • 把空指針轉換成目標類型的空指針。
  • 把任何類型的表達式轉換成void類型。
  • static_cast不能去掉類型的const、volitale屬性(用const_cast)。
 int n =6;
// 基本類型轉換
double d = static_cast<double>(n);
int*pn =&n;
// 無關類型指針轉換,編譯錯誤
double*d = static_cast<double*>(&n)
// 任意類型轉換成void類型
void*p = static_cast<void*>(pn);
  • dynamic_cast
有條件轉換、動態(tài)類型轉換,運行時會進行類型安全檢查(轉換失敗返回NULL):
  • 安全的基類和子類之間轉換。
  • 必須要有虛函數。
  • 相同基類不同子類之間的交叉轉換。但結果是NULL。
class ItcastClass
{
public:
int m_iNum;
// 基類必須有虛函數。保持多臺特性才能使用dynamic_cast
virtual void foo(){};
};
 
class HeiMaClass: public ItcastClass
{
public:
char*m_szName[100];
void bar(){};
};
 
ItcastClass* pb =new HeiMaClass();
// 子類->父類,靜態(tài)類型轉換,正確但不推薦
HeiMaClass *pd1 = static_cast<HeiMaClass *>(pb);
// 子類->父類,動態(tài)類型轉換,正確
HeiMaClass *pd2 = dynamic_cast<HeiMaClass *>(pb);
ItcastClass* pb2 =new ItcastClass();
// 父類->子類,靜態(tài)類型轉換,危險!訪問子類m_szName成
 員越界
HeiMaClass *pd21 = static_cast<HeiMaClass *>(pb2);
// 父類->子類,動態(tài)類型轉換,安全的。結果是NULL
HeiMaClass *pd22 = dynamic_cast<HeiMaClass *>(pb2);
  • reinterpret_cast
僅僅重新解釋類型,但沒有進行二進制的轉換:
  • 轉換的類型必須是一個指針、引用、算術類型、函數指針或者成員指針。
  • 在比特位級別上進行轉換。它可以把一個指針轉換成一個整數,也可以把一個整數轉換成一個指針(先把一個指針轉換成一個整數,在把該整數轉換成原類型的指針,還可以得到原先的指針值)。但不能將非32bit的實例轉成指針。
  • 最普通的用途就是在函數指針類型之間進行轉換。
  • 很難保證移植性。
int doSomething(){return0;};
// FuncPtr  是一個指向函數的指針,該函數沒有參數,返回
值類型為 void
typedef void(*FuncPtr)();
// 10個FuncPtrs指針的數組 讓我們假設你希望(因為某些莫
名其妙的原因)把一個指向下面函數的指針存
入funcPtrArray數組:
FuncPtr funcPtrArray[10];
// 編譯錯誤!類型不匹配,reinterpret_cast可以讓編譯器以你
的方法去看待它們:funcPtrArray
funcPtrArray[0] =&doSomething;
//不同函數指針類型之間進行轉換
funcPtrArray[0]=reinterpret_cast<FuncPtr>(&doSomething);
最后傳智播客C/C++專家再為大家總結一下以上四種類型轉換符的使用場景:
  • 去const屬性用const_cast。
  • 基本類型轉換用static_cast。
  • 多態(tài)類之間的類型轉換用daynamic_cast。
  • 不同類型的指針類型轉換用reinterpret_cast。
今天的內容就到這里, 祝大家學習愉快!

 本文版權歸傳智播客C++培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:傳智播客C/C++培訓學院
首發(fā):http://fskzgqt.cn/c/ 
0 分享到:
和我們在線交談!