瞭解c++中的類型轉換

1、static_cast(隱式類型轉換)—–>相關類型的轉換

static_cast用於非多態類型的轉換(靜態轉換),任何標準轉換都可以用它,但
它不能用於兩個不相關的類型進行轉換。

2、reinterpret_cast(強制類型轉換)

reinterpret_cast操作符用於將一種類型轉換爲另一種不同的類型。

3.const_cast(去const屬性的類型轉換)

const_cast最常用的用途就是刪除變量的const屬性,方便賦值。

4、dynamic_cast(動態類型轉換)——->適用於多態

dynamic_cast用於將一個父類對象的指針轉換爲子類對象的指針或引用(動態轉換)
向上轉型:子類對象指針->父類指針/引用(不需要轉換)
向下轉型:父類對象指針->子類指針/引用(用dynamic_cast轉型是安全的)

重點:轉換需要滿足以下條件:
1. dynamic_cast只能用於含有虛函數的類
2. dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回0
示例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

struct A
{
    A(int a)
    :_a(a)
    {}
    virtual void fun()
    {}
    int _a;
};

struct B :public A
{
    B(int a, int b)
    :_b(b)
    , A(a)
    {}
    int _b;
};

void Fun(A* pa)
{
    //如何判斷pa綁定的對象是父類對象還是子類對象
    B* pb1 = dynamic_cast<B*> (pa);//動態轉換
    B* pb2 = reinterpret_cast<B*> (pa);//強制類型轉換

    cout << pb1 << endl;
    cout << pb2 << endl;
}

void Test()
{
    A a1(1);//構造函數

    //應該爲:先調構造函數使用4構造一個A類的對象,再使用這個臨時對象拷貝構造一個A類的對象a2.
    //可以使用下面方式來構造一個A類類型的對象的條件是:
    //①構造函數必須是單參的;
    //②構造函數不能使用explict修飾,explict關鍵字防止隱式類型轉換
    A a2 = 4;    //(隱式類型轉換)編譯器對這個表達式做了優化,即就是隻調了A類的構造函數。
    B bb(2,3);
    Fun(&a1);//綁定父類對象
    Fun(&bb);//綁定子類對象
}

int main()
{
    Test();
    return 0;
}

結果如下:

這裏寫圖片描述

從上述結果可得:
當將綁定父類對象的指針轉換(強轉或者動態轉換)爲子類的指針時,動態轉換的子類指針結果爲空(0)。
而將綁定子類對象的指針轉換(強轉或動態轉換)爲子類的指針時,動態轉換的子類指針和強制類型轉換的結果相等且不爲0。

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