C++添加了四種類型轉(zhuǎn)換運(yùn)算符:
const_cast<type-name>(expression);
static_cast<type-name>(expression);
dynamic_cast<type-name>(expression);
reinterpret_cast<type-name>(expression)
其中type-name
表示轉(zhuǎn)換后的類型锋爪,expresion
表示被轉(zhuǎn)換的表達(dá)式。
const_cast
const_cast 只能用于改變值的const
或volatile
屬性。就是把常量轉(zhuǎn)為變量煞额,把變量轉(zhuǎn)為常量波闹。也就是說它的type-name
和expression
類型必須相同。
#include<iostream>
class High{};
class Low{};
int main()
{
High fuck;
const High* pfuck = &fuck;
High* ph = const_cast<High*>(pfuck);// 合法;只改變類型屬性驱还。
Low* pl = const_cast<Low*>(pfuck); // 不合法;除了改變類型屬性外還改變了類型嗜暴。
return 0;
}
static_cast
static_cast 用于C++內(nèi)置類型之間的轉(zhuǎn)換以及相互聯(lián)系的自定義類之間的轉(zhuǎn)換,但是基本類型指針之間是不能轉(zhuǎn)換的议蟆,因為它們是完全不同的類型闷沥,比如unsigned char*、char*之間是不能用static_cast來轉(zhuǎn)換的咐容,這應(yīng)該使用reinterpret_cast來轉(zhuǎn)換舆逃。
double d = 5.987;
int n = static_cast<int>(d);
假設(shè)High類是Low的基類,而Pond是一個無關(guān)的類戳粒,則從High到Low,從Low到High的轉(zhuǎn)換都是合法的路狮,而從Low或者High到Pond的轉(zhuǎn)換則是不允許的;但是蔚约,對于類層次結(jié)構(gòu)來說奄妨,只有上行轉(zhuǎn)換是安全的,下行轉(zhuǎn)換是不安全的苹祟;另外砸抛,static_cast
還可以用于空指針轉(zhuǎn)和任何類型的目標(biāo)指針之間的互相轉(zhuǎn)換以及把任何類型的表達(dá)式轉(zhuǎn)換成void類型。
#include<iostream>
#include<cstdio>
class High{public:void print(){std::cout<<"CLASS HIGH"<<std::endl;}};
class Low:public High{};
class Pond{};
int main()
{
High bar;
Low blow;
High* ph = static_cast<High*>(&blow); //合法
Low* pl = static_cast<Low*>(&bar); //合法
const Low* ll = static_cast<const Low*>(&bar); // 合法
Pond* pp = static_cast<Pond*>(&bar); //不合法
void* pv = NULL;
High* ph = static_cast<High*>(pv);
ph -> print(); // CLASS HIGH
High a;
pv = static_cast<void*>(&a);
High* phh = static_cast<High*>(pv);
phh -> print(); // CLASS HIGH
return 0;
}
dynamic_cast
dynamic_cast是在運(yùn)行階段進(jìn)行的類型轉(zhuǎn)換檢查树枫。它有幾個要點(diǎn):
- dynamic_cast 只能用于類之間的轉(zhuǎn)換直焙,不能用于內(nèi)置類型之間的轉(zhuǎn)換。
- dynamic_cast轉(zhuǎn)換如果成功的話返回的是轉(zhuǎn)換后指針或引用砂轻,轉(zhuǎn)換失敗的話則會返回NULL奔誓。
- 類之間一定要有繼承關(guān)系。
- 在進(jìn)行向下類型轉(zhuǎn)換的時候基類必須要有虛函數(shù)舔清。
- 在類層次間進(jìn)行上行轉(zhuǎn)換時丝里,dynamic_cast和static_cast的效果是一樣的曲初;在進(jìn)行下行轉(zhuǎn)換時,dynamic_cast具有類型檢查的功能杯聚,比static_cast更安全臼婆。
所謂上行轉(zhuǎn)換或下行轉(zhuǎn)換就是對于一顆繼承樹而言,從派生類到基類的轉(zhuǎn)換屬于上行轉(zhuǎn)換幌绍,也即向上類型轉(zhuǎn)換颁褂;從基類到派生類的轉(zhuǎn)換屬于下行轉(zhuǎn)換,也即向下類型轉(zhuǎn)換傀广。
#include<iostream>
#include<cstdio>
class High{public:virtual void f(){}};
class Low:public High{};
int main()
{
High bar;
Low blow;
High* ph = dynamic_cast<High*>(&blow); // up
Low* pl = dynamic_cast<Low*>(&bar); //down;不成功會返回空指針或拋出異常颁独。
return 0;
}
reinterpret_cast
相當(dāng)于C風(fēng)格的通用類型轉(zhuǎn)換,任意兩個類型之間都可以轉(zhuǎn)換伪冰,但它更多是用于兩個指針之間的轉(zhuǎn)換誓酒,比如,int*和unsigned int*之間贮聂。