四種強制類型轉換的比較

前言

這篇文章總結的是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,進行上行轉換時,是安全的,如下:
複製代碼 代碼如下:

include

using namespace std;
class A
{
// ……
};
class B : public A
{
// ……
};
int main()
{
B *pB = new B;
A *pA = dynamic_cast

include

using namespace std;
class CA
{
public:
CA():m_iA(10){}
int m_iA;
};
int main()
{
const CA *pA = new CA;
// pA->m_iA = 100; // Error
CA *pB = const_cast

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章