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);
}