天天看點

C++四種類型轉換運算符類型轉換運算符dynamic_castconst_caststatic_castreinterpret_cast

類型轉換運算符

在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

C++四種類型轉換運算符類型轉換運算符dynamic_castconst_caststatic_castreinterpret_cast

第一種轉換合理得,因為向上轉換可以顯示的進行,第二從基類指針,到派生類指針,不顯示轉換無法進行。由于無需進行類型轉換,便可以進行另一個方向的類型轉換,是以使用static_cast向下轉換合法的

同理,由于無需進行類型轉換,枚舉值就可以被轉為整型,是以可用static_cast将整型轉為枚舉,也可以将double轉為int ,float 轉為long以及其他各種數值轉換

reinterpret_cast

C++四種類型轉換運算符類型轉換運算符dynamic_castconst_caststatic_castreinterpret_cast

繼續閱讀