1、const_cast
用於修改const指針指向的值
形式:const_cast <type> (expression)
void Test_const_cast()
{
int num = 10;//若num爲const時,則無法修改num的值
const int* p = #
//*p = 12;不可改
int* n = const_cast<int*>(p);
*n = 11;
cout << num << '\t' << *p << endl;//num = 11, *p = 11
}
2、static_cast
用於各種隱式轉換,比如非const轉const,void*轉指針等, static_cast能用於多態向上轉化,如果向下轉能成功但是不安全,結果未知;
void Test_static_cast()
{
int num = 10;
int* p = #
const int* n = static_cast<int*>(p);
//*n = 11;不可修改
cout << num << '\t' << *n << endl;
}
3、dynamic_cast
用於動態類型轉換。只能用於含有虛函數的類,只能向上轉換。
向上轉換:指的是子類向基類的轉換
向下轉換:指的是基類向子類的轉換
class Father
{
public:
Father():a(10)
{}
virtual void Fun()
{
cout << "父類" << endl;
}
private:
int a;
};
class Son:public Father
{
public:
Son():a(12)
{}
void Fun()
{
cout << "子類" << endl;
}
private:
int a;
};
void Test_dynamic_cast()
{
Son* son = new Son;
Father* fa = dynamic_cast<Father*>(son);
fa->Fun();//調用子類函數
/*Father fa1;
Father& fa2 = fa1;
Son& son1 = dynamic_cast<Son&>(fa2);
son1.Fun();拋出異常*/
Father* fa1 = new Father;
Son* son1 = dynamic_cast<Son*>(fa1);//son1是空指針
son1->Fun();
delete[] son;
delete[] fa1;
son = NULL;
fa1 = NULL;
}
4、reinterpret_cast
幾乎什麼都可以轉,比如將int轉指針,可能會出問題。