強制型別轉換操作符

2021-05-21 14:05:17 字數 2044 閱讀 2409

操作符

中文名稱

含義

dynamic_cast

動態型別轉換符

支援多型而存在, 主要用於類之間的轉換

static_cast

靜態型別轉換符

僅僅完成編譯時期的轉換檢查

reinterpret_cast

再解釋型別轉換符

完成不同型別指標之間的相互轉換

const_cast

常型別轉換符

用來修改型別的 const 或 volatile 屬性

1. 動態型別轉換符 dynamic_cast

dynamic_cast 為支援多型而存在, 它主要用於類之間的轉換, 包括向下轉換(downcast)和向上轉換(upcast). 向下轉換即將乙個指向基類的指標或引用轉換成乙個指向派生類的指標或引用. 如:

void cmymenu::updatemenu(cmenu* pmenu)

當使用 dynamic_cast 嘗試進行指標的非法轉換時, 指標的值會被賦成 0 . 當這個非法轉換是針對引用而進行時, c++ 會丟擲乙個 bad_cast 異常來通知這個錯誤.

2. 靜態型別轉換符 static_cast

靜態型別轉換僅僅完成編譯時期的轉換檢查. 一般用於如下場合:

(1) 用於類層次結構中基類和子類之間指標或引用的轉換. 進行向上轉換(把子類的指標或引用轉換成基類表示)是安全的(向上轉換一般都是隱式轉換, 這時候實際上根本沒必要使用靜態型別轉換); 進行向下轉換(把基類指標或引用轉換成子類表示)時, 由於沒有動態型別檢查, 所以是不安全的.

(2) 完成任何型別的指標與 void* 之間的轉換.

(3) 將空指標(0)轉換成目標指標型別.

(4) 用於基本資料型別之間的轉換, 如把 int 轉換成 char , 把 int 轉換成 enum . 這種轉換的安全性要由程式設計師來保證.

3. 再解釋型別轉換符 reinterpret_cast

再解釋型別轉換完成的都是一些不可思議的型別轉換. 實際上, 所有指標的值都是乙個表示位址的數值, 值本身的轉換沒有任何問題. 所謂"再解釋", 是指對指標的型別(如: int* 和 double*)進行重新解釋.

再解釋型別轉換 reinterpret_cast 完成不同型別指標之間的相互轉換, 同時也支援將指標與數字之間的轉換. 如:

void cmylist::oncustomdraw(nmhdr* pnmhdr, lresult* presult)

該段**在 mfc 原始碼中比較常見, 它將 nmhdr 指標重新解釋成 nmlvcustomdraw 指標.

4. 常型別轉換符 const_cast

常型別轉換 const_cast 用來修改型別的 const 或 volatile 屬性. 除了 const 或 volatile 修飾之外, 其操作物件的型別和目標型別必須是一樣的.

5. 向上轉換與向下轉換

向上轉換(upcast, 派生類轉換成基類)總是隱含地進行, 派生類總是能夠轉換成基類的引用型別. 如:

cdialog dlg;

cbutton btn;

cwnd& wnd1 = dlg;

cwnd& wnd2 = btn;

有時候, 可能已經知道當前指標所指向的物件到底是什麼型別, 那麼可以使用強制轉換完成向下轉換(downcast):

cdialog& dlg2 = (cdialog&)wnd1;

cbutton& btn2 = (cbutton&)wnd2;

向下轉換必須是以顯示的方式向編譯器提出, 當然, 向下轉換具有一定的風險, 如果給定的基類指標並非指向乙個派生類物件, 那麼, 將它強制進行向下轉換, 其結果是不可預料的. 如:

cdialog& dlg2 = (cdialog&)wnd2;

dlg2.domodal();

這樣的**肯定會報錯. 因為 wnd2 其實是乙個按鈕物件.

【摘自】白喬, 左飛 《把脈vc++》p162~163.

怎樣過載強制型別轉換操作符

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

C 強制型別轉換操作符 dynamic cast

dynamic cast是四個強制型別轉換操作符中最特殊的乙個,它支援執行時識別指標或引用。編譯器的rtti設定 dynamic cast提供rtti run time type information 也就是執行時型別識別。它對編譯器有要求,需要編譯器啟動 執行時型別資訊 這一選項。當編譯器不開啟...