Bỏ qua để đến nội dung

É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.0
std::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; // 3
double pi = 3.14159;
int truncated = (int)pi; // 3

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;
}
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.

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.

  • Chuyển đổi ngầm định xảy ra tự động (ví dụ intdouble), nhưng doubleint sẽ 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ố