命名的強制型別轉換操作符

2022-02-08 06:28:22 字數 2435 閱讀 7347

標準 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 也就是執行時型別識別。它對編譯器有要求,需要編譯器啟動 執行時型別資訊 這一選項。...