推薦閱讀:《
在c++中通過模板規避潛在錯誤
》
c++與c語言相比是乙個強型別語言,即對資料型別的匹配程度較c更為嚴格,這有助於避免程式設計師在程式設計過程中由於粗心所犯之錯。由於歷史原因,c++中仍保留了reinterpret_ cast、static_cast等用於強制型別轉換的關鍵字,但從語言向強型別發展的趨勢來看,我們在程式設計工作中應盡量少使用強制型別轉換,模板有助於我們實現這一目的。減少使用強制型別轉換的另乙個好處,是程式的可維護性更強。
下面讓我們通過例子來了解如何通過模板減少程式中的強制轉換。圖1以簡化的形式示例了雙向鍊錶(double-linked list, dll)的部分實現內容,以及使用雙向鍊錶的**片段。
class dll_t;class dll_node_t
void *data ()
private:
dll_node_t *prev_;
dll_node_t *next_;
void *p_data_;
}; class channel_t
private:
dll_node_t node_;
};
圖1
其中,dll_node_t是雙向鍊錶節點的類封裝。它除了prev_和next_兩個用於儲存前乙個和後乙個節點指標的成員變數外,還有乙個用於儲存節點資料的p_data_。由於節點所儲存資料的具體含義完全取決於鍊錶的使用者,因此p_data_型別被定義為void*,以便容納任何型別的資料。位於第10和11行的data()函式用於分別設定和獲取p_data_變數的值。
圖中第19至29行的**示例了channel_t類使用dll_node_t類的片段。在channel_t類的建構函式中,呼叫data()函式時需要通過強制型別轉換的方式將this指標儲存到節點的p_data_變數中。不難想象,當通過data()函式獲取p_data_中的值時,也得通過強制轉換的方式使其變成型別為channel_t的指標(這部分**在圖中並未列出)。
圖2是使用模板改寫後的版本。相信讀者能輕易地辨別出其中已不存在強制型別轉換的身影。
templateclass dll_t;
template
class dll_node_t
t_data *data ()
private:
dll_node_t *prev_;
dll_node_t *next_;
t_data *p_data_;
}; class channel_t
private:
dll_node_t node_;
};
圖2
C 中型別強制轉換
c 中有4種強制轉換 const cast,static cast,dynamic cast,reinterpret cast,以下將分別介紹 1.const cast 形式const cast expression 用來修改型別的const或volatile屬性,除了const或volatile修...
c 中的強制轉換
在c 中新添了四個關鍵字static cast,const cast,reinterpret cast和dynamic cast.這四個關鍵字都是用於強制型別轉換的。現在逐一介紹著四個關鍵字。在c 語言中static cast用於資料型別的強制轉換,強制將一種資料型別轉換為另一種資料型別,例如將資料...
JS在if中的強制型別轉換
1.使用非嚴格相等進行比較,對 左邊的值進行型別轉換 2.在if判斷時,括號內的值進行型別轉換,轉化為布林值 今天,我就來聊一聊js在if中的強制型別轉換。其實,如果詳細要討論哪些值在if中強制轉換為true,哪些值在if中強制轉換為false,這很困難,因為,情況太多了。但是,我們可以輕鬆記住強制...