Рубрики

reinterpret_cast в C ++ | Операторы типа Cast

reinterpret_cast — это тип оператора приведения, используемый в C ++.

  • Он используется для преобразования одного указателя в другой указатель любого типа, независимо от того, связан класс или нет.
  • Он не проверяет, совпадают ли тип указателя и данные, на которые указывает указатель.

Синтаксис:

data_type *var_name = 
       reinterpret_cast <data_type *>(pointer_variable);

Тип возврата

  • У него нет типа возврата. Он просто преобразует тип указателя.

параметры

  • Он принимает только один параметр, т. Е. Переменную указателя источника (p в приведенном выше примере).

// Программа CPP для демонстрации работы
// reinterpret_cast
#include <iostream>

using namespace std;

  

int main()

{

    int* p = new int(65);

    char* ch = reinterpret_cast<char*>(p);

    cout << *p << endl;

    cout << *ch << endl;

    cout << p << endl;

    cout << ch << endl;

    return 0;

}

Выход:

65
A
0x1609c20
A

Цель использования reinterpret_cast

  1. reinterpret_cast — это особый и опасный тип оператора приведения. И предлагается использовать его, используя правильный тип данных, т. Е. (Тип данных указателя должен быть таким же, как и исходный тип данных).
  2. Он может типизировать любой указатель на любой другой тип данных.
  3. Используется, когда мы хотим работать с битами.
  4. Если мы используем этот тип приведения, он становится непереносимым продуктом. Таким образом, предлагается не использовать эту концепцию без необходимости.
  5. Он используется только для типизации любого указателя на его исходный тип.
  6. Логическое значение будет преобразовано в целочисленное значение, т. Е. 0 для false и 1 для true.

// код CPP для иллюстрации использования структуры
#include <bits/stdc++.h>

using namespace std;

  
// создание структуры mystruct

struct mystruct {

    int x;

    int y;

    char c;

    bool b;

};

  

int main()

{

    mystruct s;

  

    // Назначение значений

    s.x = 5;

    s.y = 10;

    s.c = 'a';

    s.b = true;

  

    // тип данных должен быть одинаковым во время приведения

    // как оригинал

  

    // преобразование указателя 's' в,

    // указатель типа int в 'p'.

    int* p = reinterpret_cast<int*>(&s);

  

    cout << sizeof(s) << endl;

  

    // печать значения, на которое в данный момент указывает * p

    cout << *p << endl;

  

    // увеличиваем указатель на 1

    p++;

  

    // печать следующего целочисленного значения

    cout << *p << endl;

  

    p++;

  

    // мы отбрасываем назад символ * указал

    // по p, используя char * ch.

    char* ch = reinterpret_cast<char*>(p);

  

    // печать значения символа

    // указано (* ch)

    cout << *ch << endl;

  

    ch++;

  

    / * так как, (* ch) теперь указывает на логическое значение,

    поэтому требуется доступ к значению с помощью

    тот же тип преобразования. поэтому мы использовали

    тип данных * n будет bool. * /

  

    bool* n = reinterpret_cast<bool*>(ch);

    cout << *n << endl;

  

    // мы также можем использовать эту строку кода для

    // выводим значение, обозначенное (* ch).

    cout << *(reinterpret_cast<bool*>(ch));

  

    return 0;

}

Выход:

12
5
10
a
1
1

Программа 2

// код CPP для иллюстрации переинтерпретации указателя
#include <iostream>

using namespace std;

  

class A {

public:

    void fun_a()

    {

        cout << " In class A\n";

    }

};

  

class B {

public:

    void fun_b()

    {

        cout << " In class B\n";

    }

};

  

int main()

{

    // создаем объект класса B

    B* x = new B();

  

    // преобразование указателя на объект

    // ссылка класса B на класс A

    A* new_a = reinterpret_cast<A*>(x);

  

    // доступ к функции класса A

    new_a->fun_a();

    return 0;

}

Выход:

In class A

Ссылка по теме:
http://espressocode.top/casting-operators-in-c-set-1-const_cast/
https://stackoverflow.com/questions/573294/when-to-use-reinterpret-cast ”rel =” noopener ”target =» _ blank
http://forums.codeguru.com/showthread.php?482227-reinterpret_cast-lt-gt-and-where-can-it-be-used
https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.cbclx01/keyword_reinterpret_cast.htm
https://stackoverflow.com/questions/573294/when-to-use-reinterpret-cast

Рекомендуемые посты:

reinterpret_cast в C ++ | Операторы типа Cast

0.00 (0%) 0 votes