類型轉換運算符
在c種允許以下轉換
struct Junk
{
int junk[100];
};
Data d = { 11,23,124 };
char* pch = (char*)(&d);
char ch = char(&d);
Junk* pj = (Junk*)(&d);
C++新增
dynamic_cast
若A是B的基類, A *a,B b;
則a = dynamic_cast<A >b;
在類層次結構中進行向上轉換
const_cast
該運算符用于執行隻有一種用途的轉換,即改變值為const 或volatile。文法和dynamic_cast相同
const_cast(expression)
若類型的其它方面也被修改,則上述的類型轉換将出錯。即除了const 或volatile可以不同外,其它的typename和expression必須相同。
High bar;
const High *pbar = &bar;
High *pb =const_cast<High >(pbar); //ok 删除const标簽
const Lowp1 = const_cast<const Low *>(pbar); 不行,同時嘗試将const High 轉為const Low
也可以通過通用類型轉換實作,但通用轉換有時候可能會改變類型
High bar;
const High *pbar = &bar;
High *pb = (High *)(pbar);
Low p1 = (Low)(pbar);
由于程式設計時可能同時改變類型和常量特征,是以使用const_cast更安全。const_cast不是萬能,它可以修改一個指向一個值的指針,但修改const值得結果是不确定得。
#include <iostream>
using namespace std;
///指針被申明為const int* ,是以不能修改指向得int。但pc删除了const,是以可以修改原來得值,但僅當指向得值不是const時才是可行得,
//是以可以修改pop1 不能修改pop2.
void change(const int* pt, int n)
{
int* pc;
pc = const_cast<int*>(pt); //删除const
*pc += n;
}
int main()
{
int pop1 = 38383;
const int pop2 = 2000; //聲明為const 禁止修改
cout << " pop1 :" << pop1 << "; pop2: " << pop2 << endl;
change(&pop1, -103);
change(&pop2, -103);
cout << " pop1 :" << pop1 << "; pop2: " << pop2 << endl;
//輸出
/*pop1 : 38383; pop2: 2000
pop1 : 38280; pop2: 2000*/
}
static_cast
第一種轉換合理得,因為向上轉換可以顯示的進行,第二從基類指針,到派生類指針,不顯示轉換無法進行。由于無需進行類型轉換,便可以進行另一個方向的類型轉換,是以使用static_cast向下轉換合法的
同理,由于無需進行類型轉換,枚舉值就可以被轉為整型,是以可用static_cast将整型轉為枚舉,也可以将double轉為int ,float 轉為long以及其他各種數值轉換