型別轉換運算子

2021-04-28 14:29:04 字數 1115 閱讀 3054

在程式設計過程中,我們經常需要把一種型別轉換為另外一種型別。在轉換過程中,我們需要關心兩件事情:1。這種型別轉換是否合法?2。轉換得規則如何?

c++預設自動支援幾種型別轉換:基礎型別之間的轉換;派生類指標向基類指標的轉換;非常量型別向常量型別的轉換等等。對於其他型別間的轉換,則沒 有規定。舉例來說,cstring是一種字串型別,它和lpctstr是否可以轉換?轉換的規則是怎樣的?這在設計cstring這個類時必須考慮的。

對於自定義型別(包括所有非語言支援的庫,如mfc),我們可以通過型別轉換運算子來告訴編譯器該型別可以轉換為哪種型別,轉換的規則是怎樣的。以cstring為例,它到lpctstr的轉換被定義為:

//下面**摘錄自vc6的afx.inl檔案

_afx_inline cstring::

operator

lpctstr() 

const

...

乙個型別轉換運算子指明了當前型別可以轉換為哪種目標型別,該函式的實現則指明該如何進行這種轉換。當我們在乙個需要lpctstr型別的上下文中 使用cstring物件時,編譯器就知道實際上我們需要呼叫函式cstring::operator lpctstr來轉換cstring到lpctstr。

這種函式定義有幾個特別需要注意的地方:

1. 它沒有返回值,因為這種函式永遠返回要轉換到的型別,因此沒有必要提供返回值型別。因此operator lpctstr應該永遠返回乙個lpctstr的型別,或者是可以隱式轉換為lpctstr的型別。

2. 它沒有引數列表

沒有看過標準文件,但是這樣運算子提供引數列表貌似不太合理。

3. 它的函式原型為 operator ,如果你要轉換成其他型別,則把該型別填在位置。

我們在程式設計中如果看到一種型別被用到本該用另外一種型別的地方,第乙個就是要檢視看是否有該運算子的存在。常見的mfc程式設計中遇到的運算子過載包括

cwnd::operator hwnd: 把cwnd物件轉換為m_hwnd,等價於呼叫cwnd::getsafehwnd

crect::operator lprect:把crect物件轉換為lprect, 經常看到getclientrect呼叫就使用這個運算子

cgdiobject::operator hgdiobj 返回gdi物件對應的控制代碼

型別轉換運算子

在程式設計過程中,我們經常需要把一種型別轉換為另外一種型別。在轉換過程中,我們需要關心兩件事情 1。這種型別轉換是否合法?2。轉換得規則如何?c 預設自動支援幾種型別轉換 基礎型別之間的轉換 派生類指標向基類指標的轉換 非常量型別向常量型別的轉換等等。對於其他型別間的轉換,則沒有規定。舉例來說,cs...

型別轉換運算子

c 中4個型別轉換運算子 可以根據目的選擇乙個適合的運算子,而不是使用通用的型別轉換。用於將派生類指標轉換為基類指標,其主要用途是確保可以安全地呼叫虛函式。假設high和low是兩個類,而ph和pl的型別分別為high 和low 則僅當low是high的可訪問基類 直接或間接 時,下面的語句才將乙個...

強制轉換運算子和型別強制轉換運算子

char b a cout int b endl 在 c 中,型別的名字 包括類的名字 本身也是一種運算子,即型別強制轉換運算子。型別強制轉換運算子是單目運算子,也可以被過載,但只能過載為成員函式,不能過載為全域性函式。經過適當過載後,型別名 物件這個對物件進行強制型別轉換的表示式就等價於物件.op...