Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Regular cast vs static_cast vs dynamic_cast trong C++

C++ cung cấp 4 kiểu cast có tên (named casts) an toàn hơn C-style cast.

1. static_cast

  • Dùng cho chuyển đổi kiểu thông thường tại compile-time: float → int, char → int, con trỏ base ↔ derived (nếu chắc chắn an toàn), enum ↔ int.
  • Không kiểm tra runtime.
  • Không thể bỏ const (dùng const_cast).

2. dynamic_cast

  • Dùng cho polymorphism: ép con trỏ/tham chiếu base class → derived class an toàn tại runtime.
  • Yêu cầu class có ít nhất một hàm virtual (polymorphic).
  • Trả về nullptr (con trỏ) hoặc ném bad_cast (tham chiếu) nếu ép thất bại.
  • Chi phí runtime (RTTI).

3. const_cast

  • Thêm/bỏ qualifier const hoặc volatile.
  • Chỉ cast duy nhất có thể bỏ const.
  • Gây UB nếu sửa đổi object thực sự const.

4. reinterpret_cast

  • Ép kiểu cấp thấp: con trỏ ↔ integer, con trỏ hàm ↔ con trỏ hàm, reinterpret bit pattern.
  • Rất nguy hiểm, chỉ dùng khi hiểu rõ biểu diễn bộ nhớ.

5. C-style cast (Regular cast)

(Type)expr  hoặc  Type(expr)
  • Kết hợp: const_cast + static_cast + reinterpret_cast.
  • Không làm dynamic_cast → không an toàn cho polymorphism.
  • Khó tìm kiếm (grep) trong code, dễ lạm dụng.

Khuyến nghị

  • Ưu tiên static_cast cho chuyển đổi giá trị/con trỏ tĩnh.
  • Dùng dynamic_cast khi cần kiểm tra kiểu động (polymorphism).
  • Hạn chế reinterpret_cast và C-style cast.
  • Dùng const_cast chỉ khi buộc phải tương tác API cũ không const-correct.