標準 c++ 為了加強型別轉換的可視性,引入命名的強制轉換操作符,為程式設計師在必須使用強制轉換時提供了更好的工具。
命名的強制型別轉換符號的一般形式如下:
cast-name(expression);
其中 cast-name 為 static_cast、dynamic_cast、const_cast 和 reinterpret_cast 之一,
type 為轉換的目標型別,而 expression 則是被強制轉換的值。強制轉換的型別指定了在 expression 上執行某種特定型別的轉換。
dynamic_cast:
支援執行時識別指標或引用所指向的物件。
const_cast:
顧名思義,將轉換掉表示式的 const 性質。例如,假設有函式 string_copy,只有唯一的引數,為 char* 型別,我們對該函式唯讀不寫。在訪問該函式時,最好的選擇是修改它讓它接受 const char* 型別的引數。如果不行,可通過 const_cast 用乙個 const 值呼叫 string_copy 函式:
const char *pc_str;
char *pc = string_copy(const_cast(pc_str));
只有使用 const_cast 才能將 const 性質轉換掉。在這種情況下,試圖使用其他三種形式的強制轉換都會導致編譯時的錯誤。類似地,除了新增或刪除 const 特性,用 const_cast 符來執行其他任何型別轉換,都會引起編譯錯誤。
static_cast:
編譯器隱式執行的任何型別轉換都可以由 static_cast 顯式完成:
double d = 97.0;
// cast specified to indicate that the conversion is intentional
char ch = static_cast(d);
當需要將乙個較大的算術型別賦值給較小的型別時,使用強制轉換非常有用。此時,強制型別轉換告訴程式的讀者和編譯器:我們知道並且不關心潛在的精度損失。對於從乙個較大的算術型別到乙個較小型別的賦值,編譯器通常會產生警告。當我們顯式地提供強制型別轉換時,警告資訊就會被關閉。
如果編譯器不提供自動轉換,使用 static_cast 來執行型別轉換也是很有用的。例如,下面的程式使用 static_cast 找回存放在 void* 指標中的值:
void* p = &d; // ok: address of any data object can be stored in a
void*
// ok: converts
void*
back to the original pointer type
double *dp = static_cast(p);
可通過 static_cast 將存放在 void* 中的指標值強制轉換為原來的指標型別,此時我們應確保保持指標值。也就是說,強制轉換的結果應與原來的位址值相等。
reinterpret_cast:
通常為運算元的位模式提供較低層次的重新解釋reinterpret_cast 本質上依賴於機器。為了安全地使用 reinterpret_cast,要求程式設計師完全理解所涉及的資料型別,以及編譯器實現強制型別轉換的細節。
例如,對於下面的強制轉換:
int *ip;
char *pc = reinterpret_cast(ip);
程式設計師必須永遠記得 pc 所指向的真實物件其實是 int 型,而並非字元陣列。任何假設 pc 是普通字元指標的應用,都有可能帶來有趣的執行時錯誤。例如,下面語句用 pc 來初始化乙個 string 物件,它可能會引起執行時的怪異行為。
string str(pc);
用 pc 初始化 str 這個例子很好地說明了顯式強制轉換是多麼的危險。問題源於型別已經改變時編譯器沒有提供任何警告或錯誤提示。當我們用 int 型位址初始化 pc 時,由於顯式地宣告了這樣的轉換是正確的,因此編譯器不提供任何錯誤或警告資訊。後面對 pc 的使用都假設它存放的是 char* 型物件的位址,編譯器確實無法知道 pc 實際上是指向 int 型物件的指標。
因此用 pc 初始化 str 是完全正確的——雖然實際上是無意義的或是錯誤的。查詢這類問題的原因相當困難,特別是如果 ip 到 pc 的強制轉換和使用 pc 初始化 string 物件這兩個應用發生在不同檔案中的時候。
強烈建議:程式設計師避免使用強制型別轉換,強制型別轉換關閉或掛起了正常的型別檢查。
與舊式強制型別轉換相容
在引入命名的強制型別轉換操作符之前,顯式強制轉換用圓括號將型別括起來實現:
char *pc = (char*) ip;
效果與使用 reinterpret_cast 符號相同,但這種強制轉換的可視性比較差,難以跟蹤錯誤的轉換。
強制型別轉換操作符
操作符 中文名稱 含義 dynamic cast 動態型別轉換符 支援多型而存在,主要用於類之間的轉換 static cast 靜態型別轉換符 僅僅完成編譯時期的轉換檢查 reinterpret cast 再解釋型別轉換符 完成不同型別指標之間的相互轉換 const cast 常型別轉換符 用來修改...
怎樣過載強制型別轉換操作符
private double m data 這是乙個非常簡單的例子,不過它已經足以描述我要說明的問題。假如,我們有如下的乙個函式 print int n 當我們如下來使用mydouble的時候 mydouble dbl 234.33 print dbl 注意此處正隱式呼叫了operator int ...
C 強制型別轉換操作符 dynamic cast
原文 主題c dynamic cast是四個強制型別轉換操作符中最特殊的乙個,它支援執行時識別指標或引用。編譯器的rtti設定 dynamic cast提供rtti run time type information 也就是執行時型別識別。它對編譯器有要求,需要編譯器啟動 執行時型別資訊 這一選項。...