Một phép ép kiểu (cast) là một toán tử đặc biệt ép buộc chuyển đổi một kiểu dữ liệu thành kiểu khác. Với tư cách là một toán tử, cast là đơn ngôi (unary) và có độ ưu tiên như bất kỳ toán tử đơn ngôi nào khác.
Dạng ép kiểu chung nhất được hỗ trợ bởi hầu hết trình biên dịch C++ như sau:
(kiểu) biểu_thức
Trong đó kiểu là kiểu dữ liệu mong muốn. Có các toán tử ép kiểu khác được C++ hỗ trợ, liệt kê dưới đây:
const_cast<kiểu> (biểu_thức) Toán tử const_cast dùng để ghi đè tường minh
constvà/hoặcvolatiletrong một phép ép. Kiểu đích phải giống kiểu nguồn trừ việc thay đổi thuộc tính const hoặc volatile. Loại ép này thao tác thuộc tính const của đối tượng truyền vào, để thiết lập hoặc loại bỏ.dynamic_cast<kiểu> (biểu_thức) Toán tử dynamic_cast thực hiện ép kiểu tại runtime và kiểm tra tính hợp lệ. Nếu không thể ép, phép ép thất bại và biểu thức evaluates to null. dynamic_cast thực hiện ép trên các kiểu đa hình (polymorphic) và có thể ép con trỏ A* thành B* chỉ nếu đối tượng được trỏ thực sự là đối tượng B.
reinterpret_cast<kiểu> (biểu_thức) Toán tử reinterpret_cast thay đổi một con trỏ thành bất kỳ kiểu con trỏ nào khác. Nó cũng cho phép ép từ con trỏ sang kiểu nguyên và ngược lại.
static_cast<kiểu> (biểu_thức) Toán tử static_cast thực hiện ép kiểu không đa hình. Ví dụ, nó có thể dùng để ép con trỏ lớp cơ sở thành con trỏ lớp dẫn xuất.
Tất cả các toán tử ép kiểu trên sẽ được dùng khi làm việc với lớp và đối tượng. Hãy thử ví dụ sau để hiểu toán tử ép kiểu đơn giản trong C++. Copy và dán chương trình C++ sau vào file test.cpp và biên dịch chạy.
Mã ví dụ
#include <iostream>
using namespace std;
int main() {
double a = 21.09399;
float b = 10.20;
int c;
c = (int) a;
cout << "Dòng 1 - Giá trị của (int)a là: " << c << endl;
c = (int) b;
cout << "Dòng 2 - Giá trị của (int)b là: " << c << endl;
return 0;
}
Kết quả đầu ra
Dòng 1 - Giá trị của (int)a là: 21 Dòng 2 - Giá trị của (int)b là: 10