天天看點

C++強制類型轉換

  C++中的強制類型轉換雖然相容C語言中的強制類型轉換,但是不建議在C++中使用C語言風格的強制類型轉換。C++中的強制類型轉換共有4種:static_cast,dynamic_cast、const_cast、reinterpret_cast.

static_cast

1. 使用格式

  進行編譯期間的類型檢查

  type1 a;

  type2 b = static_cast<type1>(a);

2. 使用範圍

  (1)基本資料類型之間的轉換,如int->double;

    int a = 6;

    double b = static_cast<int>(a);

  (2)派生體系中向上轉型:将派生類指針或引用轉化為基類指針或引用

dynamic_cast

  (1)執行派生類指針或引用與基類指針或引用之間的轉換。

  (2)使用多态的場景,增加了一層對真實調用對象類型的檢查,可以實作向上轉型和向下轉型,前提是必須使用public或protected繼承

  (3)dynamic_cast不是強制轉換,而是帶有某種”咨詢“性質的,如果不能轉換,傳回NULL。這是強制轉換做不到的。

const_cast

  (1)去除const常量屬性,使其可以修改

reinterpret_cast

  僅僅是複制n1的比特位到d_r, 沒有進行必要的分析.interpret_cast是為了映射到一個完全不同類型的意思,這個關鍵詞在我們需要把類型映射回原有類型時用到它。我們映射到的類型僅僅是為了故弄玄虛和其他目的,這是所有映射中最危險的。(這句話是C++程式設計思想中的原話。

#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

class A {
    public:
    A(){};
    int m_a;
};

class B {
    public:
    int m_b;
};

class C : public A, public B {};

int main()
{
    const A a;
    //a.m_a= 1;
    const_cast<A&>(a).m_a = 2;
    //a.m_a= 3;編譯不能通過,說明const_cast隻能轉換一次,不是永久脫離原有const屬性
    cout<<a.m_a<<endl;
    int n = 9;
    double d_s = static_cast<double>(n);
    double d_r = reinterpret_cast<double&>(n);
    cout<<d_r<<endl;//4.24399e-314
    //在進行計算以後, d_r包含無用值. 這是因為 reinterpret_cast\
     僅僅是複制n1的比特位到d_r, 沒有進行必要的分析.interpret_cast是為了映射到一個完全不同類型\
     的意思,這個關鍵詞在我們需要把類型映射回原有類型時用到它。我們映射到的類型僅僅是為了故弄\
     玄虛和其他目的,這是所有映射中最危險的。(這句話是C++程式設計思想中的原話

    C c;
    printf("%p, %p, %p\n", &c, reinterpret_cast<B*>(&c), static_cast <B*>(&c));
    //前兩個的輸出值是相同的,最後一個則會在原基礎上偏移4個位元組,這是因為static_cast計算了父子類指針轉換的偏移量,\
    并将之轉換到正确的位址(c裡面有m_a,m_b,轉換為B*指針後指到m_b處),而reinterpret_cast卻不會做這一層轉換\
    是以, 你需要謹慎使用 reinterpret_cast.


    return 0;
}