首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

More Effective C++:C++ 四大類型轉換操作符詳解

     編輯:關於C++

C 風格轉換的缺陷

  • 過於粗暴:const 去除、層次轉換、重新解釋位模式混不吝啃。
  • 難以識別:語法 (Type)expr 與普通括號表達式混淆,工具難掃描。

C++ 四大轉換操作符

操作符用途限制
static_cast<T>(expr)替代大多數 C 風格轉換(數值轉換、指針上下行、隱式轉換顯式化)不可去除 const/volatile;不可轉換不相關類型(如 struct* → int)
const_cast<T>(expr)專門去除/添加 const 或 volatile僅允許修改 cv 資格,其他轉換編譯錯誤
dynamic_cast<T>(expr)多態層次中安全向下/橫向轉換(指針返回 nullptr,引用拋 bad_cast)要求類有虛函數(多態);不可去除 const;不可用於無繼承關係類型
reinterpret_cast<T>(expr)底層位模式重新解釋(指針↔整數、函數指針互轉)結果實現定義,極難移植;僅在極端情況使用

示例

// static_cast
double d = static_cast<double>(i) / j;
// const_cast
update(const_cast<SpecialWidget*>(&csw)); // 去除 const
// dynamic_cast
update(dynamic_cast<SpecialWidget*>(pw)); // 安全向下轉換
// reinterpret_cast
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); // 函數指針轉換

舊編譯器兼容宏

#define static_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define const_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define reinterpret_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define dynamic_cast(TYPE,EXPR) ((TYPE)(EXPR)) // 無法模擬運行期檢查

為何堅持用新式轉換

  1. 含義精確:編譯器強制語義檢查(如 const_cast 禁止層次轉換)。
  2. 易識別:xxx_cast<> 關鍵字顯眼,人工/工具掃描容易。
  3. 醜陋是優點:提醒程序員「這裡在做危險操作,請三思」。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved