指標強轉的區別

2021-06-08 20:33:09 字數 1514 閱讀 7971

最容易理解的解釋:

dynamic_cast:   通常在基類和派生類之間轉換時使用;在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全。

const_cast:   主要針對const和volatile的轉換.   

static_cast:   子類轉基類(上行轉換)安全,基類轉子類(下行轉換)不安全。   

reinterpret_cast:   用於進行沒有任何關聯之間的轉換,比如乙個字元指標轉換為乙個整形數。

關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c++ 之父的《c++ 的設計和演化》。最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c++的型別轉換符:static_cast, dynamic_cast。標準c++中有四個型別轉換符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。下面對它們一一進行介紹。

static_cast

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

該運算子把expression_r_r轉換為type-id型別,但沒有執行時型別檢查來保證轉換的安全性。它主要有如下幾種用法:

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

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

把空指標轉換成目標型別的空指標。

把任何型別的表示式轉換成void型別。

注意:static_cast不能轉換掉expression_r_r的const、volitale、或者__unaligned屬性。

dynamic_cast

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

該運算子把expression_r_r轉換成type-id型別的物件。type-id必須是類的指標、類的引用或者void *;如果type-id是類指標型別,那麼expression_r_r也必須是乙個指標,如果type-id是乙個引用,那麼expression_r_r也必須是乙個引用。

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

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

class b

class b:public a{};

class d:public a{};

void foo()

上面的**編譯時會報錯,因為b1是乙個常量物件,不能對它進行改變;使用const_cast把它轉換成乙個常量物件,就可以對它的資料成員任意改變。注意:b1和b2是兩個不同的物件。

類型別的強轉多型的指標

父類 public class person子類 public class student extends person測試類 public class test public static void main string args person p new student p.name 張三 s...

C語言 指標(二)指標型別的強轉

先來看一段 int main int n sizeof ar sizeof ar 0 int p ar for int i 0 i n i cout endl return 0 通過執行結果我們會發現輸出結果之間相差位址相差4,剛好符合了int的4個位元組,如果把int換成double char呢?...

iOS物件指標和基礎資料型別的強轉詳解

本文主要介紹了ios中物件指標和基礎資料型別如何進行強轉,下面話不多說,直接來看示例詳解。一 物件指標的強 uiview view uiview new new乙個uiview類的物件 uilabel label uilab程式設計客棧el view 強轉成uilabel指標 label.text ...