4 11 3 C 中的顯式類轉換

2022-09-18 17:15:08 字數 1288 閱讀 6260

目錄const_cast

reinterpret_cast

舊式型別轉換

顯示地告訴程式閱讀者和編譯器,不考慮高精度想低精度轉換時造成的精度損失

#includeusing namespace std;

int main()

注:1.const_cast可以去除底層const,但不代表轉換後的指標可以改變其指向的值,如果*p是乙個const物件,依然不能用p改變其值。

2.const_cast只能去除const,不能改變物件的原型別,const_cast(pc);是不行的,改用static_const(pc);

const_cast在函式過載時運用廣泛

為運算物件的位模式提供較低層次的重新解釋,但並不真正改變物件型別

#includeusing namespace std;

int main(){

int *ip;

char *pc = reinterpret_cast(ip); //pc所指的真實物件實際上是int型別而不是字元

string s(pc); //用int*來初始化string顯然會出現問題,但由於有顯示型別轉換,所以編譯器不會報錯

cout《使用reinterpret_cast是非常危險的,用pc初始化str的例子很好地證明了這一點。其中的關鍵問題是型別改變了,但編譯器沒有給出任何警告或者錯誤的提示資訊。當我們用乙個int的位址初始化pc時,由於顯式地聲稱這種轉換合法,所以編譯器不會發出任何警告或錯誤資訊。接下來再使用pc時就會認定它的值是char*型別,編譯器沒法知道它實際存放的是指向int的指標。最終的結果就是,在上面的例子中雖然用pc初始化 str 沒什麼實際意義,甚至還可能引發更糟糕的後果,但僅從語法上而言這種操作無可指摘。查詢這類問題的原因非常困難,如果將ip 強制轉換成pc的語句和用pc初始化 string物件的語句分屬不同檔案就更是如此。

所以在程式設計時經歷避免強制型別轉換

(type)expr:c語言風格的函式型別轉換,其含義並不清晰,根據語境會分別具有static\_castconst\_castreinterpret\_cast的功能。

int *ip;

char *pc = (char*)ip; //作用同reinterpret_cast

所以追蹤錯誤時會更加困難,不建議使用。

C 中的顯式轉換

顯式轉換也成為強制轉換 cast 有如下幾種型別 static cast,dynamic cast,const cast,reinterpret cast。1.const cast 將轉換掉表示式的const性質。const char pc str char pc string copy const...

C 顯式轉換

標準c 包含乙個顯式的轉換語法 static cast 用於 良性 和 適度良性 的轉換,包括不用強制轉換 const cast 用於 const 和 或 volatile 進行轉換 reinterpret cast 轉換為完全不同的意思。為了安全的使用它,關鍵必須轉換回原來的型別。轉換成的型別一般...

C 顯式轉換

任何具有明確定義的型別轉換,只要不包含底層const,都可以使用static cast c primer 更為簡單的解釋就是,使用這個型別轉換符,能夠進行比較自然的轉換,類別相近的轉換,而有一些型別差距明顯的轉換則不可以,例如 不能用於不同型別的指標之間轉換 void 除外 不能用於整型與指標之間的...