Trong C++ có 2 loại chuyển đổi kiểu chính: ngầm định (implicit) và tường minh (explicit).
1. Chuyển đổi ngầm định (Implicit Type Conversion)
Còn gọi là chuyển đổi tự động. Trình biên dịch thực hiện khi biểu thức có nhiều kiểu dữ liệu. Các kiểu được nâng cấp theo thứ tự:
bool → char → short int → int → unsigned int → long → unsigned long → long long → float → double → long double
Ví dụ:
#include <iostream>
using namespace std;
int main() {
int a = 10;
char b = 'a'; // ASCII 97
a = b + a; // char → int, a = 107
float c = a + 1.0; // int → float, c = 108.0
cout << "a: " << a << "\nb: " << b << "\nc: " << c;
}
Kết quả: a: 107, b: a, c: 108
Rủi ro: Mất dấu (sign), mất độ chính xác (precision), tràn số (overflow).
2. Chuyển đổi tường minh (Explicit Type Conversion / Type Casting)
Người lập trình chủ động ép kiểu. 2 cách trong C++:
- C-style cast:
(kiểu_mới)biểu_thức - C++ cast:
static_cast<kiểu_mới>(biểu_thức),dynamic_cast,const_cast,reinterpret_cast
Ví dụ:
#include <iostream>
using namespace std;
int main() {
double x = 1.574;
int add = (int)x + 1; // C-style: 1 + 1 = 2
cout << "Add: " << add;
float y = 3.5;
int val = static_cast<int>(y); // C++ style: 3
cout << "\nValue: " << val;
}
Kết quả: Add: 2, Value: 3
Các loại C++ Cast
| Cast | Mục đích |
|---|---|
| static_cast | Chuyển đổi kiểu liên quan (numeric, con trỏ related), compile-time |
| dynamic_cast | Ép kiểu đa hình (polymorphic), runtime check, cần RTTI |
| const_cast | Thêm/bỏ const/volatile |
| reinterpret_cast | Ép kiểu cấp thấp, reinterpret bit pattern (dangerous) |