c++的類型轉換


用於類層次結構中基類(父類)和派生類(子類)之間指針或引用的轉換
進行上行轉換:用 父類指針、引用 指向 子類空間(安全)
進行下行轉換:用 子類指針、引用 指向 父類空間(不安全)

在這裏插入圖片描述

1、靜態類型轉換(static_cast)

可作用於 基本類型

可用於 自定義數據類型(結構體 類)

不能作用於 不相關的類之間轉換

class Animal{};
class Dog:public Animal{};
class Other{};


//靜態轉換static_cast
void test01()
{
    //static_cat 作用於 基本類型
    char ch = 'a';
    double d = static_cast<double>(ch);
    cout<<"d = "<<d<<endl;

    //static_cat 作用於 自定義數據類型(結構體 類)
    //關係的類之間
    //上行轉換 安全
    Animal *p1 = static_cast<Animal *>(new Dog);
    //下行轉換  不全 容易越界
    Dog *p2 = static_cast<Dog *>(new Animal);

    // static_cast 不能作用域 不相關的類之間轉換
    //Animal *p3 = static_cast<Animal *>(new Other);//err
}

2、動態轉換dynamic_cast 2-1

不支持 基本類型

可以上行轉換 (父類指針 指向 子類空間 安全)

不支持下行轉換 (子類指針 指向 父類空間 不安全)

不支持 沒有關係的 類型轉換

//dynamic_cast動態轉換
void test02()
{
    //1、dynamic_cast不支持 基本類型
    char ch = 'a';
    //double d=dynamic_cast<double>(ch);//err

    //2、dynamic_cast 上行轉換 (父類指針 指向 子類空間 安全)
    Animal *p1  = dynamic_cast<Animal *>(new Dog);

    //3、dynamic_cast 下行轉換 (子類指針 指向 父類空間 不安全)
    //Dog *p2 = dynamic_cast<Dog *>(new Animal);//不支持 不安全 的轉換

    //4、dynamic_cast 不支持 沒有關係的 類型轉換
    //Animal *p3 = dynamic_cast<Animal *>(new Other);//err
}

3、常量轉換const_cast

支持常量指針轉爲不同指針

不支持 非指針或引用的轉換

支持常量引用 轉換成 普通引用

//常量轉換const_cast
void test03()
{
    const int *p = NULL;
    int *p1 = const_cast<int *>(p) ;

    int *p2 = NULL;
    const int *p3 = const_cast<const int *>(p2);

    //const_cast 不支持 非指針或引用的轉換
    const int a = 100;
    //int b = const_cast<int>(a);//err

    int data = 100;
    //常量引用 轉換成 普通引用
    const int &ob = data;
    int &ob2 = const_cast<int &>(ob);
}

4、重新解釋轉換(reinterpret_cast)

不支持基本數據類型

支持不相關的類型間轉換

支持上行下行轉換

void test04()
{

    //reinterpret_cast 不支持基本數據類型
    char ch='a';
    //double d = reinterpret_cast<double>(ch);//err

    //reinterpret_cast 支持 不相關的類型間轉換
    Animal *p1 = reinterpret_cast<Animal *>(new Other);

    //上行轉換
    Animal *p2 = reinterpret_cast<Animal *>(new Dog);

    //下行轉換
    Dog *p3 = reinterpret_cast<Dog *>(new Animal);

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