Reinterpret_cast là gì

c++ căn bản, chuyển đổi dữ liệu, ép kiểu dữ liệu, học lập trình c++, kỹ thuật lập trình c++, type casting 5 min read

Chào mừng các bạn đến với blog: Phát Triển Phần Mềm 123AZ   

Bài học ngày hôm nay trong chủ đề học lập trình c++ đó là chúng ta sẽ cùng tìm hiểu về

Kỹ thuật Chuyển đổi dữ liệu trong c++.

Thông thường việc ép kiểu dữ liệu với các kiểu dữ liệu thuần túy được xảy một cách ngầm định,

hoặc đơn chỉ là việc sử dụng cú pháp cơ bản.   a = (dữ liệu a) b.

Tuy nhiên khi phát triển các dự án phần mềm có quy mô lớn,

kỹ thuật lập trình phức tạp với mô hình hướng đối tượng, sử dụng các lớp, đối tượng, cấu trúc dữ liệu.

Thì việc áp dụng các phương pháp ép kiểu dữ liệu thông thường không thể đáp ứng được.

Và do đó người ta xây dựng lên một số kỹ thuật ép kiểu dữ liệu được thể hiện như dưới đây.

1. Chuyển đổi dữ liệu với : Dynamic cast.

Phương pháp này chỉ được sử dụng cho các đối tượng loại con trỏ và đối tượng tham chiếu (&),

nhằm đảm bảo tính hợp lệ cho kết quả của chuyển đổi.

Dynamic cast chỉ được sử dụng để chuyển đổi từ một class kế thừa đến một lớp base.(từ lớp con về lớp cha)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

 

 

class CBase

{

    int a;

};

 

class CDerived : public CBase

{

    int d;

};

 

void ConvertData()

{

    CBase b;

    CBase* pb;

    CDerived d;

    CDerived* pd;

 

    pb = dynamic_cast<CBase*>(&d);  // Correct

    //pd = dynamic_cast<CDerived*>(&b); // Incorrect

}

 

 

 

Trong hình minh họa trên.

Điều kiện 2 chỉ có thể xảy ra được khi lớp cha là một class có tính đa hình.

 

2. Chuyển đổi dữ liệu với : Static cast.

– Static cast là kỹ thuật giải quyết được hạn chế của dynamic cast.

– Nó cho phép chúng ta chuyển đổi dữ liệu từ một lớp cha đến lớp con.

– Bên cạnh đó, static cast cũng được sử dụng để chuyển đổi giữa các kiểu dữ liệu thuần túy với nhau.

Ví dụ:

double d=3.14159265;

int i = static_cast<int>(d);

3. Chuyển đổi dữ liệu với : Reinterpret cast.

– Cho phép chuyển đổi con trỏ của một lớp bất kỳ sang một lớp bất kỳ khác.

Điều đó có nghĩa là reinterpret rất linh hoạt.

class A {};

class B {};

A * a = new A;

B * b = reinterpret_cast<B*>(a);

4. Ép kiểu dữ liệu với : Const cast.

– Cho phép chuyển đổi dữ liệu từ dạng hằng số về kiểu dữ liệu bình thường.

int main ()

{

  const char * c = “sample text”;

  st::cout <<const_cast<char *> (c);

  return 0;

}

5. Sử dụng : Typeid.

Là một phương thức để kiểm tra một đối tượng thực thi xem chúng có kiểu dữ liệu là kiểu gì.

Kết luận

Type Casting được sử dụng rộng rãi phổ biến trong các dự án phần mềm

đặc biệt là các dự án phần mềm với ngôn ngữ lập trình C++.

Thư viện MFC có rất nhiều các class có mối quan hệ phức tạp với nhau.

Và do đó việc sử dụng type casting để chuyển đổi phù hợp giữa các đối tượng của các lớp khác nhau là vô cùng cần thiết.