1. static_cast
a.使用
用於
非多態類型的轉換
(靜態轉換),支持相關類型轉換
,不支持不相關類型轉換
b.代碼
void Test()
{
int i = 10;
double d = static_cast<double>(i);
cout << i << " " << d << endl;
}
2. reinterpret_cast
a.使用
用於將一種類型轉換爲另一種不同的類型,支持
不相關類型轉換
b.代碼
void Test2()
{
int i = 10;
int *p = &i;
int j = reinterpret_cast<int>(p);
}
3.const_cast
a.使用
去除const屬性
b.代碼
void Test3()
{
const int a = 10;
int *p = const_cast<int*>(&a);
}
4.dynamic_cast
a.使用
用於將一個
父類對象的指針轉換爲子類對象的指針或引用
(動態轉換)
向上轉型:子類對象的指針->父類指針/引用(不需要轉換,隱式轉換)
向下轉型:父類對象指針->子類指針/引用(安全)
注意
:dynamic_cast只能用於含有虛函數的類
dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回0
b.代碼
class A
{
public:
virtual void f()//如果去掉virtal會報錯
{}
};
class B :public A
{};
void fun(A* pa)
{
B *pb1 =static_cast<B*>(pa);
B *pb2 = dynamic_cast <B*>(pa);
cout << "pb1:" << pb1 << endl;
cout << "pb2:" << pb2 << endl;
}
int main()
{
A a;
B b;
fun(&a);
fun(&b);
return 0;
}
結果如下圖:
5.explicit關鍵字
a.使用
explicit關鍵字
阻止經過轉換構造函數進行的隱式轉換的發生
b.代碼
class A
{
public:
explicit A(int a)
{
cout << "A(int a)" << endl;
}
A(const A& a)
{
cout << "A(const A& a)" << endl;
}
private:
int _a;
};
int main()
{
A a1(1);
A a2 = 1;//報錯,隱式轉換:A tmp(1);A a2(tmp)
return 0;
}
對以上A a2=1解釋:
通常只有一個參數的構造函數可被用於轉換(隱式轉換)
,上式相當於 A tmp(1),A a2(tmp);,創建了一個臨時對象。將構造函數聲明爲explicit避免隱式轉換