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

Effective C++ 條款2:優先使用 C++ 風格轉型操作符(上)

     編輯:C++ 入門

舊式轉型的弊端

C 風格轉型 (T)expr 幾乎允許任意類型互轉,且語法難以識別(括號+標識符在 C++ 中無處不在),導致:

  1. 意圖模糊:去除 const 與改變對象類型語法相同,編譯器無法診斷誤用。
  2. 難以搜尋:grep 等工具難以區分轉型與普通函數調用/構造。

新式轉型的優勢

  • 易於識別:static_cast(expr) 等形式在代碼中極其醒目。
  • 職責單一:每個操作符針對特定場景,編譯器能捕獲濫用(如用 static_cast 去除 const 會報錯)。

static_cast — 基礎替代品

擁有與舊式轉型相同的威力/限制:數值轉換、指針上行/下行(非多態)、void* 轉具體指針。不能 去除 const。

// C 風格
double res = ((double)first) / second;
// C++ 風格
double res = static_cast(first) / second;

const_cast — 專門去除常量性

唯一合法去除 const/volatile 的操作。編譯器強制檢查:若嘗試改變除常量性外的類型(如基類指針轉派生類),將報錯。


const SpecialWidget& csw = sw;
update(const_cast(&csw)); // 合法:僅去除 const
update(const_cast(pw));   // 錯誤:試圖做向下轉型

dynamic_cast — 安全的運行時多態轉換

用於「指向基類的指針/引用」→「指向派生類的指針/引用」。失敗時:指針返回 nullptr,引用拋出 std::bad_cast。需基類為多態類型(含虛函數)。


Widget* pw = new SpecialWidget;
SpecialWidget* psw = dynamic_cast(pw);
if (psw) psw->specialFunc(); // 安全

總結

盡可能避免轉型;必須轉型時,使用新式操作符並將其封裝在函數內部,隱藏實現細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved