Ép kiểu (Type Conversion)
Vì C++ là ngôn ngữ kiểu tĩnh, việc chuyển đổi giữa các kiểu dữ liệu (ép kiểu) diễn ra thường xuyên và tuân theo những quy tắc rõ ràng.
1. Chuyển đổi ngầm định (Implicit Conversion)
Phần tiêu đề “1. Chuyển đổi ngầm định (Implicit Conversion)”Trình biên dịch tự động chuyển kiểu khi cần, ví dụ khi gán int cho double:
int a = 5;double b = a; // int tự động chuyển thành double: 5.0std::cout << b << std::endl; // 5
double x = 3.9;int y = x; // double chuyển thành int: PHẦN THẬP PHÂN BỊ CẮT (không làm tròn!)std::cout << y << std::endl; // 32. Ép kiểu tường minh (Explicit Conversion)
Phần tiêu đề “2. Ép kiểu tường minh (Explicit Conversion)”Cách cũ (kiểu C) - nên tránh
Phần tiêu đề “Cách cũ (kiểu C) - nên tránh”double pi = 3.14159;int truncated = (int)pi; // 3Cách hiện đại: static_cast
Phần tiêu đề “Cách hiện đại: static_cast”C++ khuyến khích dùng static_cast<KieuDich>(gia_tri) vì rõ ràng, an toàn và dễ tìm kiếm trong code hơn:
#include <iostream>
int main() { double pi = 3.14159; int truncated = static_cast<int>(pi); std::cout << truncated << std::endl; // 3
int a = 7, b = 2; double result = static_cast<double>(a) / b; // Ép a thành double trước khi chia std::cout << result << std::endl; // 3.5
return 0;}3. Các loại cast khác (nâng cao)
Phần tiêu đề “3. Các loại cast khác (nâng cao)”| Cast | Dùng khi nào |
|---|---|
static_cast |
Chuyển đổi kiểu thông thường, an toàn (dùng phổ biến nhất) |
const_cast |
Loại bỏ tính chất const của một biến (hiếm dùng, dễ gây lỗi) |
dynamic_cast |
Chuyển đổi con trỏ/tham chiếu giữa các lớp có quan hệ kế thừa (OOP) |
reinterpret_cast |
Ép kiểu ở mức bit thấp, rất nguy hiểm nếu dùng sai |
Ở giai đoạn học cơ bản, bạn chủ yếu chỉ cần static_cast.
4. Chuyển đổi giữa số và chuỗi
Phần tiêu đề “4. Chuyển đổi giữa số và chuỗi”Thư viện <string> cung cấp các hàm để chuyển đổi qua lại giữa số và chuỗi:
#include <iostream>#include <string>
int main() { // Số → chuỗi int number = 42; std::string text = std::to_string(number); // "42"
// Chuỗi → số std::string str_number = "123"; int parsed = std::stoi(str_number); // string to int double parsed_d = std::stod("3.14"); // string to double
std::cout << text << " " << parsed << " " << parsed_d << std::endl;
return 0;}std::stoi/std::stod sẽ ném ra ngoại lệ (std::invalid_argument) nếu chuỗi không thể chuyển thành số - chi tiết về xử lý ngoại lệ ở bài sau.
Tổng kết
Phần tiêu đề “Tổng kết”- Chuyển đổi ngầm định xảy ra tự động (ví dụ
int→double), nhưngdouble→intsẽ cắt bỏ phần thập phân, không làm tròn - Nên dùng
static_cast<KieuDich>(gia_tri)thay vì cách ép kiểu kiểu C(KieuDich)gia_tri - Dùng
std::to_string()để chuyển số thành chuỗi,std::stoi()/std::stod()để chuyển chuỗi thành số