四種強制型別轉換的比較

2021-07-10 03:27:04 字數 1584 閱讀 2528

前言

這篇文章總結的是c++中的型別轉換,這些小的知識點,有的時候,自己不是很注意,但是在實際開發中確實經常使用的。俗話說的好,不懂自己寫的**的程式設計師,不是好的程式設計師;如果乙個程式設計師對於自己寫的**都不懂,只是知道一昧的的去使用,終有一天,你會迷失你自己的。

c++中的型別轉換分為兩種:

1.隱式型別轉換;

2.顯式型別轉換。

而對於隱式變換,就是標準的轉換,在很多時候,不經意間就發生了,比如int型別和float型別相加時,int型別就會被隱式的轉換位float型別,然後再進行相加運算。而關於隱式轉換不是今天總結的重點,重點是顯式轉換。在標準c++中有四個型別轉換符:static_cast、dynamic_cast、const_cast和reinterpret_cast;下面將對它們一一的進行總結。

static_cast

static_cast的轉換格式:static_cast (expression)

將expression轉換為type-id型別,主要用於非多型型別之間的轉換,不提供執行時的檢查來確保轉換的安全性。主要在以下幾種場合中使用:

1.用於類層次結構中,基類和子類之間指標和引用的轉換;

當進行上行轉換,也就是把子類的指標或引用轉換成父類表示,這種轉換是安全的;

當進行下行轉換,也就是把父類的指標或引用轉換成子類表示,這種轉換是不安全的,也需要程式設計師來保證;

2.用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum等等,這種轉換的安全性需要程式設計師來保證;

3.把void指標轉換成目標型別的指標,是及其不安全的;

注:static_cast不能轉換掉expression的const、volatile和__unaligned屬性。

dynamic_cast

dynamic_cast的轉換格式:dynamic_cast (expression)

將expression轉換為type-id型別,type-id必須是類的指標、類的引用或者是void *;如果type-id是指標型別,那麼expression也必須是乙個指標;如果type-id是乙個引用,那麼expression也必須是乙個引用。

dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全。在多型型別之間的轉換主要使用dynamic_cast,因為型別提供了執行時資訊。下面我將分別在以下的幾種場合下進行dynamic_cast的使用總結:

1.最簡單的上行轉換

比如b繼承自a,b轉換為a,進行上行轉換時,是安全的,如下:

複製** **如下:

using namespace std;

class a

; class b : public a

; int main()

int m_ia;

}; int main()

{ const ca *pa = new ca;

// pa->m_ia = 100; // error

ca *pb = const_cast

四種強制型別轉換

強制型別轉換時有一定風險的,例如把整形轉成指標,基類指標轉成派生類指標,常量指標轉成非常量指標等。c語言中的強制型別轉換 type cast 有顯式和隱式兩種,顯式一般就是直接用小括號強制轉換。沒有從形式上體現出轉換功能和風險的不同。低風險的型別轉換,沒有執行時型別檢查來保證轉換的安全性。1 用於類...

C 四種強制型別轉換

c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...

C 四種強制型別轉換

1 概述 去const屬性用const cast。基本型別轉換用static cast。多型類之間的型別轉換用daynamic cast。不同型別的指標型別轉換用reinterpreter cast。2 詳解加示例 a const cast 用法 const cast 型別 表示式 用途 刪除con...