C C 之型別強制轉化

2022-07-17 04:54:11 字數 1894 閱讀 3026

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

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 )

反正大家在使用知道怎麼用就ok了,c++強制轉化在模板中還是非常有用的,其他時候本人也喜歡用c的轉化方便。^_^     

c c 中數的強制型別轉化!!!!!!

在vc6中執行如下 include int main 為什麼輸出的結果會是 b fffffff7,d 67如果將c改為 c 0xffffff87,則結果為 b fffffff7,d ffffff87 解釋你這個問題首先要明白幾個概念 1.printf的 x引數的含義 unsigned int 無符號...

C 強制型別轉化

1 static cast 任何只要具有明確定義的型別轉換,只要不包含底層const就可以使用 static cast 當需要把乙個較大的算數型別賦值給乙個較小的算數型別,static cast非常有用。此時,強制型別轉換告訴程式的讀者和編譯器 我們不在乎潛在的精度損失。一般來說,如果編譯器發現乙個...

C C 之型別轉換

目錄三 dynamic cast 四 const cast 五 reinterpret cast 六 總結 在c語言中,我們經常會對資料進行型別轉換,但都是強制性的型別裝換,自然就會引發訪問不安全的問題,可能不經意間將指向const物件的指標轉換成非const物件的指標,可能將基類物件指標轉成了派生...