c 強制型別轉換

2021-06-15 20:12:44 字數 2133 閱讀 9891

強制轉化四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。  

2004-11-27   9:00  

強制轉化無論從語法還是語意上看,都是c++中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型別轉化最終還是被c++接受了。  

1. static_cast運算符號  

static_cast(e),stroustrup讓我們可以把它看成隱含轉換的顯示的逆運算。這個是有一定道理的,基於隱式轉化的物件型別我們可以使用static_cast轉化運算符號。它是靜態的檢測,無法執行時檢測型別,在繼承中尤為突出。  

使用範圍  

<1>用於所有系統型別之間轉化,不能用於系統型別指標型別轉化  

double   t_d   =   0;  

int   t_i=   static_cast(t_d);   //是合法的轉化  

而企圖將double*->int*是不允許的  

<2>用於繼承類之間的轉化(含指標),不能用於其他沒有隱式轉化的物件型別之間的轉化  

繼承舉例:  

class   x  

;  

class   y:   public   x  

;  

使用: x   t_o_x;  

y   t_o_y   =   static_cast(t_o_x);   //x*   y*轉化也可以進行因為x,y繼承關  

//系,型別可以自動隱式轉化使用  

隱式轉化舉例:  

class   x  

;  

class   y  

};  

x   t_o_x;  

y   t_o_y   =   static_cast(t_o_x);   //大家看到y建構函式可以對於x型別隱式轉化  

//所以可以將x->y,如果企圖將y->x會報錯  

2. reinterpret_cast   運算  

主要用於對於型別指標型別的強制轉化,some_type*   ->   special_type*這樣轉化,型別資訊可以是不完全的。它允許將任意指標轉化到其他型別指標,也允許任意整數型別到任意指標型別轉化(bt)。這樣導致的結果是極其不安全的,不能安全的應用於其他目的,除非轉化到原來型別。  

<1>   使用所有整形可以轉化為任意型別的指標(指標是4位元組的long的東東,那麼機器就認為同型別就是可以轉化)  

int   c;  

x*   p   =   reinterpret_cast(c);   //x是自定義的任意型別,當然包括系統型別  

<2>   可以對於任意型別指標之間轉化  

y*   c;  

x*   p   =   reinterpret_cast(c);//x,y代表所有自定義或系統型別  

大家可以看到reinterpret_cast的轉化是極度的不負責任的,他只管轉化不檢測是否可以轉化。  

<3>   const_cast運算符號  

這個很簡單從名字大家可以看出來,僅僅為了去掉或著加上const修飾符號。但是對於本身定義時為const的型別,即使你去掉const性,在你操作這片內容時候也要小心,只能r不能w操作,否則還是會出錯。  

const   char*   p   =   "123";  

char*   c   =   const_cast(p);  

c[0]   =   1;     //表面上通過編譯去掉了const性,但是操作其位址時系統依然不允許這  

//麼做。這是乙個漏洞吧  

<4>   dynamic_cast運算符號  

scott   mayers將其描述為用來執行繼承體系中:安全的向下轉型或者跨系轉型動作。也就是說你可以,用dynamic_cast將   指向base   class的指標或引用轉型為   指向子類的物件的指標或引用。  

class   b   {};     //polymorphic型別含virtual才能dynamic_cast  

class   d:   public   b   {}  

void   f(   b*   pb   )  

C 強制型別轉換

四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型別轉化最終還是被c 接受了。1.stat...

C 強制型別轉換

標準c 中主要有四種強制轉換型別運算子 const cast,reinterpret cast,static cast,dynamic cast等等。1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 算術型別或列舉型別。表示式static cast a a的值轉換為模板中...

C 強制型別轉換

關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast,dynamic cast,reint...