在學習c++類型轉換之前,我們要先看一下c語言時學習的類型轉換。c語言學過兩種類型轉換:
- (1)隱式類型轉換
- (2)顯示的強制類型轉換
void Test()
{
int i = 1;
//隱式類型轉換
double d = i;
printf("%d,%.2f\n",i,d);
int* p = &i;
//顯示的強制類型轉換
int address = (int)p;
printf("%x,%d\n",p,address);
}
c語言類型轉換的缺陷是:轉換的可視性較差,所以的類型轉換都是以一種相同形式書寫,難以跟蹤錯誤的轉換
c++爲了加強類型轉換的可視性,引入了四種命名的強制類型轉換操作符
static_cast、reinterpret_cast、const_cast、dynamic_cast
一.static_cast
static_cast用於非多態類型的轉換(靜態轉換),編譯器隱式執行的任何類型的轉換都可用static_cast;例如:非const轉const,void* 轉指針等,但是它不能用於兩個不相關的類型進行轉換。
int main()
{
double d = 12.34;
int a = static_cast<int>(d);
cout << a <<endl;
return 0;
}
二.reinterpret_cast
reinterpret_cast操作符通常爲操作數的位模式提供較低層次的重新解釋,用於一種類型磚混啊爲另一種不同的類型。
幾乎什麼都可以轉,比如將int轉指針,可能會出現問題,儘量少用。
typedef void (* FUNC)();
int DoSomething(int i)
{
cout << "DoSomething" <<endl;
return 0;
}
void Test()
{
//
FUNC f = reinterpret_cast<FUNC>(DoSomething);
f();
}
三,const_cast
const_cast最常用的用途就是刪除變量的const屬性,方便賦值。
void Test()
{
const int a = 2;
int* p = const_cast<int *> (&a);
*p = 3;
cout << a << endl;
}
四.dynamic_cast
- (1)用於動態的類型轉換,只能用於含有虛函數的類,用於類層次間的向上和向下轉換。只能轉指針或引用。向下轉化時,如果時非法的對於指針返回nullptr,對於引用拋異常。要深入理解內部轉換的原理。
- (2)向上轉換:指的是子類向基類的轉換
- (3)向下轉換:指的是基類向子類的轉換。
- (4)它通過判斷在執行到該語句的時候變量的運行時類型和要轉換的類型是否相同來判斷是否能夠進行向下轉換。
- (5)dynamic_cast用於將一個父類對象的指針轉換爲子類對象的指針或引用(動態轉換)
class A
{
public:
virtual void f(){}
};
class B : public A
{};
void fun(A* p)
{
// dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回
B* p1 = static_cast<B*>(p);
B* p2 = dynamic_cast<B*>(p);
cout << "p1:" << p1 << endl;
cout << "p2:" << p2 << endl;
}
int main()
{
A a;
B b;
fun(&a);
fun(&b);
return 0;
}
五.explicit
explicit關鍵字阻止經過轉換構造函數進行的隱式類型轉換的發生。
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;
}