c++11增加了幾個static_cast等強制型別轉換函式,在強制型別轉換時盡量使用,這裡總結一下。寫程式時應該盡量避免強制型別轉換,如果實在需要強制型別轉換時,最好使用下面介紹的四種顯式轉換符。
主要的顯式強制型別轉換包括static_cast, dynamic_cast, const_cast, reinterpret_cast,下面詳細介紹一下:
由於下面有些地方需要用到頂層const和底層const,所以這裡解釋一下:
頂層const表明指標或者變數本身是個常量,底層const表明指標或者引用所指向的變數是乙個常量,所以頂層const針對的是變數的屬性,底層const針對的是指向物件的指標和引用,引用都是底層const,指標本身是個變數,所以可以用頂層const,但指標同時可以指向其他變數,所以也可以為底層const,這就要看const修飾的指標本身還是指標指向的變數。
static_cast :
顧名思義,static_cast就是執行靜態強制型別轉換,也就是在編譯階段由編譯器來執行轉換。任何具有明確定義的型別轉換,只要不包含底層const,都可以使用static_cast。
例如:
int i, j;
double value1 = (double)(j) / i; //編譯器會給出警告
double value = static_cast(j) / i; //已經明確告知編譯器強制轉換,不會有編譯警告,轉換的精度損失由開發者承擔
static_cast另外乙個作用是可以找回存在void*中的指標。
int i - 0;
void *p = &i;
int *dp = static_cast(p);
dynamic_cast:
這裡涉及到執行時型別識別(run-time type identification, rtti),主要包括兩個運算子,typeid()和dynamic_cast。typeid()可以獲得該變數的型別,dynamic_cast主要用於將基類的指標或引用安全的轉換成派生類的指標或引用(也可以將派生類的指標或引用轉換為基類的指標或引用)。如果轉換的為指標型別,則成功返回所需要的指標型別,失敗返回0,如果是引用型別,如果失敗,則會丟擲bad_cast異常,需要使用try -cache模組來獲取異常,因為沒有指向空的引用。所以當需要dynamic_cast轉換時,需要檢測成功或者失敗。
(1)首先dynamic_cast能夠應用於指標轉換。
子類指標轉換成父類指標,成功;
父類指標轉換成子類指標,就分為兩種情況:
父類指標p如果真的指向子類物件,那麼轉換時成功的;反之,失敗,dynamic_cast返回null。
(2)其次dynamic_cast能夠應用與引用之間的轉換(與指標類似)。
子類引用轉換成父類引用,成功;
父類引用轉換成子類引用,就分為兩種情況:
父類引用ob,如果真的指向子類物件,那麼轉換時成功的;反之,失敗,dynamic_cast,會丟擲bad_cast異常
(3)其他將null指標轉換成任何型別的指標;將任何型別的指標轉換成void*型別的指標。
//base是基類,derived是base的派生類
//指標型別轉換
if(derived *dp = dynamic_cast(bp)) else
//引用型別轉換
//b為基類的引用
try catch(bad_cast)
關於typeid()可以得到該型別的type_info類的返回值,該type_info型別的返回值可以提供==, !=, t.name()等成員函式,可以檢查兩個變數的型別是否一致,並且列印出表明該型別的字串(name成員函式)。這裡注意,typeid()可以獲取動態型別,如果某個基類的指標指向的是其派生類的指標,則返回的是派生類的型別typeid(*b)
返回的是b指向的真正的物件的型別。
const_cast:
const_cast就是操作底層的const屬性的,既能對某個變數去除const屬性,也可以加上const屬性。
主要用作去除const屬性,主要用在函式的形參上,比如很多函式如果對傳入的形參(指指標或者引用)不修改其值,一般建議使用const來修飾,比如下面的第乙個shorter_string函式,但是這個函式返回的也是const引用,不能對其修改,這時如果我們知道傳入這個函式的變數不是const變數,這時我們就可以對該函式的返回值使用const_cast函式來去除其const屬性,讓其可以修改。這裡要注意的是,我們一定要確定原始變數不是const變數,這樣我們才能對其某些const引用去除其const屬性。如果我們對某個const變數去除其const屬性,對其進行修改的話,會產生未定義行為。
const string &shorter_string(const string &s1, const string &s2)
string &shorter_string(string &s1, string &s2)
int main()
reinterpret_cast:
reinterpret_cast和上面講到的cast,適用範圍更加廣泛。它可以適用於任何型別指標之間的轉換。
該操作不會去進行動態型別或者靜態型別的檢測,它僅僅將值強行賦值過去。從某種意義上對編譯器進行了一種欺騙,同時也帶來了一定的不安全性。所以在使用這個cast的時候,要慎重。下面是這個操作的適用情況:
(1) int和指標之間的相互轉換;
(2) 無關聯類指標之間的轉換;
(3) 函式指標之間的轉換
int *ip;
char *pc = reinterpret_cast(ip);
C 4種cast強制型別轉換
注意 盡量少使用轉型操作,尤其是dynamic cast,耗時較高,會導致效能的下降,盡量使用其他方法替代。const cast 定義 const cast轉換符是用來移除變數的const或volatile限定符 const int constant 21 const int const p con...
C 型別轉換 Cast
1 reinpreter cast 此識別符號的意思即為資料的二進位制形式重新解釋,但是不改變其值。這個操作符能夠在非相關的型別之間轉換。操作結果只是簡單的從乙個指標到別的指標的值的二進位制拷貝。在型別之間指向的內容不做任何型別的檢查和轉換。用法 reinpreter cast expression...
C 強制型別轉換
四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型別轉化最終還是被c 接受了。1.stat...