c++ 轉型詳解
阿新 • • 發佈:2018-12-15
以前對c++的轉型也看過好幾篇文章,基本用法都比較熟悉。但要說下更詳細的,未免就捉襟見肘。寫篇文章來總結下。
static_cast
1.可用於基本型別的轉換, 這一點比較簡單,不贅述。
2.用於向下型別的轉換,常用於父類轉子類。不進行型別檢查,所以這是不安全的。舉個例子來理解下:
#include<iostream>
class A
{
public:
virtual void hello()
{
std::cout << "hello::A" << std::endl;
}
};
class B :public A
{
public:
virtual void hello()
{
std::cout << "hello::B" << std::endl;
}
};
int main()
{
A a = A();
B* b = static_cast<B*>(&a);
if (b == NULL)
{
std::cout << "Cast failed" << std::endl;
return 0;
}
b- >hello();
return 0;
}
B是A的子類, 將A 轉型為B的時候沒有進行型別檢查。 最後輸出的結果是 ”hello::A“,即轉型沒有轉成功。導致的問題是和我們預期的結果不同。所以在編寫複雜程式的時候,無法進行型別檢查。 因此出的問題也比較難定位。
dynamic_cast
dynamic_cast 主要用於指標的轉換。常用於向下轉型。 比起static_cast, 型別之間的轉換有優勢。 會進行型別檢查。若轉換值為指標型別,轉型失敗會返回NULL。
若上例使用 dynamic_cast,
B* b = dynamic_cast<B*>(&a)
得到的結果就是輸出 cast failed.
總結下,當父類指標轉換為子類的時候,dynamic_cast 更為合適,其他static_cast。
reinterpret_cast
和c語言的強轉類似。可用於整數到指標的轉換,也可用於指標到整數的轉換。這個是static_cast 無法辦到的。
所以 reinterpret_cast 功能更強大。