C++ | Ép kiểu dữ liệu

Lập trình C++ cơ bản, nâng cao

Ép kiểu dữ liệu (type casting) trong C++ là quá trình chuyển đổi một biến từ kiểu dữ liệu này sang kiểu dữ liệu khác. Có hai loại ép kiểu dữ liệu chính trong C++:

  1. Ép kiểu ngầm định (Implicit Type Casting): Là quá trình chuyển đổi tự động do trình biên dịch thực hiện mà không cần sự can thiệp của lập trình viên. Điều này thường xảy ra khi một biểu thức chứa các toán hạng có kiểu dữ liệu khác nhau, và trình biên dịch sẽ chuyển đổi kiểu dữ liệu của một toán hạng nào đó để chúng phù hợp với nhau.
    int a = 5;
    double b = 6.2;
    double c = a + b;  // 'a' được tự động chuyển thành kiểu double trước khi thực hiện phép cộng
    
  2. Ép kiểu tường minh (Explicit Type Casting): Là quá trình ép kiểu do lập trình viên thực hiện bằng cách sử dụng các toán tử hoặc hàm để chuyển đổi kiểu dữ liệu một cách rõ ràng.

    C++ cung cấp bốn loại ép kiểu tường minh chính:

    • C-style cast: Sử dụng cú pháp (new_type)expression.
    • int a = 5;
      double b = (double)a;  // Ép kiểu a từ int sang double
      
    • static_cast: Dùng để ép kiểu khi có sự chuyển đổi rõ ràng và an toàn giữa các kiểu dữ liệu tương thích.
    • int a = 5;
      double b = static_cast<double>(a);  // Ép kiểu a từ int sang double
      
    • dynamic_cast: Dùng để ép kiểu đối tượng khi có sự chuyển đổi giữa các lớp có quan hệ kế thừa. Nó kiểm tra sự hợp lệ của ép kiểu tại thời điểm chạy (runtime).
    • class Base {
        virtual void foo() {}
      };
      
      class Derived : public Base {
      };
      
      Base* base = new Derived;
      Derived* derived = dynamic_cast<Derived*>(base);  // Ép kiểu base từ Base* sang Derived*
      
    • const_cast: Dùng để thêm hoặc loại bỏ thuộc tính const của biến.

    • const int a = 5;
      int* b = const_cast<int*>(&a);  // Loại bỏ const từ a
      
    • reinterpret_cast: Dùng để ép kiểu một cách thô bạo giữa các con trỏ hoặc giữa các kiểu không tương thích. Việc sử dụng nó có thể dẫn đến kết quả không lường trước và không nên dùng trừ khi thật sự cần thiết.
    • int a = 5;
      void* ptr = reinterpret_cast<void*>(&a);  // Ép kiểu a từ int* sang void*
      

Việc sử dụng ép kiểu cần phải được thực hiện cẩn thận để tránh các lỗi không mong muốn và đảm bảo tính đúng đắn của chương trình.

Nhận xét

Mới hơn Cũ hơn