(轉)C++強制類型轉換

來源:互聯網
上載者:User
  關 於 強 制 類 型 轉換 的 問題 ,很多 書 都 討論過 ,寫的最 詳細 的是 C++ 之父的《 C++ 的 設計 和演化》。最好的解決方案就是不要使用 C 風 格的 強 制 類 型 轉換 ,而是使用 標 准 C++ 的 類 型 轉換 符: static_cast, dynamic_cast 。 標 准 C++ 中有四個 類 型 轉換 符: static_castdynamic_castreinterpret_cast 、和 const_cast 。下面 對 它 們 一一 進 行介 紹 。

static_cast

用法: static_cast < type-id > ( expression )

該 運算子把 expression 轉換為 type-id 類 型,但沒有運行 時類 型 檢查 來保 證轉換 的安全性。 它主要有如下幾 種 用法: ·                               用於 類層 次 結 構中基 類 和子 類 之 間 指 針 或引用的 轉換 。 進 行上行 轉換 (把子 類 的指 針 或引用 轉換 成基 類 表示)是安全的; 進 行下行 轉換 (把基 類 指 針 或引用 轉換 成子 類 表示) 時 ,由於沒有 動態類 型 檢查 ,所以是不安全的。 ·                               用於基本資料 類 型之 間 的 轉換 ,如把 int 轉換 成 char ,把 int 轉換 成 enum 。 這種轉換 的安全性也要 開發 人 員 來保 證 。 ·                               把空指 針轉換 成目 標類 型的空指 針 。 ·                               把任何 類 型的運算式 轉換 成 void 類 型。 注意: static_cast 不能 轉換 掉 expression 的 const 、 volitale 、或者 __unaligned 屬性。

dynamic_cast

用法: dynamic_cast < type-id > ( expression )

該 運算子把 expression 轉換 成 type-id 類 型的 對 象。 Type-id 必 須 是 類 的指 針 、 類 的引用或者 void * ;如果 type-id 是 類 指 針類 型,那 麼 expression 也必 須 是一個指 針 ,如果 type-id 是一個引用,那 麼 expression 也必 須 是一個引用。

dynamic_cast 主要用於 類層 次 間 的上行 轉換 和下行 轉換 , 還 可以用於 類 之 間 的交叉 轉換 。

在 類層 次 間進 行上行 轉換時 , dynamic_cast 和 static_cast 的效果是一 樣 的;在 進 行下行 轉換時 , dynamic_cast 具有 類 型 檢查 的功能,比 static_cast 更安全。 class B{

public:

int m_iNum;

virtual void foo();

};

class D:public B{

public:

char *m_szName[100];

};



void func(B *pb){

D *pd1 = static_cast<D *>(pb);

D *pd2 = dynamic_cast<D *>(pb);

}
在上面的代 碼 段中,如果 pb 指向一個 D 類 型的 對 象, pd1 和 pd2 是一 樣 的,並且 對這 兩個指 針執 行 D 類 型的任何操作都是安全的;但是,如果 pb 指向的是一個 B 類 型的 對 象,那 麼 pd1 將是一個指向 該對 象的指 針 , 對 它 進 行 D 類 型的操作將是不安全的(如 訪問 m_szName ),而 pd2 將是一個空指 針 。另外要注意: B 要有虛函數,否 則 會 編譯 出 錯 ; static_cast 則 沒有 這 個限制。 這 是由於運行 時類 型 檢查 需要運行 時類 型資訊,而 這 個資訊存 儲 在 類 的虛函數表( 關 於虛函數表的概念, 詳細 可 見 <Inside c++ object model> )中,只有定 義 了虛函數的 類 才有虛函數表,沒有定 義 虛函數的 類 是沒有虛函數表的。

另外, dynamic_cast 還 支援交叉 轉換 ( cross cast )。如下代 碼 所示。 class A{

public:

int m_iNum;

virtual void f(){}

};



class B:public A{

};



class D:public A{

};



void foo(){

B *pb = new B;

pb->m_iNum = 100;

D *pd1 = static_cast<D *>(pb); //copile error

D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL

delete pb;

}
在函數 foo
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.