1. 程式人生 > >C++中4種類型轉換

C++中4種類型轉換

先看下c和cpp型別轉換的區別:

C風格和函式風格的顯式轉換視情況由下面第一個匹配的C++風格顯式轉換構成:


— a const_cast,
— a static_cast,
— a static_cast followed by a const_cast,
— a reinterpret_cast or
— a reinterpret_cast followed by a const_cast

C++轉換的優勢就是從字面上能夠看出你這個轉換的底層含義或潛在的風險,C的轉換“看上去”是無差別的;
對於實際工作中,最簡單的處理方式是禁止使用“不安全”的轉換,這樣的話即便全用C的轉換也是比較安全的;
實際上,當你使用const_cast的時候90%意味著你的介面設計或程式碼實現不合理,當你用dynamic_cast的時候已經步入了C++不提倡的rtti領域,在你去使用這些轉換之前,首先應該想到的是儘量避免他們的出現。

1.static_cast<type>(var)

轉換型別覆蓋了C語言中所有的強制隱式轉換,以及部分這樣的轉換的反向轉換(例如,void* 指標轉型為有型別指標,基類指標轉型為派生類指標),但是它不能將一個 const 物件轉型為 non-const 物件(只有 const_cast 能做到),它最接近於C-style的轉換。

用於基本的資料型別轉換(char,int),及指標之間的轉換。

2.dynamic_cast

主要用於父類和子類之間的轉換,與其他3種不同的是無法在編譯期間知道是否能夠轉換成功。

當用於子類指標轉換為父類指標時,與static_cast一致,而當用於父類指標轉換為子類指標時,首先必須要求父類中存在虛擬函式,否則在編譯期間就會報錯,要求必須有虛擬函式的原因是因為dynamic_cast要利用虛擬函式表來獲得父類資訊。當轉換失敗時返回空指標(static_cast不做檢測,危險)。

3.reinterpret_cast

這種應該就是記憶體裡的資料不變(同一個二進位制數),根據轉換的型別重新解釋,可以把指標轉換為整形數,一般比較少見。

4.const_cast

把const型別轉換為非const型別。

	class C
{
public:
	int a;
	C(int val) { a = val; }
};

	const C* pt1= new C(3);
	C* pt2 = const_cast<C*>(pt1);
	pt2->a = 4;
	cout << "pt1->a="<<pt1->a<<" pt2->a=" << pt2->a;
	delete pt1;

輸出結果都是4,說明解除const成功。

另附引用const:

	int n = 0;
	const int & m = n;
	const short &l = n;
	n = 8;
	cout << n << m << l;
輸出結果為8 8 0

參考: