static_cast dùng cho các chuyển đổi kiểu thông thường, được kiểm tra tại compile-time. Thay thế C-style cast an toàn hơn.
Các trường hợp dùng phổ biến
- Số học:
float → int,int → double,char → int - Con trỏ kế thừa: Upcast (Derived* → Base*), Downcast (Base* → Derived* - khi chắc chắn)
- Enum:
enum → int - void*:
void* → T*
Ví dụ cơ bản
#include <iostream>
using namespace std;
int main() {
double d = 3.14159;
int i = static_cast<int>(d); // 3 (cắt phần thập phân)
char c = 'A';
int code = static_cast<int>(c); // 65 (ASCII)
cout << i << ' ' << code << '\n';
return 0;
}
Ví dụ con trỏ kế thừa
class Base { virtual ~Base() {} };
class Derived : public Base {};
class Unrelated {};
int main() {
Derived* d = new Derived;
Base* b = static_cast<Base*>(d); // OK: upcast an toàn
// Derived* d2 = static_cast<Derived*>(b); // OK nếu b thực sự trỏ Derived
Unrelated* u = static_cast<Unrelated*>(d); // LỖI COMPILE: không liên quan
delete d;
}
static_cast KHÔNG làm được
- Bỏ
const/volatile→ dùngconst_cast - Ép kiểu giữa các kiểu không liên quan (reinterpret) → dùng
reinterpret_cast - Ép kiểu đa hình tại runtime (cần kiểm tra) → dùng
dynamic_cast
Tóm tắt 4 cast C++
| Cast | Mục đích |
|---|---|
| static_cast | Chuyển đổi liên quan, compile-time |
| dynamic_cast | Ép kiểu đa hình, runtime check |
| const_cast | Thêm/bỏ const/volatile |
| reinterpret_cast | Ép kiểu cấp thấp, bit pattern |