近日在看《C++ primer》,不得不說,中國的教材有些坑人,老師也有些坑人,只是說有些坑人,因為還是有些不錯的!
在需要資料類型轉換時,我習慣於用()進行轉換,這也是譚浩強書本教的,也是大學老師教的方式。今天讀《C++ primer》方才知道這是一種C風格的資料類型轉換,是C++為了相容C而保留下來的。
實際上,C++提供了類型轉換操作符供顯示的類型轉換,即:
static_cast, dynamic_cast, const_cast, reinterpret_cast。
這四個是用來進行顯示資料類型轉換的。
這些資料類型轉換操作符的一致用法是:
cast-name <type> (expression);
其中,cast-name是類型轉換操作符名,type是目的資料類型 ,expression是待轉換資料。
下面對這四個顯式資料轉換操作符進行簡單的說明。
1.static_cast
在C語言中使用()實現的轉換都可以使用static_cast操作符實現之。
2.const_cast
使用該操作符可以將待轉換資料的const屬於去除,如下代碼所示:
#include <iostream>using namespace std;int main(int argc, char ** arg){const int b = 1;int *p = const_cast<int *>(&b);return 0;}
3.reinterpret_cast
通俗的說,這個轉換可以講任何資料類型的指標轉換為其他資料類型的指標。
4.dynamic_cast
用在子類與父類之間的轉換。
這裡引用一個網路的部落格的總結:
http://www.cnblogs.com/ider/archive/2011/08/05/cpp_cast_operator_part6.html
對於傳統的轉換方式(C式或函數式),只在數實值型別(包括整型、浮點型、字元類型和枚舉)上使用。這也是延續C的形式,當然這類轉換也是可以用static_cast來替換,但是因為是基本類型,所以傳統轉換已經很直觀。
對於const_cast轉換運算子,用在需要去除掉const限定的時候。其實這種情況出現的很少,可能的方法在const_cast一文中已經又舉例,不過還是反覆強調,
使用const_cast轉換後,絕對不可試圖修改結果的值。
對於reinterpret_cast轉換運算子,一般用在將對象指標類型轉換到整數類型或者void
* (null 指標)。如同在文中舉出的隱患,因此注意的是,若要使用其結果,一定要將類型轉換回去後使用。也不要將隨意的整數轉換成指標類型。
對於static_cast轉換運算子,將其用在對象的轉換之上(雖然static_cast也可以用在有繼承關係的類型指標之間,但是還是將這方面的轉換交給dynamic_cast來操作吧),
static_cast會調用相應的建構函式或者重載的轉換運算子。