類型轉換const_cast、reinterpret_cast、dynamic_cast、static_cast
- const_cast
- reinterpret_cast
- dynamic_cast
- static_cast
const_cast
被const修飾的函數可以被訪問,但是不能被修改成員變量
const_cast可以去掉const
#include <iostream>
using namespace std;class FHello
{
public:FHello();void Init();/*const*/
private:int a;int b;float c;
};
FHello::FHello()
{a = 0;b = 10;c = 20.f;
}
void FHello::Init()/*const*/
{auto Hello_a = [&](){cout << a << endl;};auto Hello_b = [&]()->bool{cout << b << endl;return true;};Hello_a();if (bool bHello = Hello_b()){cout << "true" << endl;}else{cout << "false" << endl;}
}
int main()
{const FHello* HelloTest = new FHello();//HelloTest->Init();因為HelloTest被const修飾了而上面代碼中沒有用const修飾//用const_cast去掉constFHello* Test = const_cast<FHello*>(HelloTest);Test->Init();//編譯出錯會返回NULL//c風格的強轉,是萬能強轉//容易出問題,萬一轉換失敗了變成野指針了也不知道,少用FHello* NewTest = (FHello*)HelloTest;NewTest->Init();delete HelloTest;return 0;
}
reinterpret_cast
把指針轉換成int,也可以把int轉成指針,也可以指針轉換成指針
#include <iostream>
using namespace std;class FHello
{
public:FHello();void Init();/*const*/
private:int a;int b;float c;
};
FHello::FHello()
{a = 0;b = 10;c = 20.f;
}
void FHello::Init()/*const*/
{auto Hello_a = [&](){cout << a << endl;};auto Hello_b = [&]()->bool{cout << b << endl;return true;};Hello_a();if (bool bHello = Hello_b()){cout << "true" << endl;}else{cout << "false" << endl;}
}
int main()
{//const_castconst FHello* HelloTest = new FHello();FHello* Test = const_cast<FHello*>(HelloTest);Test->Init();FHello* NewTest = (FHello*)HelloTest;NewTest->Init();//reinterpret_cast//reinterpret_cast,先轉換成int,再轉換成指針int a = reinterpret_cast<int>(NewTest);FHello*b = reinterpret_cast<FHello*>(a);b->Init();//也可以轉換成int*指針,也可以轉換回來int* a2 = reinterpret_cast<int*>(NewTest);FHello* b2 = reinterpret_cast<FHello*>(a2);b2->Init();//可以轉換成float*指針,但是不可以用float類型float* a3 = reinterpret_cast<float*>(NewTest);FHello* b3 = reinterpret_cast<FHello*>(a3);b3->Init();delete HelloTest;return 0;
}
dynamic_cast
動態的轉化:可以向上轉化也可以向下轉化
向上轉化和向下轉化的意思是在數層的繼承關系中,可以向父類或派生類進行轉化
向下轉換時會進行類型檢測,如果類型無法轉換回返回NULL。是一個比較安全的轉換
接口(父類)必須有虛函數,否則會報錯
#include <iostream>
using namespace std;class FHello
{
public:FHello();virtual ~FHello();void Init();/*const*/
private:int a;int b;float c;
};
FHello::FHello()
{a = 0;b = 10;c = 20.f;
}
FHello::~FHello() {}
void FHello::Init()/*const*/
{auto Hello_a = [&](){cout << a << endl;};auto Hello_b = [&]()->bool{cout << b << endl;return true;};Hello_a();if (bool bHello = Hello_b()){cout << "true" << endl;}else{cout << "false" << endl;}
}class FHello1:public FHello
{
public:void Hello1temp() {}
private:int a;
};class FHello2 :public FHello1
{};int main()
{//const_castconst FHello* HelloTest = new FHello();FHello* Test = const_cast<FHello*>(HelloTest);Test->Init();FHello* NewTest = (FHello*)HelloTest;NewTest->Init();//reinterpret_castint a = reinterpret_cast<int>(NewTest);FHello*b = reinterpret_cast<FHello*>(a);b->Init();int* a2 = reinterpret_cast<int*>(NewTest);FHello* b2 = reinterpret_cast<FHello*>(a2);b2->Init();float* a3 = reinterpret_cast<float*>(NewTest);FHello* b3 = reinterpret_cast<FHello*>(a3);b3->Init();//dynamic_castFHello* h1 = new FHello1();//這一步也是向上轉換//向下轉換:FHello1* A = dynamic_cast<FHello1*>(h1);A->Hello1temp();//向上轉換,用的少,因為有更簡單的方法,如上FHello* B = dynamic_cast<FHello*>(A);B->Init();FHello* B2 = A;//進行隱式轉換FHello2* FHA2 = dynamic_cast<FHello2*>(h1);//轉換失敗,輸出NULLif (FHA2){}delete HelloTest;delete h1;return 0;
}
static_cast
可以向上轉化也可以向下轉化
向下轉換時不安全
static_cast不可以轉換const、volitale、_unaligned
static_cast和dynamic_cast相比static_cast可以沒有虛函數,而dynamic_cast必須有虛函數
格式
FHello* A=static_cast<FHello*>(B);