C 四種強轉

2021-08-22 19:47:42 字數 3305 閱讀 2756

標準c++中有四個型別轉換符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。

reinterpret_cast轉換是在類c轉換的基礎上,在編譯期間,約束了整型、浮點型和列舉型別的相互轉換。

用法:reinpreter_cast(expression_r_r)

type-id必須是乙個指標、引用、算術型別、函式指標或者成員指標。它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標(先把乙個指標轉換成乙個整數,在把該整數轉換成原型別的指標,還可以得到原先的指標值)。

int i;

char *ptr="hello freind!";

i=reinterpret_cast(ptr);

注意:1、並不支援所有的型別轉換

不可用於浮點和整型之間的轉換,也不可以用於列舉和整型的轉換

(c++中有沒有提供整型、浮點和列舉型別的相互轉換方法呢?有的!見static_cast)

eg:可以將指標型別轉換為足以儲存指標的表示的型別(int...);但不可以轉成比指標還小的型別

static_cast < type-id > ( expression_r_r )

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

1、用於類層次結構中基類和子類之間指標或引用的轉換。

進行向上轉換(把派生類的指標或引用轉換成基類表示)是安全的;

進行向下轉換(把基類指標或引用轉換成派生類表示)時,由於沒有動態型別檢查,所以是不安全的。

2、用於內建的資料型別之間的轉換

如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。

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

補充:static_cast

約束了指標和整型的相互轉換。

約束了無關係型別的指標的相互轉換。(無型別指標除外)

static_cast在彙編級的**和類c強制轉換是一致的。

dynamic_cast在底層並不像之前的介紹的幾種轉換方法使用簡單的記憶體拷貝,而是使用了rtti技術,所以它要求操作的指標是多型的。一般來說,因為rtti技術作用於執行時,所以其會產生執行時的代價。所以很多人建議,如果在能明確轉換安全的場景下,不要使用dynamic_cast方法進行轉換,而是使用static_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 d:public b

;void func(b *pb)

在上面的**段中,如果pb指向乙個d型別的物件,pd1和pd2是一樣的,並且對這兩個指標執行d型別的任何操作都是安全的;但是,如果pb指向的是乙個 b型別的物件,那麼pd1將是乙個指向該物件的指標,對它進行d型別的操作將是不安全的(如訪問m_szname),而pd2將是乙個空指標。另外要注意:b要有虛函式,否則會編譯出錯;static_cast則沒有這個限制。這是由於執行時型別檢查需要執行時型別資訊,而這個資訊儲存在類的虛函式表。

用法:const_cast(expression_r_r)

該運算子用來修改型別的const或volatile屬性。除了const 或volatile修飾之外的部分, type_id和expression_r_r的型別是一樣的。

常量指標被轉化成非常量指標,並且仍然指向原來的物件;

常量引用被轉換成非常量引用,並且仍然指向原來的物件;

常量物件被轉換成非常量物件。

class b

int main()

因為b1是乙個常量物件,不能對它進行改變;使用const_cast把它轉換成乙個非常量物件,就可以對它的資料成員任意改變。

注意:b1和b2是兩個不同的物件。

五、最容易理解的解釋:

dynamic_cast:通常在基類和派生類之間轉換時使用;

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

static_cast:一般的轉換,如果你不知道該用哪個,就用這個。   

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

總結:類c強制轉換十分強大。因為它是二進位制級別記憶體拷貝操作,所以可以大部分場景不會出現編譯錯誤。但是如果用它去轉換指標,可能會出現執行時錯誤。

reinterpret_cast、static_cast和dynamic_cast主要用於指標的轉換。

reinterpret_cast的能力僅次於類c轉換。雖然它約束了整型、浮點和列舉型別的相互轉換,但是還是支援指標和整型的轉換。它也存在轉換後執行時出錯的隱患。

static_cast彌補了reinterpret_case對整型、浮點和列舉型別的相互轉換的功能。除了這些轉換外,它要求操作的引數是指標。

且已經出現c++特性限制,要求指標轉換時的類存在繼承關係(void*除外)。它也存在轉換後執行時出錯的隱患。

dynamic_cast已經是純的c++特性轉換,使用到了rtti技術。於是它要求操作的指標型別具有多型特性。它解決了指標轉換後使用出現執行時出錯的問題,但是使用該方法要付出執行時計算的代價。如果能明確轉換是安全的,建議使用static_cast方法(不使用reinterpret_cast是因為它還沒體現出c++的特性)。

const_cast用於增加和去掉一些型別描述標誌,如const等。

object轉string的四種方式

通常object到string有四種方式 假設有object obj obj.tostring,convert.tostring,string obj,obj as string。他們都能將object物件轉換成string物件。我就講講他們的異同以及在實際中應該使用哪個。前兩個方法通常是由別的物件...

轉 ahb匯流排四種傳輸型別

每個傳輸都可以被分類為四個不同型別之一,如htrans 1 0 訊號所表示的狀態,詳見下表 htrans 1 0 類 型描 述00空閒 idle 表示沒有資料.每個傳輸都可以被分類為四個不同型別之一,如htrans 1 0 訊號所表示的狀態,詳見下表 htrans 1 0 類 型描 述 00空閒 i...

C 四種排序演算法

c 四種排序演算法 sabine 本文介紹了c 的四種排序演算法 氣泡排序 選擇排序 插入排序 和希爾排序 氣泡排序 using system namespace bubblesorter public class mainclass bubblesorter sh new bubblesorter...