Chuyển tới nội dung chính

Chuyển đổi kiểu (Type conversion)

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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);
  7. 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);
  8. 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*.
  9. 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.
  10. 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.
  11. 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.
  12. 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.
  13. Integral Promotion
    • Tự động chuyển đổi từ kiểu số nguyên có kích thước nhỏ hơn (char, short) sang int 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.
  14. 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.
  15. 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;
  16. 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.