Có hai lý do mà mình biết tại sao nên sử dụng static_cast
trong C++ hơn là ép kiểu truyền thống trong C.
static_cast
tự động kiểm tra xem kiểu dữ liệu có tương thích hay không, trong khi C vẫn cho phép ép kiểu mặc dù hai kiểu dữ liệu không tương thích.
Chuyện gì xảy ra nếu hai kiểu dữ liệu không tương thích:
static_cast
sẽ thông báo lỗi ngay khi bạn đang lập trình, điều này cho phép bạn sửa lại mã nguồn trước khi chạy chương trình.
- Ép kiểu trong C mặc dù không thông báo lỗi khi bạn đang lập trình, nhưng sẽ quăng lỗi ngay khi bạn chạy chương trình, cụ thể là lỗi
Stack was corrupted
.
Ví dụ ép kiểu trong C:
char str = 'a';
int *pointer = (int *)&str; // Ép kiểu trong C
*pointer = 10; // Lỗi runtime: Stack was corrupted
Ví dụ sử dụng static_cast
trong C++:
char str = 'a';
int *pointer = static_cast<int *>(&str); // Lỗi compiletime: invalid type conversion
*pointer = 10;
Tại sao lại xảy ra hai lỗi trên? Bởi vì kiểu dữ liệu int
(4 bytes) và char
(1 bytes) không tương thích, khi bạn dùng con trỏ pointer
trỏ tới địa chỉ của str
, tức là con trỏ đang nắm giữ vùng nhớ của str
, mà vùng nhớ của str
chỉ có 1 bytes, cho nên khi bạn gán pointer
bằng một giá trị số nguyên 4 bytes (cụ thể ở ví dụ trên là 10), nó không đủ vùng nhớ để lưu trữ số nguyên này, dẫn đến lỗi.
Theo cách xử lý lỗi mình đã giải thích ở trên, thì static_cast
được xem là an toàn hơn.
Đối với các chương trình lớn, phức tạp, việc khai báo từ khóa một cách rõ ràng như ..._cast
khi ép kiểu trong C++ giúp bạn dễ quản lý và tìm chúng trong mã nguồn của bạn hơn là ép kiểu truyền thống trong C.