Chuyển đổi kiểu (Type conversion)
- Implicit Type Conversion (Chuyển đổi kiểu ngầm định)
- Trình biên dịch tự động chuyển đổi một kiểu dữ liệu này sang kiểu dữ liệu khác mà không cần lập trình viên can thiệp.
- Ví dụ:
int a = 10;
double b = a; // Chuyển đổi từ int sang double.
- Explicit Type Conversion (Chuyển đổi kiểu tường minh)
- Lập trình viên chủ động chỉ định việc chuyển đổi kiểu dữ liệu bằng cách sử dụng cú pháp ép kiểu (cast).
- Ví dụ:
double a = 3.14;
int b = (int)a; // Chuyển đổi từ double sang int.
- Narrowing Conversion
- Chuyển đổi giá trị từ một kiểu lớn hơn sang một kiểu nhỏ hơn hoặc ít chính xác hơn, có thể dẫn đến mất mát dữ liệu.
- Ví dụ:
double d = 3.14159;
int i = d; // Mất phần thập phân, kết quả: i = 3.
- Widening Conversion
- Chuyển đổi giá trị từ một kiểu nhỏ hơn sang một kiểu lớn hơn hoặc chính xác hơn. Quá trình này thường không làm mất dữ liệu.
- Ví dụ:
int i = 42;
double d = i; // Tăng độ chính xác, kết quả: d = 42.0.
- Static Cast
- Chuyển đổi kiểu tường minh được thực hiện tại thời gian biên dịch, sử dụng từ khóa
static_cast
. - Ví dụ:
double d = 5.5;
int i = static_cast<int>(d); // Chuyển đổi từ double sang int.
- Chuyển đổi kiểu tường minh được thực hiện tại thời gian biên dịch, sử dụng từ khóa
- Dynamic Cast
- Dùng để chuyển đổi kiểu đối tượng trong quan hệ kế thừa, kiểm tra kiểu dữ liệu tại thời gian chạy (run-time).
- Ví dụ:
Base* base = new Derived();
Derived* derived = dynamic_cast<Derived*>(base);
- Const Cast
- Loại bỏ hoặc thêm thuộc tính
const
vào một đối tượng. - Ví dụ:
const int a = 10;
int* b = const_cast<int*>(&a);
- Loại bỏ hoặc thêm thuộc tính
- Reinterpret Cast
- Chuyển đổi kiểu không thực hiện bất kỳ thay đổi nào trên dữ liệu, mà chỉ coi dữ liệu như một kiểu khác.
- Ví dụ:
int a = 65;
char* c = reinterpret_cast<char*>(&a); // Chuyển đổi địa chỉ kiểu int sang char*.
- C-style Cast
- Chuyển đổi kiểu sử dụng cú pháp ép kiểu truyền thống của C.
- Ví dụ:
float f = 3.14;
int i = (int)f; // Chuyển đổi từ float sang int.
- Function-style Cast
- Cách chuyển đổi kiểu giống như gọi một hàm khởi tạo (constructor).
- Ví dụ:
double d = 5.5;
int i = int(d); // Chuyển đổi từ double sang int.
- Upcasting
- Chuyển đổi từ một kiểu con sang kiểu cha trong kế thừa, thường an toàn.
- Ví dụ:
class Base {};
class Derived : public Base {};
Derived d;
Base* b = &d; // Upcasting.
- Downcasting
- Chuyển đổi từ kiểu cha sang kiểu con trong kế thừa, thường cần kiểm tra kiểu tại run-time.
- Ví dụ:
Base* base = new Derived();
Derived* derived = dynamic_cast<Derived*>(base); // Downcasting.
- Integral Promotion
- Tự động chuyển đổi từ kiểu số nguyên có kích thước nhỏ hơn (
char
,short
) sangint
hoặc kiểu lớn hơn để thực hiện các phép toán. - Ví dụ:
char c = 'A';
int i = c + 1; // Chuyển từ char sang int.
- Tự động chuyển đổi từ kiểu số nguyên có kích thước nhỏ hơn (
- Floating-point Promotion
- Chuyển đổi từ kiểu số thực có kích thước nhỏ (
float
) sang kiểu lớn hơn (double
) để thực hiện các phép toán. - Ví dụ:
float f = 3.14f;
double d = f; // Chuyển từ float sang double.
- Chuyển đổi từ kiểu số thực có kích thước nhỏ (
- Type Punning
- Hiện tượng tái sử dụng bộ nhớ của một đối tượng để biểu diễn một kiểu dữ liệu khác.
- Ví dụ:
union {
int i;
float f;
} u;
u.i = 42;
- User-defined Conversion
- Chuyển đổi kiểu do lập trình viên định nghĩa thông qua hàm chuyển đổi (conversion function) trong class.
- Ví dụ:
class MyClass {
public:
operator int() { return 42; } // Hàm chuyển đổi từ MyClass sang int.
};
MyClass obj;
int i = obj; // Chuyển đổi sang int.