static_cast là ép kiểu an toàn tại compile-time, trong khi C-style cast (Type)expr kém an toàn hơn.
So sánh
| Đặc điểm | static_cast | C-style cast |
|---|---|---|
| Kiểm tra compile-time | Có | Không |
| Ép con trỏ không liên quan | Báo lỗi | Cho phép (nguy hiểm) |
| Độ rõ ràng | Rõ ràng, dễ tìm kiếm | Khó nhận diện |
| Chuyển đổi const | Không thể bỏ const | Có thể bỏ const (const_cast) |
Ví dụ lỗi C-style cast
char c = 'A'; // 1 byte int* p = (int*)&c; // C-style: cho phép, nhưng nguy hiểm! // p trỏ 4 byte nhưng chỉ có 1 byte hợp lệ -> ghi đè bộ nhớ lân cận
Ví dụ static_cast chặn lỗi
char c = 'A'; int* p = static_cast<int*>(&c); // LỖI COMPILE: invalid static_cast
Khi nào dùng static_cast
- Chuyển đổi số:
float → int,char → int,int → double - Chuyển con trỏ trong hệ thống kế thừa (upcast/downcast an toàn)
- Chuyển enum sang kiểu số nguyên
Ví dụ hợp lệ
float f = 3.14f;
int i = static_cast<int>(f); // i = 3
enum Color { Red, Green };
int c = static_cast<int>(Red); // c = 0