C 中的型別轉換

2021-04-22 20:12:48 字數 1288 閱讀 3255

和goto語句一樣型別轉換的名聲似乎也是不那麼好。

不過型別轉換在某些緊要關頭就顯得尤為重要,看看現有的c/c++**就知道,以至於你不理解轉換的作用,**將是無法閱讀的。

就像鈾,它能變成原子彈,但它也能用來發電,是災難還是福祉那就要看人類了。

顯然型別轉換默默承受著這不公的一切。

不管怎麼說c風格的型別轉換還是不盡人意的:

1.它們很粗糙,你可以通過它們在任意型別之間進行轉換,沒有明確指定每個轉換的目的。

2.c風格的型別轉換很難進行查詢。它們是由一對括號加上乙個型別標識組成的,而括號和型別標識在c++裡到處都是。

c++通過引進4種型別的型別轉換操作符克服了c風格的型別轉換的缺點。

static_cast

const_cast

dynamic_cast

reinterpret_cast

關於這些操作符應該知道的是,你習慣的寫法:

(type) expression

現在都應該寫成

static_cast(expression)

它與c風格的型別轉換有同樣的限制,例如不能把結構(struct)轉換成int,不能把double轉換成指標。

const_cast是用來去掉乙個表示式的const屬性或者volatile屬性(至於volatile在c++中的含義可以google一下便知道)

dynamic_cast用來對乙個繼承體系做向下或者橫向的安全轉換,也就是把基類的指標(引用)轉換成派生類或者基類的兄弟類指標(引用),很重要的一點可以知道轉換是否成功。空指標,異常(引用)意味著轉換失敗。

dynamic_cast僅限於用來操縱繼承體系。而最後一種

reinterpret_cast最常見的用法就是用來在函式指標之間進行型別轉換。

typedef void (*funcptr)();

funcptr funcptrarray[10];

int dosomething();

funcptrarray[0] = &dosomething;//錯誤,型別不匹配

funcptrarray[0] = reinterpret_cast(&dosomething);

把上面這個函式的指標放入funcptrarray中,如果不進行型別轉換就不可能辦到。

c++新的型別轉換既難看又難輸入(這個很大程度上是設計者故意的,因為可以迫使使用者盡量不進行型別轉換),但是c風格的型別轉換仍然可用。正因為新的型別轉換缺少美感,使得它有著確切的含義並且容易識別。

<>的作者scott meyers強烈建議使用新的型別轉換運算子,這些c++大師的建議應該是值得採納的。

C 中的型別轉換

1.隱式轉換 1 賦值轉換 將右值轉換為左型別,然後再賦值。2 整型提公升 c 將bool char,unsigned char,singned char,short轉換為int,int計算最快 表示式中的優先順序轉換 long double double float unsigned long 對...

C 中的型別轉換

我們知道 變數的型別定義了物件能包含的資料和參與的運算。其中一種運算被大多數型別支援,就是將變數從某一種給定的型別轉化為另外的型別。在了解型別轉換種類之前,首先牢記 型別轉換只是暫時的,原來的變數型別並不改變。在c語言中,分為兩種型別轉換 1,隱式型別轉換 2,顯示型別轉換 例如 double d ...

C 中的型別轉換

c 中有四種型別轉換,const cast static cast,reinterpret cast,dynamic cast c風格的型別轉換即強制轉換最簡單粗暴,管你是什麼型別,直接擴號擴起來了事,缺點就是 表達不夠清晰,容易造成隱患 float count 2.0f int totalcoun...