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ùngconst_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émbad_cast(tham chiếu) nếu ép thất bại. - Chi phí runtime (RTTI).
3. const_cast
- Thêm/bỏ qualifier
consthoặcvolatile. - 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_castcho chuyển đổi giá trị/con trỏ tĩnh. - Dùng
dynamic_castkhi cần kiểm tra kiểu động (polymorphism). - Hạn chế
reinterpret_castvà C-style cast. - Dùng
const_castchỉ khi buộc phải tương tác API cũ không const-correct.